Pertanyaan cepat - Saya menjalankan dua kotak linux, satu desktop saya sendiri dan yang lainnya VPS saya. Untuk alasan keamanan pada ujung VPS saya memilih koneksi soket ke MySQL ( /var/run/mysqld/mysql.sock
). Saya tahu saya bisa membuat terowongan seperti ini: ssh -L 3307:127.0.0.1:3306 [email protected]
jika saya mengatur server sql jarak jauh untuk mendengarkan pada beberapa port, tetapi yang ingin saya ketahui adalah dapatkah saya melakukan sesuatu seperti: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sock
dengan demikian tunneling dua soket, sebagai lawan dari dua port?
Solusi yang bisa diterima juga adalah meneruskan port lokal ke file socket jarak jauh, tetapi jika memungkinkan saya berusaha untuk tidak menjalankan server tcp pada kotak remote.
(dan ya, saya tahu tcp akan lebih mudah).
Jawaban:
Teruskan soket lokal sesuai permintaan
socat
di kedua ujungnyakemudian
dicuri dari meneruskan soket domain unix dengan ssh dan socat
sumber
Meskipun pada saat itu, ketika pertanyaan diajukan, itu benar-benar tidak mungkin, tetapi sekarang mungkin.
Anda bisa ke keduanya: penerusan UNIX => TCP dan UNIX => UNIX.
Sebagai contoh:
Hal ini dimungkinkan sejak OpenSSH 6.7.
sumber
ssh -L /home/user/docker.sock:/var/run/docker.sock dockerhost -N
saya belum melakukan ini, tetapi saya akan mencoba dengan socat . mungkin sesuatu seperti:
lagi, saya belum pernah melakukan hal seperti ini.
sumber
Tidak perlu lagi socat sejak ssh 6.7. Anda dapat meneruskan soket domain unix secara langsung seperti:
Info lebih lanjut: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160
sumber
Modifikasi lain dari jawaban @mpontes '/ @ javier itu
Pembersih
PROS
Fitur
-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
-f
opsi ssh, karena Anda akan kehilangan pid ssh seperti itu. Metode ini bergantung pada berjalan di latar depan dan Ctrl + C untuk membunuh.Penjelasan
socat ...&
- jalankan socat di latar belakang pada server jauhpid=$!
- simpan pidtrap kill\ $pid 0
- Jalankankill $pid
di bash terminationwhile :; sleep...
- Duduk dalam lingkaran yang tak terbatasecho -ne \ \b
- Ruang gema diikuti oleh backspace. Ini gagal segera setelah ssh terputus. Dengan asleep 5
, ini artinyasocat
dapat berjalan hingga 5 detik setelah sshCatatan: Sebenarnya diuji menggunakan docker, pelabuhan
2375
,/var/run/docker.sock
dan variabel lingkunganDOCKER_HOST='tcp://localhost:2375'
, tetapi harus bekerja untuk mysql semua samaMemperbarui
Menggunakan Kontrol SSH , Anda dapat menggunakan
-f
flag menggunakan cara saya, cukup tambahkan flag berikutDan Anda akan mendapatkannya
Sekarang Anda dapat menghentikan semua sesi terkontrol menggunakan
The
-o
pilihan dapat disimpan dalam Anda.ssh/config
file, atau Anda dapat menggunakan -S bukan (tapi Anda akan masih perlu-o ControlMaster
)sumber
docker run ... connect.sh
untuk mengatur terowongan diikuti olehdocker run ... deploy.sh
. Saya mencobanohup
,,&
dandisown
tetapi mereka tampaknya pecahsocat
dengan menutupstdout
dan memicukill
. Adakah ide untuk tweak untuk mendukung kasus ini (yaitu masih dekat ketika SSH tidak tetapi bertahan dari penolakan)?-f
dan& disown
) di terminal. Rupanya masalah ini dibuat oleh skrip "wrapper". Saya akan menyambut masukan tetapi saya melihat T&J yang lebih tepat sekarang.docker run ... connect.sh
, dandocker exec {container name/id} deploy.sh
mereka bermain bersama.exec
sudahrun
ada dan pipa SSH tidak bertahan setelahexec
berakhir. Saya mengklarifikasi bahwa itu disebabkan oleh kekhasan dengan cara skrip dieksekusi. Jika saya memindahkan panggilan ke skripnya sendiri dan meneleponnohup <script.sh> & disown
, ia akan bertahan setelah selesaiexec
.Menguraikan jawaban Javier, ini bekerja untuk saya:
ssh -f [email protected] -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"
Anda perlu
fork
untuk dapat terhubung beberapa kali tanpa sekarat begitu Anda menutup koneksi pertama. Juga, cara socat memungkinkan Anda menentukan alamat yang akan diikat adalah melaluibind
opsi, bukan sebagai alamat sebelum port.Setelah ini, cukup sambungkan ke
localhost:9999
normal seperti yang Anda inginkan. Kemudian untuk merobohkan terowongan:ssh -f [email protected] "killall socat"
(atau yang serupa, Anda dapat melakukan lebih banyak hal rumit yang melibatkan menjaga PID socat)
sumber
Ya, Anda bisa menggunakan socat.
Pertama lakukan tunnel TCP dengan SSH. Kemudian gunakan socat seperti ini:
socat unix-listen: /var/run/mysqld/mysqld.sock,fork,unlink-early tcp: 127.0.0.1: 3306
Kemudian berikan izin ke soket baru yang dibuat (chmod 777 mungkin)
sumber
chmod 777
: nonononono! Tidak pernah larichmod 777
. Praktis tidak pernah diperlukan! Bahkan untuk "tujuan pengujian". Jika file dapat dibaca, maka itu dapat dibaca. Jika itu dapat ditulisi olehuser
ataugroup
yang perlu ditulisi, maka itu dapat ditulisi. Sama sekali tidak perlu memberi semua orang izin menulis, dan lupachmod
mengembalikannya ke sesuatu yang waras adalah cara perusahaan multinasional diretas. Tapi jangan lakukan itu. Pernah. Saya menulis pengantar izin Unix . Silakan baca!