Bagaimana cara membuat skrip bash untuk memeriksa koneksi SSH?

90

Saya sedang dalam proses membuat skrip bash yang akan masuk ke mesin jarak jauh dan membuat kunci pribadi dan publik.

Masalah saya adalah bahwa mesin jarak jauh tidak terlalu dapat diandalkan, dan mereka tidak selalu aktif. Saya memerlukan skrip bash yang akan memeriksa apakah koneksi SSH sudah aktif. Sebelum benar-benar membuat kunci untuk digunakan di masa mendatang.

chutsu
sumber
2
Biasanya, seseorang berjalan ssh-keygenuntuk menghasilkan pasangan kunci pada mesin lokal, kemudian ssh-copy-idmenyalin kunci publik ke mesin jarak jauh. Sepertinya Anda melakukan sesuatu secara berbeda. Kenapa, apa tujuanmu?
efemient
1
Karena Anda jelas mengubah cara mesin jarak jauh membuat koneksi, pertimbangkan untuk menggunakan mosh . mosh.mit.edu Ini dimaksudkan untuk melengkapi SSH pada koneksi yang tidak stabil. Saya memiliki pengalaman yang sangat baik dengannya.
Aeyoun
@ephemient Saya tahu ini agak terlambat, tetapi tampaknya cukup mudah bahwa kunci mereka bukan untuk mesin lokal atau bukan untuk pengguna lokal.
Kereta yang Ditinggalkan

Jawaban:

176

Anda dapat memeriksa ini dengan nilai yang dikembalikan ssh memberi Anda:

$ ssh -q user@downhost exit
$ echo $?
255

$ ssh -q user@uphost exit
$ echo $?
0

EDIT: Pendekatan lain adalah menggunakan nmap (Anda tidak perlu memiliki kunci atau login-stuff):

$ a=`nmap uphost -PN -p ssh | grep open`
$ b=`nmap downhost -PN -p ssh | grep open`

$ echo $a
22/tcp open ssh
$ echo $b
(empty string)

Tapi Anda harus grep pesan (nmap tidak menggunakan nilai-kembali untuk menunjukkan apakah port difilter, ditutup atau dibuka).

EDIT2:

Jika Anda tertarik dengan status ssh-port yang sebenarnya, Anda dapat menggantinya grep opendengan egrep 'open|closed|filtered':

$ nmap host -PN -p ssh | egrep 'open|closed|filtered'

Sekadar melengkapi.

Tim Cooper
sumber
1
Untuk menjadi lengkap, dapatkah u menunjukkan kode pengembalian mana yang berarti sukses dan yang berarti kegagalan untuk SSH?
Henley Chiu
Ingin tahu bagaimana jika upaya SSH berhenti begitu saja?
Sibbs Perjudian
2
Jawaban yang bagus! Namun, Anda tidak menyebutkan bahwa mencoba sshmenjadi host down hanya gagal setelah batas waktu misalnya 60 detik - yang mungkin menjadi penghalang untuk beberapa penggunaan. Juga, jika nama host jika didefinisikan di ~/.ssh/config, sshpendekatan pertama berfungsi sementara nmapcara kedua gagal dengan Failed to resolve "<hostname>".
ssc
2
tidak ada penjelasan sama sekali tentang perintah ... atau apa yang sebenarnya Anda lakukan .. apa itu $?? dll
Toskan
Bentuk # 1 yang lebih ringkas: ssh -q user@downhost exit | echo $? menyalurkan hasil koneksi ke echo
philn5d
23

Anda bisa menggunakan sesuatu seperti ini

$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

Ini akan menghasilkan "ok" jika koneksi ssh ok

Adrià Cidre
sumber
22
ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK
Brian Ott
sumber
2
Keluaran satu baris: (ssh -q -o "BatchMode = yes" -o "ConnectTimeout = 3" [email protected] "echo 2> & 1" && echo SSH_OK || echo SSH_NOK) | ekor -n1
Xdg
15

Melengkapi tanggapan @Adrià CidreAnda dapat melakukan:

status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

if [[ $status == ok ]] ; then
  echo auth ok, do something
elif [[ $status == "Permission denied"* ]] ; then
  echo no_auth
else
  echo other_error
