Di Cygwin, saya ingin skrip Bash:
- Buat terowongan SSH ke server jauh.
- Lakukan beberapa pekerjaan secara lokal yang menggunakan terowongan.
- Lalu matikan terowongan.
Bagian shutdown membuat saya bingung.
Saat ini, saya punya solusi lumpuh. Dalam satu shell saya menjalankan yang berikut ini untuk membuat terowongan:
# Create the tunnel - this works! It runs forever, until the shell is quit.
ssh -nNT -L 50000:localhost:3306 jm@sampledomain.com
Kemudian, di jendela shell lain, saya melakukan pekerjaan saya:
# Do some MySQL stuff over local port 50000 (which goes to remote port 3306)
Akhirnya, ketika saya selesai, saya menutup jendela shell pertama untuk membunuh terowongan.
Saya ingin melakukan ini semua dalam satu skrip seperti:
# Create tunnel
# Do work
# Kill tunnel
Bagaimana cara melacak proses terowongan, jadi saya tahu yang harus dibunuh?
Jawaban:
Anda dapat melakukan ini dengan bersih dengan ssh 'control socket'. Untuk berbicara dengan proses SSH yang sudah berjalan dan mendapatkannya pid, bunuh itu dll. Gunakan 'control socket' (-M untuk master dan -S untuk socket) sebagai berikut:
Perhatikan bahwa my-ctrl-socket akan menjadi file aktual yang dibuat.
Saya mendapat info ini dari balasan yang sangat RTFM di milis OpenSSH .
sumber
Operation not permitted
lingkungan integrasi berkesinambungan drone.io:muxserver_listen: link mux listener ssh-ctrl-socket.wsASkszgSBlK7kqD => ssh-ctrl-socket: Operation not permitted
my-ctrl-socket
file setelah ini dijalankan? Ketika saya melakukannyals -la
di folder saat ini saya tidak dapat melihat file lagi.while [ ! -e $ctrl_socket ]; do sleep 0.1; done
open failed: administratively prohibited: open failed
dan saya tidak berpikir itu membuka terowonganAnda dapat memberitahu SSH untuk melatarbelakanginya sendiri dengan opsi -f tetapi Anda tidak akan mendapatkan PID dengan $ !. Juga alih-alih membuat skrip Anda tidur dalam jumlah waktu yang sewenang-wenang sebelum Anda menggunakan terowongan, Anda dapat menggunakan -o ExitOnForwardFailure = ya dengan -f dan SSH akan menunggu semua port jarak jauh ke depan berhasil dibuat sebelum menempatkan dirinya di latar belakang. Anda dapat menangkap output ps untuk mendapatkan PID. Misalnya bisa Anda gunakan
dan pastikan Anda mendapatkan PID yang diinginkan
sumber
ssh
untuk pergi ke latar belakang dengan&
dan tidak membuat shell di sisi lain (cukup buka terowongan) dengan bendera command line (saya melihat Anda sudah melakukan ini dengan-N
).PID=$!
kill $PID
EDIT: Fixed $? ke $! dan menambahkan &
sumber
trap 'kill $PID' 1 2 15
akan mencakup banyak kasus kegagalan skrip.trap "kill $PID"
, karena bash hanya akan menginterpolasi variabel di dalam string yang dikutip gandaPID
variabelnya didefinisikan ulang nanti. Variabel diperluas ketikatrap
built-in disebut (pendekatan OP) atau ketika sinyal ditangkap (pendekatan Anda); kedua pendekatan menghasilkan hasil yang sama di sini.Saya lebih suka meluncurkan shell baru untuk tugas yang terpisah dan saya sering menggunakan kombinasi perintah berikut:
atau terkadang:
Perintah-perintah ini membuat shell bersarang di mana saya bisa melakukan semua pekerjaan saya; ketika saya selesai saya menekan CTRL-D dan shell induk membersihkan dan keluar juga. Anda dapat dengan mudah melempar
bash;
ke skrip terowongan ssh Anda tepat sebelumkill
bagian sehingga ketika Anda keluar dari cangkang bersarang, terowongan Anda akan ditutup:sumber
Anda bisa meluncurkan
ssh
dengan a&
the end, untuk meletakkannya di latar belakang dan ambil id saat melakukannya. Maka Anda hanya perlu melakukankill
id itu ketika Anda selesai.sumber
Opsi potensial lain - jika Anda dapat menginstal paket yang diharapkan, Anda harus dapat menulis semuanya. Beberapa contoh bagus di sini: http://en.wikipedia.org/wiki/Expect
sumber