쉘 스크립트에서 단일 SSH 터널의 프로세스를 확인 하시겠습니까?


0

원격 랩 시스템에는 5 분마다 cron 작업으로 실행되는 기본 점프 박스에 대한 역방향 SSH 터널을 시작하는 쉘 스크립트가 있습니다. SSH 터널이 작동하면 아무 일도 일어나지 않으며, 터널이 다운되면 시작합니다.

#!/bin/bash
createTunnel() {
/usr/bin/ssh -N -R :2222:localhost:22 username@jumpbox.example.com
if [[ $? -eq 0 ]]; then
 echo Tunnel to jumpbox created successfully
else
 echo An error occurred creating a tunnel to jumpbox. RC was $?
fi
}
/bin/pidof ssh
if [[ $? -ne 0 ]]; then
  echo Creating new tunnel connection
  createTunnel
fi

이것은 원격 시스템이 재부팅되거나 점프 상자 IP가 변경 될 때 원격 시스템에 액세스 할 수 있도록 매우 안정적입니다. 그러나 최근에이 시스템에 두 번째 SSH 터널을 추가했으며 두 터널 중 하나가 다운되어 다시 설정되지 않은 상황이있었습니다. 하나의 터널이 있었기 때문에 pidof 출력은 여전히 ​​PID와 함께 반환되므로 스크립트에서 "createTunnel"을 실행하지 않은 것으로 보입니다. SSH 터널이 두 개이므로 pidof 출력에는 두 PID가 모두 표시됩니다.

$ /bin/pidof ssh
28281 28247

터널 중 하나만 다운되었는지 확인하기 위해 스크립트를 어떻게 조정할 수 있습니까?


2
바퀴를 다시 발명했을 수도 있습니다 autossh -f .... 두 개의 연결이 동일한 끝점에 있는지 확실하지 않습니다 username@jumpbox.example.com. 그래서, 하나의 경우 ssh(또는 autossh) 모두 터널을 만들 수 있습니다, 단지 추가 사용 -R또는 -L.
Kamil Maciorowski 님

답변:


2

내 생각:

  1. Pid 파일. 나는 이것이 일반적인 접근법이라고 생각합니다.
  2. XY 문제 는 사용하십시오 autossh.

(다른 아이디어들도 이러한 아이디어를 구체화 할 수 있습니다.)

  1. 두 개의 스크립트가 있습니다. ( DRY 정확히 준수하지 않음 ). 그들에게 다른 이름을 부여하십시오. 스크립트 ssh가 종료 될 때 까지 기다립니다 . 추가 인스턴스는의 pid (s)를 확인하는 대신 ssh자체 이름의 pid를 확인해야합니다. 정확히 하나의 pid 두 pid는 이전 스크립트가 아직 실행되고 있지 않음을 의미합니다.

    [ $(pidof -x scriptname | wc -w) -eq 2 ] && createTunnel

    왜 두? 때문에이 $()또한 계산 서브 쉘을 시작합니다. 아주 더러워.

  2. 상자 밖에서 생각합니다. 다음과 같이 고유 한 이름으로 두 개의 심볼릭 링크를 만듭니다.

    ln -s /usr/bin/ssh ssh-foo
    ln -s /usr/bin/ssh ssh-bar

    첫 번째 스크립트를 실행 ssh-foo하고 두 번째 스크립트를 실행 하십시오 ssh-bar. 이들의 pidof호출은 대상으로해야 ssh-foo또는 ssh-bar각각뿐만 아니라. 이런 식으로 그들은 섞이지 않을 것입니다. 보너스로, 추가 ssh(미래에 완전히 다른 이유로 실행될 수 있음)는 영향을 미치지 않습니다.

그리고 마지막으로:

  1. 아무것도 확인할 필요가 없습니다.

    /usr/bin/ssh -o ExitOnForwardFailure=yes -N -R :2222:localhost:22 username@jumpbox.example.com

    터널이 이미 존재하면 포트 전달이 실패하고 ssh종료됩니다. 나는 당신이 crontab 에서이 줄을 직접 실행할 수 있다고 생각합니다. 스크립트는 필요하지 않습니다.


훌륭 해요, 고맙습니다! 명령에서 "ExitOnForwardFailure = yes"를 사용하여 crontab에서 SSH 터널을 직접 시작합니다. 내가 추가 한 유일한 것은 ">> / dev / null 2> & 1"뿐이며 사용자 사서함이 크론 오류로 채워지지 않도록합니다. /usr/bin/ssh -o ExitOnForwardFailure=yes -N -R :2222:localhost:22 username@jumpbox.example.com >> /dev/null 2>&1
Andrew Plas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.