Kolejna modyfikacja odpowiedzi @mpontes '/ @ javier
ssh user@remoteserver -L 9999:localhost:9999 'socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'
Odkurzacz
ssh user@remoteserver -L 9999:localhost:9999 '
socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock&
pid=$!
trap "kill $pid" 0
while echo -ne " \b"; do
sleep 5
done
'
PROS
- Działa na openssh wcześniejszym niż 6.7 (jak CentOS 7)
- Zabija socat po zakończeniu ssh zamiast konieczności ponownego ssh na zdalnym serwerze
- Umożliwia niepubliczne logowanie ssh (w przeciwieństwie do rozwiązania ijk)
Cecha
- Ponieważ
-f
opcja nie jest używana, możesz albo użyć klucza publicznego i uruchomić się w tle za pośrednictwem, &
albo możesz zalogować się interaktywnie i użyć Ctrl + Z i użyć tego samego $!
do przechowywania pid.
CONS
- Nie można łatwo użyć
-f
opcji ssh, ponieważ w ten sposób stracisz pid ssh. Ta metoda polega na uruchomieniu na pierwszym planie i Ctrl + C, aby zabić.
- O wiele bardziej skomplikowane
Wyjaśnienie
socat ...&
- uruchom socat w tle na zdalnym serwerze
pid=$!
- przechowuj pid
trap kill\ $pid 0
- działa kill $pid
na zakończenie bash
while :; sleep...
- usiądź w nieskończonej pętli
echo -ne \ \b
- Echo, po którym następuje backspace. Nie udaje się to natychmiast po odłączeniu ssh. W przypadku a sleep 5
oznacza to, że socat
może działać do 5 sekund po ssh
Uwaga: Właściwie testowano przy użyciu docker, port 2375
, /var/run/docker.sock
oraz zmienną środowiskową DOCKER_HOST='tcp://localhost:2375'
, ale powinien działać dla mysql wszystko jedno
Aktualizacja
Korzystając z kontrolek SSH , możesz użyć -f
flagi na mój sposób, po prostu dodaj następujące flagi
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
I dostaniesz
ssh -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto user@remoteserver -L 9999:localhost:9999 'set -m; socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'
Teraz możesz zakończyć wszystkie kontrolowane sesje za pomocą
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
Te -o
opcje mogą być zapisane w .ssh/config
pliku, lub można użyć zamiast -S (ale będziesz nadal potrzeba -o ControlMaster
)