Apa opsi yang sesuai .ssh / config untuk ssh -N


13

Saya ingin mengatur alias di file config saya yang memiliki hasil yang sama dengan perintah ini:

ssh -N devdb -L 1234:127.0.0.1:1234

Entri .ssh / config saya untuk devdb:

Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234

Apa yang saya masukkan dalam konfigurasi di atas untuk tidak memulai shell?


1 untuk pertanyaan bagus yang membuat saya berpikir tentang cara membuat tunneling ke hal-hal acak lebih cepat (saya tidak cukup sering mengingat switch, tetapi saya biasanya menggunakan port yang sama, hanya host yang berubah).
WEBjuju

Jawaban:


22

Jadi ssh.cuntuk OpenSSH 7.6p1 kami temukan

            case 'N':
                    no_shell_flag = 1;
                    options.request_tty = REQUEST_TTY_NO;

begitu -Npula dua hal:

  • yang no_shell_flaghanya muncul di ssh.cdan hanya diaktifkan untuk -Watau -Npilihan, jika tidak muncul dalam beberapa blok logika yang berkaitan dengan ControlPersistdan memeriksa kewarasan melibatkan garpu latar belakang. Saya tidak melihat cara opsi bisa langsung mengaturnya.
  • menurut readconf.cpara request_ttyberkorespondensi dengan RequestTTYpilihan rinci dalam ssh_config(5).

Ini meninggalkan (selain dari monyet menambal OpenSSH dan mengkompilasi ulang, atau meminta ssh_configopsi untuk beralih no_shell_flagdengan ...) sesuatu seperti:

Host devdb
 User someuser
 HostName the_hostname
 LocalForward 1234 127.0.0.1:1234
 RequestTTY no
 RemoteCommand cat

Yang secara teknis memulai shell tetapi shell itu harus segera mengganti dirinya dengan catprogram yang kemudian harus memblokir memungkinkan port forward untuk digunakan sementara itu. catportabel, tetapi akan mengkonsumsi input (jika ada) atau bisa gagal (jika input standar ditutup). Pilihan lain adalah menjalankan sesuatu yang hanya menghalangi .


1
+1 untuk melakukannya dalam .ssh/config... dilakukan dengan baik!
WEBjuju

Penelitian yang luar biasa tentang jawaban ini! Terima kasih!
kuning mellow

Saya lebih suka RemoteCommand exec sleep infinity.
thomas

3

@ thrig memiliki jawaban yang tepat berdasarkan keinginan Anda untuk melakukan ini hanya di dalam saja .ssh/config

Seseorang mungkin juga mempertimbangkan untuk menggunakan fungsi dengan standar untuk membuat perintah terowongan lainnya cepat (terutama jika terowongan tidak berubah tetapi hanya host).


sshn() {
  # set your desired host and port forwarding as default
  # and allow them to be passed in if you should need it

  host="${1:-devdb}"
  port="${2:-1234:127.0.0.1:1234}"

  # now all you have to do is `sshn` and it will connect

  echo "executing ssh -N $host -L $port"
  ssh -N "$host" -L "$port"
}

Berikut adalah tiga contoh penggunaannya: tanpa arg, standar yang ditentukan dalam fungsi digunakan:

$ sshn
executing -N devdb -L 1234:127.0.0.1:1234

dengan tunnel default, jalankan di host yang berbeda:

$ sshn host2
executing ssh -N host2 -L 1234:127.0.0.1:1234

dengan kedua default, jalankan satu kali penuh ke host / tunnel baru:

$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345

0

Perintah jarak jauh yang lebih berguna berdasarkan jawaban @ thrig:

Host someHost
Hostname 1.2.3.4
LocalForward 15673 localhost:15672
RequestTTY no
RemoteCommand bash -c 'echo "Listening on port 15673"; read -r -d '' _'

The read -r -d '' _akan memblokir koneksi sampai pengguna pers control+c.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.