어떻게 죽일 백그라운드/분리 ssh 세션?
-
10-07-2019 - |
문제
나는 프로그램을 사용하여 시너지 효과 함께 ssh 터널
그것은 작품,나는 그냥을 열려면 콘솔에는 유형을 이 두 가지 명령:
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
synergyc localhost
기 때문에 im 게으른 나는 Bash-스크립트를 실행되는 하나의 마우스 클릭의 아이콘:
#!/bin/bash
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
synergyc localhost
Bash-스크립트가 위의 작품뿐만 아니라,하지만 지금은 나가도 죽이고 싶 시너지 효과 ssh 터널을 통해 하나의 마우스 클릭,그래서 나는 저장하는 Pid 의 시너지 효과 ssh 으로 파일을 죽이 나중에 그들:
#!/bin/bash
mkdir -p /tmp/synergyPIDs || exit 1
rm -f /tmp/synergyPIDs/ssh || exit 1
rm -f /tmp/synergyPIDs/synergy || exit 1
[ ! -e /tmp/synergyPIDs/ssh ] || exit 1
[ ! -e /tmp/synergyPIDs/synergy ] || exit 1
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
echo $! > /tmp/synergyPIDs/ssh
synergyc localhost
echo $! > /tmp/synergyPIDs/synergy
그러나 파일의 이 스크립트가 비어 있습니다.
How do I get Pid ssh 시너지 효과?
(난을 피하려고 ps aux | grep ... | awk ... | sed ...
조합이 쉬운 방법입니다.)
해결책 5
콘솔 윈도가 닫히면 연결이 죽을 때 명령의 끝에 & 명령의 끝에서 추가하고 싶지 않습니다 ... 그래서 나는 PS-Grep-awk-sed-combo로 끝났습니다.
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@otherHost
echo `ps aux | grep -F 'ssh -f -N -L localhost' | grep -v -F 'grep' | awk '{ print $2 }'` > /tmp/synergyPIDs/ssh
synergyc localhost
echo `ps aux | grep -F 'synergyc localhost' | grep -v -F 'grep' | awk '{ print $2 }'` > /tmp/synergyPIDs/synergy
(당신은 grep을 awk에 통합 할 수 있지만 지금은 너무 게으르다)
다른 팁
빠른 요약 : 작동하지 않습니다.
첫 번째 아이디어는 PID를 얻기 위해 백그라운드에서 프로세스를 시작해야한다는 것입니다. $!
.
같은 패턴
some_program &
some_pid=$!
wait $some_pid
필요한 일을 할 수 있습니다 ... 제외하고 SSH는 더 이상 암호를 요청하기 위해 전경에 없을 것입니다.
그렇다면 결국 다른 것이 필요할 수 있습니다. ssh -f
아마도 어쨌든 쉘이 그것을 호출하여 알 수없는 새로운 프로세스를 스폰 할 것입니다. 이상적으로 SSH 자체는 PID를 일부 파일에 작성하는 방법을 제공합니다.
모든 존경하는 사용자의 pgrep
, pkill
, ps | awk
, 등가 많 더 나은 방법입니다.
는 것을 고려에 의존하는 경우 ps -aux | grep ...
를 찾는 프로세스를 실행하의 위험에 충돌이 발생합니다.를 사용하는 경우는 않지만,일반적으로,그것은 방법입니다.
SSH 위한 메커니즘을 제공합 관리하고 통제 배경 처리합니다.하지만 이렇게 많은 SSH 것,그것은"진보된"기능,그리고 많은 사람들이(그것은 보인다,에서 다른 답변 여기)는 그것의 존재입니다.
에 나 자신을 사용하는 경우에,내가 워크스테이션에 집에서 나가 떠나고 싶은 터널 연결하는 HTTP 프록시에서는 내부 네트워크에 사무실이고,또 다른 하나는 저에게 빠르게 액세스를 관리 인터페이스에 위치한 서버에 있습니다.이것은 어떻게 당신이를 만들 수 있습니다 기본적인 터널에서 시작한 가정:
$ ssh -fNT -L8888:proxyhost:8888 -R22222:localhost:22 officefirewall
$ ssh -fNT -L4431:www1:443 -L4432:www2:443 colocatedserver
이러한 원인 ssh 을 배경,그 자체를 떠나 터널이 열려 있습니다.하지만 경우에는 터널을 간다,내가 붙어 있는 경우,그것을 찾으려면,나는가를 분석해 나의 프로세스 목록을 가는데"오른쪽"ssh(경우에는 나는 실수로 시작했는 여러 사람과 비슷).
대신,관리하고 싶으면 여러 개의 연결,사용 SSH 의 ControlMaster
구성 옵션과 함께, -O
명령행에 대한 옵션을 제어합니다.예를 들어,다음에 나 ~/.ssh/config
파일
host officefirewall colocatedserver
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
ssh 위의 명령을 실행하면 떠날 것이 자귀에 ~/.ssh/cm_sockets/
할 수 있는 다음을 제공합 액세스 제어,예를 들어:
$ ssh -O check officefirewall
Master running (pid=23980)
$ ssh -O exit officefirewall
Exit request sent.
$ ssh -O check officefirewall
Control socket connect(/home/ghoti/.ssh/cm_socket/ghoti@192.0.2.5:22): No such file or directory
고 이 시점에서,터널(및 제어 SSH session),갔을 사용할 필요없이 망치(kill
, killall
, pkill
,etc.).
이 다시 사용하여 케이스...
당신이 설정하 터널을 통해할 syngergyc
하게 이야기 syngergys
TCP 포트 12345.이를 위해,나는 뭔가를 다음과 같습니다.
에 추가한 항목을 ~/.ssh/config
파일:
Host otherHosttunnel
HostName otherHost
User otherUser
LocalForward 12345 otherHost:12345
RequestTTY no
ExitOnForwardFailure yes
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
참고 명령줄 -L
옵션으로 처리합니다 LocalForward
키워드 컨트롤{마스터 경로}선이 포함되어 있는지 확인 후 제어 터널은 설치된다.
그런 다음을 수정할 수 있습의 bash 스크립트 무언가 이것을 좋아한다:
#!/bin/bash
if ! ssh -f -N otherHosttunnel; then
echo "ERROR: couldn't start tunnel." >&2
exit 1
else
synergyc localhost
ssh -O exit otherHosttunnel
fi
이 -f
옵션 배경의 터널을 떠나,소켓에 ControlPath 을 닫은 터널니다.는 경우 ssh 실패(수 있는 인해 네트워크가 오류나 ExitOnForwardFailure
),할 필요가 없을 종료,하지만하면 그것은 실패하지 않았(else
),synergyc 은 시작했고 그 다음 터널은 닫힌 후에 종료됩니다.
당신은 수도에서 보고 싶은 여부 SSH 옵션 LocalCommand
사용될 수 있습을 시작 synergyc
오른쪽에서 내 ssh config 파일에 있습니다.
방금이 스레드를 발견하고 "PIDOF"Linux 유틸리티를 언급하고 싶었습니다.
$ pidof init
1
LSOF를 사용하여 LocalHost에서 Port 12345를 듣고있는 프로세스의 PID를 표시 할 수 있습니다.
lsof -t -i @localhost:12345 -sTCP:listen
예 :
PID=$(lsof -t -i @localhost:12345 -sTCP:listen)
lsof -t -i @localhost:12345 -sTCP:listen >/dev/null && echo "Port in use"
당신은 그것을 떨어 뜨릴 수 있습니다 -f
, 배경으로 실행 한 다음 eval
그리고 배경에 직접 강요하십시오.
그런 다음 잡을 수 있습니다 pid
. 넣으십시오 &
내 eval
성명.
eval "ssh -N -L localhost:12345:otherHost:12345 otherUser@OtherHost & "
tunnelpid=$!
이것은 Synergyc (그리고 스스로를 데모하려는 대부분의 다른 프로그램)에게 더 특별한 경우입니다. $ 사용! Synergyc가 실행 중에 클론 () Syscall을 수행하여 Bash가 생각한 것 이외의 새로운 PID를 제공한다는 점을 제외하고는 작동합니다. $!를 사용할 수 있도록 이것을 돌아 다니려면 Synergyc에 포장에 머물러서 배경을 말할 수 있습니다.
synergyc -f -n mydesktop remoteip &
synergypid=$!
Synergyc는 또한 Autorestart와 같은 다른 몇 가지 작업을 수행하여 관리하려는 경우 끄고 싶을 수도 있습니다.
또 다른 옵션은 PGREP를 사용하여 최신 SSH 프로세스의 PID를 찾는 것입니다.
ssh -fNTL 8073:localhost:873 otherUser@OtherHost
tunnelPID=$(pgrep -n -x ssh)
synergyc localhost
kill -HUP $tunnelPID
이 라인을 사용하여 로컬 포트에 묶인 SSH Proceess를 찾을 수 있습니다.
netstat -tpln | grep 127\.0\.0\.1:12345 | awk '{print $7}' | sed 's#/.*##'
LocalHost에서 포트 12345/TCP를 사용하여 프로세스의 PID를 반환합니다. 따라서 모두 필터링 할 필요는 없습니다 ssh
결과 ps
.
확인 해야하는 경우 만약에 해당 포트는 바인딩됩니다.
netstat -tln | grep 127\.0\.0\.1:12345 >/dev/null 2>&1
보고 1
아무것도 묶지 않으면 또는 0
누군가이 항구를 듣고 있다면.
@Ghoti의 좋은 답변을 기반으로, 여기에 더 간단한 스크립트 (테스트 용)가 있습니다. SSH 제어 소켓 추가 구성 필요없이 :
#!/bin/bash
if ssh -fN -MS /tmp/mysocket -L localhost:12345:otherHost:12345 otherUser@otherHost; then
synergyc localhost
ssh -S /tmp/mysocket -O exit otherHost
fi
synergyc
터널이 성공적으로 설립 된 경우에만 시작됩니다. synergyc
보고. 솔루션에는 적절한 오류보고가 부족하지만.