Bagaimana mengelola terowongan sebagai proses latar belakang dari skrip shell?

19

Saya perlu mengatur beberapa ssh-tunnels dari skrip shell. Saya sudah mencoba menjalankannya sebagai tugas bg menggunakan:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

tetapi terowongan tampaknya tidak berfungsi dengan benar ketika saya meluncurkannya seperti itu.

Mereka bekerja dengan baik ketika saya secara manual mengaturnya di tab mereka sendiri, jadi ide saya berikutnya adalah membuat skrip membuka tab baru di Terminal dan menjalankan perintah di sana sebagai proses foreground.

Catatan: pertanyaan ini awalnya "Bagaimana cara meluncurkan tab terminal baru dari shell dan kemudian menjalankan perintah di dalamnya?", Tapi saya mendapat dua jawaban tentang berurusan dengan terowongan. Untuk pertanyaan "opening a shell", saya menemukan ini di SuperUser , yang akan berfungsi, meskipun tab baru di latar belakang lebih disukai daripada jendela latar depan yang dibuka.

Sprugman
sumber
Apakah Anda menyimpan sesi SSH aktif ke server? Artinya, apakah Anda memiliki terowongan di latar belakang, dan sesi SSH latar depan tempat Anda bekerja?
Jack M.
Sampai sekarang, saya telah membuka tiga tab: satu untuk setiap terowongan, ditambah satu lagi untuk apa pun. Sebagian besar pekerjaan saya yang sebenarnya terjadi di Eclipse dan browser.
sprugman
(Terowongan hanya supaya saya dapat mengakses beberapa dbs jarak jauh dari instance Tomcat lokal saya.)
sprugman

Jawaban:

26

Secara teknis ini bukan jawaban untuk pertanyaan yang diajukan, melainkan jawaban untuk masalah Anda seperti yang dijelaskan. Perintah ssh memiliki dua sakelar yang mungkin berguna bagi Anda:

ssh -f -N -L 3000:server1:5029 me@server2

memberitahu ssh untuk berkeliaran di latar hanya cukup lama untuk meminta kata sandi yang diperlukan, dan kemudian menempatkan dirinya di latar belakang, tidak menjalankan perintah remote tetapi hanya menangani terowongan.

Jika Anda benar-benar ingin ini muncul di tab maka Anda mungkin menginginkan solusi yang berbeda.

zzz
sumber
Saya mengatur kunci, jadi saya tidak perlu memasukkan kata sandi, tetapi sepertinya berhasil. Terima kasih! Satu pertanyaan: bagaimana cara mengakses terowongan untuk melihat apakah mereka telah kehabisan waktu, atau untuk mengakhirinya, dll.? Mereka jobsjuga tidak psmencantumkan pegangan untuk mereka ....
sprugman
2
ps -wwajx | grep ssh harus memperlihatkan prosesnya kepada Anda, lalu Anda dapat membunuhnya sesuai keinginan Anda.
zzz
2
Saya ingin menambahkan bahwa jika Anda menghilangkan -fdan latar belakang proses melalui &pada akhirnya, Anda bisa mendapatkan PID melalui $!sebagai pegangan untuk membunuh proses terowongan nanti dalam skrip Anda.
bk138
6

Saya sarankan hanya mengintegrasikan terowongan Anda ke koneksi "satu untuk apa pun". Anda dapat membuatnya mudah dengan menambahkan entri yang sesuai ke ~/.ssh/configfile Anda :

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

Anda bisa masuk dengan menjalankan:

> ssh server2

Terowongan harus muncul dan mulai bekerja, meninggalkan Anda dengan contoh SSH tunggal untuk melakukan "apa pun". Jika Anda perlu membuka koneksi kedua server2, Anda mungkin mendapatkan kesalahan, meskipun:

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

Ini tidak menyakiti apa pun selain matamu. Anda juga dapat mengatur maju ini untuk beberapa server dengan menambahkan baris yang sama untuk server lain, dan itu semua akan terjadi secara otomatis.

Jack M.
sumber
@ zzz's jawaban tampaknya melakukan hal yang sama, lebih atau kurang, dan sedikit lebih mudah. Terimakasih Meskipun.
sprugman
Ini, dikombinasikan dengan opsi -f -N adalah cara terbaik untuk mengatur penerusan beberapa port dalam satu kesempatan. Terima kasih sobat.
narsk