그래서 두 개의 백그라운드 SSH 프로세스를 호출하고 싶습니다.
ssh -D localhost:8087 -fN aws-gateway-vpc1
ssh -D localhost:8088 -fN aws-gateway-vpc2
이러한 게이트웨이에서는 authenticate_keys 파일을 설정할 수 없으므로 대화형 비밀번호를 묻는 메시지를 표시해야 합니다. 이것이 제가 -f
shell 대신 해당 플래그를 사용하는 이유 &
입니다. 대화식으로 인증한 후에는 프로세스가 백그라운드에 배치됩니다.
$!
이 경우 가장 최근의 [self] 백그라운드 프로세스의 pid를 가져오기 위해 bash 변수를 사용할 수 없는 것 같습니다 .
나중에 중단될 경우 올바른 PID를 찾으려면 어떤 다른 옵션이 있어야 합니까?
답변1
grep을 통해 pid를 찾는 것은 오류가 발생할 수 있습니다. 또 다른 옵션은 SSH ControlPath
옵션을 사용하는 것입니다 ControlMaster
. 이를 통해 ssh 명령이 제어 소켓에서 수신 대기하고 후속 ssh 호출의 명령을 기다리도록 할 수 있습니다.
이 시도
ssh -D localhost:8087 -S /tmp/.ssh-aws-gateway-vpc1 -M -fN aws-gateway-vpc1
# (...)
# later, when you want to terminate ssh connection
ssh -S /tmp/.ssh-aws-gateway-vpc1 -O exit aws-gateway-vpc1
이 exit
명령을 사용하면 PID를 모르더라도 프로세스를 종료할 수 있습니다. PID가 정말로 필요한 경우 다음 check
명령을 사용하여 표시할 수 있습니다.
$ ssh -S /tmp/.ssh-aws-gateway-vpc1 -O check aws-gateway-vpc1
Master running (pid=1234)
답변2
말씀하신 것처럼 $!
현재 쉘의 배경이 아니기 때문에 작동하지 않습니다. 실제로 ssh
프로세스는 시작한 셸의 하위 프로세스도 아닙니다. 적어도 내 Arch 시스템에서는 PID 프로세스의 하위 프로세스로 1
실행됩니다 init
.
따라서 PID를 얻으려면 다음을 사용하면 됩니다 ps
.
$ ssh -f localhost sleep 100
$ ps aux | grep '[s]sh.*-f'
terdon 20648 0.0 0.0 43308 680 ? Ss 12:15 0:00 ssh -f localhost sleep 100
이것은 PID가 20648
* 임을 알려줍니다 .
또는 더 간단하게 다음을 사용하십시오 pgrep -f
.
$ pgrep -f 'ssh.*-f'
20648
그리고 (그들을) 죽여라:
pkill -f 'ssh.*-f'
* 바라보다이것[s]
명령의 내용을 알고 싶으면 에 문의하세요 grep
.
답변3
50명의 담당자가 없어서 답변을 드려야 하는데... ssh에 멀티플렉싱 제어를 추가해야 하므로 이 예제는 완전하지 않습니다. Debian에서는 기본적으로 활성화되어 있지 않으므로 ssh_config 파일을 통해 활성화해야 하거나 "-o ControlMaster=yes" 옵션을 사용하여 활성화하는 것이 더 쉽습니다. 이 예제를 시도해 보세요. 모든 SSH에서 작동합니다. example.org에서 포트 3306을 통해 포트 3307의 localhost로 이동합니다. 예제에서는 -O check 명령에도 포트 옵션을 제공해야 하므로 포트 옵션을 추가했습니다.
ssh -p1234 -TqfN -L 3307:localhost:3306 [email protected] -o ControlMaster=yes -o ControlPath=/dev/shm/control:%h:%p:%r -S /dev/shm/control:%h:%p:%r
그런 다음 확인, 종료 등을 사용할 수 있습니다. 이와 같이
ssh -p1234 -o ControlPath=/dev/shm/control:%h:%p:%r -O check [email protected]
기본 스테이션이 실행 중입니다(pid=xxxx).