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
-fopsi 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
-fopsi 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 $piddi 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 socatdapat berjalan hingga 5 detik setelah ssh
Catatan: Sebenarnya diuji menggunakan docker, pelabuhan 2375, /var/run/docker.sockdan variabel lingkungan DOCKER_HOST='tcp://localhost:2375', tetapi harus bekerja untuk mysql semua sama
Memperbarui
Menggunakan Kontrol SSH , Anda dapat menggunakan -fflag 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 -opilihan dapat disimpan dalam Anda .ssh/configfile, atau Anda dapat menggunakan -S bukan (tapi Anda akan masih perlu -o ControlMaster)