Bisakah saya membuat SSH gagal ketika penerusan port gagal?

39

Jika saya melakukan port jarak jauh ke depan, ala -R 3690:localhost:3690ketika ikatan sudah ada di port pada host jarak jauh, saya mendapatkan peringatan ini:

Warning: remote port forwarding failed for listen port 3690

Apakah ada cara untuk memiliki ssh gagal (yaitu keluar dengan kode pengembalian bukan nol), daripada hanya memancarkan peringatan?

Matt Joiner
sumber
Apakah Anda benar-benar perlu membuat saluran terminal juga, atau hanya meneruskan?
Ignacio Vazquez-Abrams
1
@ IgnacioVazquez-Abrams: Hanya penerusannya.
Matt Joiner

Jawaban:

63

Menjalankan

ssh -o "ExitOnForwardFailure yes" ...

atau dimasukkan

ExitOnForwardFailure yes

menjadi ~/.ssh/config. Lihat man ssh_configdetailnya.

Andrew Schulman
sumber
Sayangnya saya memiliki OpenSSH 4. Bisakah Anda memberi tahu saya ketika fitur ini ditambahkan?
Matt Joiner
2
Tidak, saya tidak tahu itu. Ini mungkin fitur versi 5. Tetapi versi 4 harus berumur bertahun-tahun sekarang, dan ada perbaikan keamanan sepanjang waktu. Jika Anda tidak dapat memutakhirkan server sendiri, Anda mungkin ingin bertanya kepada admin server Anda apakah menurutnya aman untuk tetap menggunakan versi itu.
Andrew Schulman
Ketahuilah bahwa jika Anda tidak menentukan secara eksplisit bind_addressmaka ssh mungkin masih tidak gagal. Sebagai contoh jika pengguna lain sudah mendengarkan di ipv6 localhost [::1]:3690maka ssh hanya dapat mengikat ipv4 127.0.0.1:3690dan tidak mengeluh. Tetapi klien svn Anda mungkin lebih suka soket ipv6 (penyerang). Agar aman, lebih baik digunakan-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
rudimeier
3
Anda juga dapat menggunakan ssh -o ExitOnForwardFailure = yes untuk menghindari spasi dan kebutuhan untuk mengutip.
freespace
1

Saya menggunakan skrip bash pada host target untuk memastikan penerusan dibuka dengan benar. Koneksi SSH akan menjalankan ini dan keluar jika ada masalah dengan penerusan port, misalnya

skrip sisi klien: (ini menggunakan .ssh / config untuk pengaturan penerusan port)

#!/bin/bash    

while true; do
    echo -n starting at : "
    date
    ssh user@server bin/sshloop.sh
    echo "got back, sleeping 17 "
    sleep 17
done 

skrip sisi server (bin / sshloop.sh)

#!/bin/bash

while true; do 
  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client"
  sleep 17
  if ! netstat -an | grep -q ":::1090 " ; then
     echo "1090 forward missing, bailing out"
     exit
  fi
done

Mungkin bahkan menjalankan skrip sisi klien di bawah layar dengan -dmS

Lingkaran Antti Rytsölä Consult
sumber
2
Kasus yang saya coba hindari adalah bahwa port forward sudah ada, dan peringatan diberikan. Saya pikir skrip ini akan memperlakukan pengikatan yang ada pada port sebagai sukses, bukan kegagalan.
Matt Joiner
1
Ini benar. Masalah saya adalah dengan skrip yang sama yang menahan port terbuka selama beberapa menit sebelum waktu habis. Skrip ini akan keluar dan menjalankan kembali beberapa kali setelah itu port akan dibuka kembali. Jika Anda perlu tahu pasti siapa yang memiliki port Anda dapat mencoba menjalankan netstat -anp dengan sudo dan menangkapnya.
Lingkaran Antti Rytsölä Berkonsultasi
@ AnttiRytsöläCirclesConsult: Perhatikan bahwa Anda mungkin perlu memeriksa ID proses, seperti mencocokkan pada "ssh" karena nama proses masih tidak memberi tahu Anda klien SSH mana yang sedang meneruskan port itu.
Piskvor