fi
iarroyo
sumber
7

Mencoba:

echo quit | telnet IP 22 2>/dev/null | grep Connected
GUESSWHOz
sumber
1
Masalah dari pendekatan ini adalah ia tidak mengenali host yang ditentukan dalam ssh_config (yaitu / etc / ssh / config atau ~ / .ssh / config)
Ding-Yi Chen
1

sshPerintah di bawah ini harus memiliki kode keluar 0pada koneksi yang berhasil dan nilai bukan nol jika tidak.

ssh -q -o BatchMode=yes [email protected] exit

if [ $? != "0" ]; then
    echo "Connection failed"
fi
Matt
sumber
Bagus! Saya merekomendasikan juga menambahkan -o ConnectTimeout = 5, untuk keluar lebih cepat dalam kasus di mana port tujuan difilter.
Daniel
0

Untuk berjaga-jaga jika seseorang hanya ingin memeriksa apakah port 22 terbuka pada mesin jarak jauh, perintah netcat sederhana ini berguna. Saya menggunakannya karena nmap dan telnet tidak tersedia untuk saya. Selain itu, konfigurasi ssh saya menggunakan auth kata sandi keyboard.

Ini adalah varian dari solusi yang diusulkan oleh GUESSWHOz.

nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"
Mathieu C.
sumber
0

Jika Anda ingin memeriksa keberadaan folder jauh, atau file-test lainnya:

if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
    # exists
else
    # doesn't exist
fi

Jangan lupa tanda kutip di "$(ssh ...)".

Jonathan H.
sumber
Ini tidak menjawab pertanyaan itu. OP ingin memeriksa apakah koneksi SSH dapat dibuat tidak memeriksa file di lokasi ssh jauh.
Rakib Fiha
0

Contoh Menggunakan skrip BASH 4+:

# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)

# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
    echo "It's Open! Let's SSH to it.."
else
    echo "The host ${ip} is not accessible!"
fi
Mike Q
sumber
0

https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html

Tautan di atas adalah untuk membuat skrip Python untuk memeriksa konektivitas. Anda dapat menggunakan metode dan penggunaan serupa:

ping -w 1 -c 1 "IP Address" 

Perintah untuk membuat skrip bash.

Dheeraj Kumar
sumber
2
Ini hanya akan melakukan ping ke IP jarak jauh. Tidak menjamin apakah koneksi ssh dimungkinkan.
RJ
Terima kasih telah menunjukkannya, berikut kode untuk ssh xlinu.blogspot.com/2019/09/… export user = "username" export pass = "password" export i = "hostname" export SSHPASS = $ pass sshpass -e ssh $ pengguna @ $ i -q "echo $ i dapat diakses"
Dheeraj Kumar
-7

Saya merasa Anda mencoba menyelesaikan masalah yang salah di sini. Tidakkah sebaiknya Anda mencoba membuat daemon ssh lebih stabil? Coba jalankan sesuatu seperti monit , yang akan memeriksa untuk melihat apakah daemon sedang berjalan dan memulai ulang jika tidak (memberi Anda waktu untuk menemukan akar masalah di balik sshd mematikan Anda). Atau apakah layanan jaringan merepotkan? Coba lihatman ifup . Apakah Whole Damn Thing hanya ingin menutup diri Anda? Nah, itu masalah yang lebih besar ... coba lihat log Anda (mulai dengan syslog) untuk menemukan kegagalan perangkat keras atau layanan yang mematikan kotak Anda (mungkin monitor suhu?).

Membuat skrip Anda toleran terhadap kesalahan itu bagus, tetapi Anda mungkin juga ingin membuat toleransi kesalahan boxen Anda.

Sam Bisbee
sumber
4
Sam: ada kasus penggunaan yang valid agar skrip memeriksanya. Misalnya (seperti saya): Saya memiliki tugas cron yang berjalan di mesin saya untuk mencadangkan data saya melalui rsync ke nas rumah saya. Sekarang saya berada di luar atau bahkan cukup sering terputus dan perlu menjadwal ulang jika koneksi tidak tersedia. Boxen saya berjalan cukup baik, tetapi seperti kata pepatah: selalu kabel (alias jaringan)
stwissel