2014-09-23 2 views
0

사용자의 쉘 ​​구성 파일에서 (자동 생성 된 별칭 파일에. (실행) 명령을 사용하여) 해킹하는 프로그램이 있는데 문제가 있습니다. 상위 셸에서 명령을 실행하는 방법, 즉 새 셸을 분기하지 않고 명령을 실행하는 방법을 알아 냈습니다.쉘에서 명령을 실행하면 프로그램이 실행됩니다.

"프로그램"을 로그인 및 로그 아웃하지 않고 사용할 수 있도록 별칭 파일을 실행하는 명령 만 실행하면됩니다. 물론 포크 옆의 쉘과 상호 작용하는 또 다른 방법이 있어야합니다.

N.B : 내가 모두 system()execl()를 사용하여 의미 "분기"라고 - 내가 말했듯이, 나는 프로그램이 아니라 그것의 새로운 인스턴스를 호스팅하는 쉘에 명령을 보내려고합니다.

+1

적어도 (적어도 어떤 방법을 모르겠다) 생각하지는 않지만, 이미 생성 된 모든 별칭을 사용하여 프로그램에서 새 셸을 실행하지 않는 이유는 무엇입니까? 'sh'는'your_program && exit'를 실행하고,'your_program'은 필요한 것을 수행하고, 다른'sh'을 실행하여 사용자에게 명령 행을 제공합니다. 끝내면 첫 번째 'sh'도 종료됩니다. – afenster

+0

나에게 어리석은 해결책처럼 보입니다. 내 말은, 실제적으로 말하는 껍질은 일반적으로 많은 자원을 차지하지는 않지만 좋은 이유가 없다면 무기로 포크로 들어가서 사치 스럽다. 그것이 유일한 방법이라면 나는 그것을 고려할 것이다. 감사. – Bridge

+1

일반적으로 자식 프로세스는 부모 프로세스로 하여금 아무 것도 할 수 없습니다. 쉘이 작동하는 방식을 파괴하려고합니다. 그것을 성취 할 수있는 방법이 있을지 모르지만, 그것들은 기껏해야 비틀림을 당하고 아마도 휴대 가능하지 않을 것이며, '현실적'보다 더 '불가능하다'. 당신은 아마도 당신이하려고하는 것을 다시 생각할 필요가있을 것입니다. –

답변

1

유스 케이스에 대해 생각한 후에, 부모 셸에 구성을 다시로드하라는 신호를 보내는 것이 불가능하다고 생각하지만, 여기서는 컨트롤을 되돌릴 수 있습니다.

내가 말하는 것은 부모 껍질을 만드는 방법을 생각하지 말고 직접 해보십시오.

/path/to/program 
. ~/.bashrC# or any other way to reload the shell config 

을하고 그것이 현재 쉘의 컨텍스트에서 실행됩니다 있는지 확인 . wrapper.sh를 사용하여 프로그램을 호출 : 당신이 쉘 구성을 수정하는 프로그램이있는 경우, 그것을 쉘 래퍼를합니다. 이 방법으로 프로그램은 설정을 변경하지만 부모와의 상호 작용에 신경을 쓰지 않을 것이며, 호출 쉘은 프로그램이 끝나면 자동으로 다시로드됩니다.

+0

이것은 실행 가능한 해결책처럼 보입니다. 비록 제가 생각한 정확한 구현이 C 스타일 쉘을 추방 할 것이라고 생각하지만 (코드가 동일하고 공정하기 때문에 잠시 동안은 bash, zsh 및 ksh에만 초점을 맞추기는하지만) 압도적 인 다수의 사용자를 돌 보았습니다.) 어쨌든 고마워요. – Bridge

관련 문제