Modifikasi lain dari jawaban @mpontes '/ @ javier itu
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'
Pembersih
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
- Bekerja pada openssh lebih awal dari 6,7 (seperti CentOS 7)
- Membunuh socat pada ssh terminasi alih-alih harus ssh kembali ke server jauh
- Mengizinkan masuk ssh non-publik (tidak seperti solusi ijk)
Fitur
- Karena
-f
opsi ini tidak digunakan, Anda bisa menggunakan kunci publik dan menjalankan di latar belakang melalui &
atau Anda bisa masuk secara interaktif dan menggunakan Ctrl + Z dan menggunakan yang sama $!
untuk menyimpan pid.
Kon
- Tidak dapat dengan mudah menggunakan
-f
opsi ssh, karena Anda akan kehilangan pid ssh seperti itu. Metode ini bergantung pada berjalan di latar depan dan Ctrl + C untuk membunuh.
- Jauh lebih rumit
Penjelasan
socat ...&
- jalankan socat di latar belakang pada server jauh
pid=$!
- simpan pid
trap kill\ $pid 0
- Jalankan kill $pid
di bash termination
while :; sleep...
- Duduk dalam lingkaran yang tak terbatas
echo -ne \ \b
- Ruang gema diikuti oleh backspace. Ini gagal segera setelah ssh terputus. Dengan a sleep 5
, ini artinya socat
dapat berjalan hingga 5 detik setelah ssh
Catatan: Sebenarnya diuji menggunakan docker, pelabuhan 2375
, /var/run/docker.sock
dan variabel lingkungan DOCKER_HOST='tcp://localhost:2375'
, tetapi harus bekerja untuk mysql semua sama
Memperbarui
Menggunakan Kontrol SSH , Anda dapat menggunakan -f
flag menggunakan cara saya, cukup tambahkan flag berikut
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
Dan Anda akan mendapatkannya
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'
Sekarang Anda dapat menghentikan semua sesi terkontrol menggunakan
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
The -o
pilihan dapat disimpan dalam Anda .ssh/config
file, atau Anda dapat menggunakan -S bukan (tapi Anda akan masih perlu -o ControlMaster
)