programing

임시 SSH 터널을 설정하는 Bash 스크립트

golfzon 2023. 4. 19. 23:42
반응형

임시 SSH 터널을 설정하는 Bash 스크립트

Cygwin에서 Bash 스크립트는 다음과 같습니다.

  1. 리모트 서버에 대한 SSH 터널을 만듭니다.
  2. 터널을 사용하는 로컬 작업을 수행합니다.
  3. 그럼 터널을 폐쇄해

셧다운 부분이 너무 당황스러워요.

현재, 저는 어설픈 해결책을 가지고 있습니다.하나의 셸에서 다음 작업을 수행하여 터널을 만듭니다.

# Create the tunnel - this works! It runs forever, until the shell is quit.
ssh -nNT -L 50000:localhost:3306 jm@sampledomain.com

그런 다음 다른 셸 창에서 작업을 수행합니다.

# Do some MySQL stuff over local port 50000 (which goes to remote port 3306)

마지막으로 작업이 끝나면 첫 번째 셸 창을 닫고 터널을 종료합니다.

이 모든 작업을 하나의 스크립트로 수행하고 싶습니다.

# Create tunnel
# Do work
# Kill tunnel

어떻게 터널 프로세스를 추적하면 어떤 것을 죽일지 알 수 있을까요?

SSH '컨트롤 소켓'을 사용하면 깔끔하게 이 작업을 수행할 수 있습니다.이미 실행 중인 SSH 프로세스와 통신하여 pid를 얻으려면 종료하는 등.다음과 같이 '컨트롤 소켓'(마스터의 경우 M, 소켓의 경우 -S)을 사용합니다.

$ ssh -M -S my-ctrl-socket -fNT -L 50000:localhost:3306 jm@sampledomain.com
$ ssh -S my-ctrl-socket -O check jm@sampledomain.com
Master running (pid=3517) 
$ ssh -S my-ctrl-socket -O exit jm@sampledomain.com
Exit request sent. 

my-ctrl-socket은 실제로 작성된 파일입니다.

이 정보는 OpenSSH 메일링 리스트의 매우 RTFM 회신에서 얻은 것입니다.

-f 옵션을 사용하여 SSH에 백그라운드를 지시할 수 있지만 $!의 PID는 얻을 수 없습니다.또한 터널을 사용하기 전에 스크립트를 임의의 시간 동안 sleep 상태로 두는 대신 -f와 함께 -o ExitOnForwardFailure=yes를 사용하면 SSH는 모든 원격 포트가 정상적으로 확립될 때까지 기다렸다가 백그라운드로 이동합니다.ps의 출력을 grep하여 PID를 얻을 수 있습니다.예를 들어,

...
ssh -Cfo ExitOnForwardFailure=yes -N -L 9999:localhost:5900 $REMOTE_HOST
PID=$(pgrep -f 'N -L 9999:')
[ "$PID" ] || exit 1
...

원하는 PID를 얻을 수 있는지 확인합니다.

  • 수 있다ssh&만 하면 ).-N를 참조해 주세요.
  • 를 PID 로 합니다.PID=$!
  • 네 일을 해라
  • kill $PID

편집: $?를 $!로 고정하고 & 를 추가했습니다.

새로운 셸을 개별 태스크용으로 기동하는 것을 선호하며 다음 명령어를 조합하여 사용하는 경우가 많습니다.

  $ sudo bash; exit

또는 다음과 같은 경우가 있습니다.

  $ : > sensitive-temporary-data.txt; bash; rm -f sensitive-temporary-data.txt; exit

이러한 명령어를 사용하면 모든 작업을 수행할 수 있는 중첩된 셸이 생성됩니다.완료 후 CTRL-D 키를 누르면 부모 셸도 정리되고 종료됩니다. 수 요.bash;에 ssh 터널 스크립트로 .kill네스트된 셸에서 로그아웃 했을 때 터널이 닫히도록 합니다.

#!/bin/bash
ssh -nNT ... &
PID=$!
bash
kill $PID

이제 '할 수 요.ssh와 함께&뒤에 붙이고 아이디를 잡으면 끝이에요.그럼 그냥...kill그 아이디를 찾을 수 있습니다.

