문제

나는 프로그램을 사용하여 시너지 효과 함께 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 보고. 솔루션에는 적절한 오류보고가 부족하지만.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top