백그라운드에서 실행 중인 SSH 프로세스의 PID를 가져옵니다.

백그라운드에서 실행 중인 SSH 프로세스의 PID를 가져옵니다.

그래서 두 개의 백그라운드 SSH 프로세스를 호출하고 싶습니다.

ssh -D localhost:8087 -fN aws-gateway-vpc1
ssh -D localhost:8088 -fN aws-gateway-vpc2

이러한 게이트웨이에서는 authenticate_keys 파일을 설정할 수 없으므로 대화형 비밀번호를 묻는 메시지를 표시해야 합니다. 이것이 제가 -fshell 대신 해당 플래그를 사용하는 이유 &입니다. 대화식으로 인증한 후에는 프로세스가 백그라운드에 배치됩니다.

$!이 경우 가장 최근의 [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).

관련 정보