문제를 해결하기 위한 간단한 bash 스크립트입니다.

# Download then put in $PATH
wget https://raw.githubusercontent.com/ijortengab/bash/master/commands/command-keep-alive.sh
mv command-keep-alive.sh -t /usr/local/bin

# open tunnel, put script in background
command-keep-alive.sh "ssh -fN -o ServerAliveInterval=10 -o ServerAliveCountMax=2 -L 33306:localhost:3306 myserver" /tmp/my.pid &
# do something
mysql --port 33306
# close tunnel
kill $(cat /tmp/my.pid)

https://github.com/aronpc/remina-ssh-tunnel

#!/usr/bin/env sh

scriptname="$(basename $0)"
actionname="$1"
tunnelname=$(echo "$2" | iconv -t ascii//TRANSLIT | sed -E 's/[^a-zA-Z0-9-]+/-/g' | sed -E 's/^-+|-+$//g' | tr A-Z a-z)
remotedata="$3"
tunnelssh="$4"

if [ $# -lt 4 ] 
 then
    echo "Usage: $scriptname start | stop LOCAL_PORT:RDP_IP:RDP_PORT SSH_NODE_IP"
    exit
fi

case "$actionname" in

start)

  echo "Starting tunnel to $tunnelssh"
  ssh -M -S ~/.ssh/sockets/$tunnelname.control -fnNT -L $remotedata $tunnelssh
  ssh -S ~/.ssh/sockets/$tunnelname.control -O check $tunnelssh
  ;;

stop)
  echo "Stopping tunnel to $tunnelssh"
  ssh -S ~/.ssh/sockets/$tunnelname.control -O exit $tunnelssh 
 ;;

*)
  echo "Did not understand your argument, please use start|stop"
  ;;

esac

사용 예

remina 서버 연결을 편집하거나 새로 만듭니다.

스키마

~/.ssh/rdp-tunnel.sh ACTION TUNNELNAME LOCAL_PORT:REMOTE_SERVER:REMOTE_PORT TUNNEL_PROXY

이름. 묘사
액션. 시작|정지하다
터널명 "string identify socket"을 slugify하여 소켓파일을 ~/.disc/string-discl.control로 만듭니다.
로컬 포트 2개의 접속에 같은 포트를 사용하면 로컬로 공개되는 문이 크래시 됩니다.
리모트 서버 사용하는 프록시 서버에 액세스 하는 서버의 IP
리모트_포트 서버상에서 동작하는 서비스 포트
터널_PROXy 프록시로서 사용하는 접속은, 액세스 키를 사용해 ~/.disc/config 에 있을 필요가 있습니다.

remmina 그룹명과 접속명의 조합(% g-% p)을 사용하고, TunnelNAME 이 됩니다(이것은 일의일 필요가 있습니다.소켓명이 표시됩니다).

사전 명령어

~/.ssh/rdp-tunnel.sh start "%g-%p" 63394:192.168.8.176:3389 tunnel-name-1

사후 명령어

~/.ssh/rdp-tunnel.sh stop "%g-%p" 63394:192.168.8.176:3389 tunnel-name-1

이미지

이 스크립트를 사용하여 무엇이든 액세스할 수 있습니다.저는 퍼블릭 IP가 없는 시스템과 서비스에 액세스하기 위해 항상 1,2,3,4,5 또는 그 이상의 ssh 프록시를 통과합니다.

자세한 내용은 다음과 같습니다.

  1. ssh 설정
  2. ssh 마하
  3. ssh 점프 호스트
  4. 스슈틀 비단뱀 스슈

참조:

  1. https://remmina.org/remmina-rdp-ssh-tunnel/
  2. https://kgibran.wordpress.com/2019/03/13/remmina-rdp-ssh-tunnel-with-pre-and-post-scripts/
  3. 임시 SSH 터널을 설정하는 Bash 스크립트
  4. https://gist.github.com/oneohthree/f528c7ae1e701ad990e6

언급URL : https://stackoverflow.com/questions/2241063/bash-script-to-set-up-a-temporary-ssh-tunnel

반응형