Saya memiliki perintah bentuk:
dd if=/my/block/device | ssh myuser@otherserver "gzip > file.gz"
Bagaimana cara memeriksa apakah perintah ssh gagal karena masalah konektivitas?
Terima kasih.
sumber
Saya memiliki perintah bentuk:
dd if=/my/block/device | ssh myuser@otherserver "gzip > file.gz"
Bagaimana cara memeriksa apakah perintah ssh gagal karena masalah konektivitas?
Terima kasih.
Dari man 1 bash
:
Status pengembalian pipa adalah status keluar dari perintah terakhir, kecuali
pipefail
opsi diaktifkan. Jikapipefail
diaktifkan, status pengembalian pipa adalah nilai dari perintah terakhir (paling kanan) untuk keluar dengan status bukan-nol, atau nol jika semua perintah keluar dengan sukses.
Lalu dari man 1 ssh
:
ssh
keluar dengan status keluar dari perintah jarak jauh atau dengan255
jika terjadi kesalahan.
Biasanya (dengan pipefail
dinonaktifkan) Anda mendapatkan status keluar dari ssh
. Nilai kemungkinan 255
mungkin berasal dari ssh
sendiri atau dapat berasal dari perintah apa pun yang Anda jalankan di sisi jarak jauh (tetapi kesalahan "umum" biasanya menghasilkan status keluar "rendah", misalnya 1
, 2
). Dalam praktek 255
menunjukkan ada yang salah.
Status keluar tersedia sebagai parameter khusus $?
tepat setelah pipa keluar. Contoh:
$ true | ssh no-such-address.example.org true
# error message here, skipped
$ echo $?
255
Untuk mendapatkan informasi lebih spesifik dari ssh
, Anda perlu menganalisis stderr-nya. Lihat manual, khususnya -E
(jika tersedia) dan -v
pilihan. -E
menentukan file log ssh
harus menulis, tetapi Anda akan mendapatkan efek yang sama dengan mengarahkan ulang stderr dengan 2>/path/to/logfile
. Tentang -v
:
-v
Mode Verbose. Penyebabssh
untuk mencetak pesan debug tentang kemajuannya. Ini sangat membantu dalam men-debug koneksi, otentikasi, dan masalah konfigurasi. Berganda-v
opsi meningkatkan verbositas. Maksimumnya adalah3
.
Jadi prosedur umumnya seperti ini: setelah ssh
keluar, periksa status keluar; jika itu 255
, menganalisis logfile
jika kegagalannya adalah "karena masalah konektivitas".
Gunakan: echo ${PIPESTATUS[1]}
Atau echo ${PIPESTATUS[*]}
untuk memeriksa status keluar dari semua perintah.
lihat Contoh: $ PIPESTATUS :
Para anggota
$PIPESTATUS
Array memegang status keluar dari setiap perintah masing-masing dieksekusi dalam pipa.$PIPESTATUS[0]
memegang status keluar dari perintah pertama di dalam pipa,$PIPESTATUS[1]
status keluar dari perintah kedua, dan seterusnya.