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ż
-fopcja 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ć
-fopcji 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 $pidna 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 5oznacza to, że socatmoże działać do 5 sekund po ssh
Uwaga: Właściwie testowano przy użyciu docker, port 2375, /var/run/docker.sockoraz 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ć -fflagi 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 -oopcje mogą być zapisane w .ssh/configpliku, lub można użyć zamiast -S (ale będziesz nadal potrzeba -o ControlMaster)