임시 SSH 터널을 설정하는 Bash 스크립트
Cygwin에서 Bash 스크립트는 다음과 같습니다.
- 리모트 서버에 대한 SSH 터널을 만듭니다.
- 터널을 사용하는 로컬 작업을 수행합니다.
- 그럼 터널을 폐쇄해
셧다운 부분이 너무 당황스러워요.
현재, 저는 어설픈 해결책을 가지고 있습니다.하나의 셸에서 다음 작업을 수행하여 터널을 만듭니다.
# 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 프록시를 통과합니다.
자세한 내용은 다음과 같습니다.
참조:
- https://remmina.org/remmina-rdp-ssh-tunnel/
- https://kgibran.wordpress.com/2019/03/13/remmina-rdp-ssh-tunnel-with-pre-and-post-scripts/
- 임시 SSH 터널을 설정하는 Bash 스크립트
- https://gist.github.com/oneohthree/f528c7ae1e701ad990e6
언급URL : https://stackoverflow.com/questions/2241063/bash-script-to-set-up-a-temporary-ssh-tunnel
'programing' 카테고리의 다른 글
| 명령줄에서 SQLCMD의 "해당 x 행"을 억제하는 방법이 있습니까? (0) | 2023.04.19 |
|---|---|
| 탐색 모음에서 '뒤로' 버튼을 눌렀을 때 감지 (0) | 2023.04.19 |
| DataGridTextColumn에 툴팁을 추가하는 방법 (0) | 2023.04.14 |
| 치명적인 오류: Visual Studio에서 "대상 아키텍처 없음" (0) | 2023.04.14 |
| 항목이 변경될 때 관찰 가능한 수집 알림 (0) | 2023.04.14 |