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.


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.


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


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

2
Keluaran satu baris: (ssh -q -o "BatchMode = yes" -o "ConnectTimeout = 3" user@host.com "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

7

Mencoba:

echo quit | telnet IP 22 2>/dev/null | grep Connected

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 user@remote.com exit

if [ $? != "0" ]; then
    echo "Connection failed"
fi

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"

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 ...)".


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

0

Untuk terhubung ke server dengan banyak antarmuka

ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51

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

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.


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.


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
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.