bash shell - ssh keluaran tangkap skrip jauh dan kode keluar?


23

Saya ingin menggunakan shell untuk menjalankan skrip di server jauh. Saya ingin menangkap output skrip itu (pesan logging-nya) dan kode keluar yang dikembalikan.

Jika saya melakukan ini:

ssh user@server /usr/local/scripts/test_ping.sh
echo "$?"

Saya mendapatkan kode keluar tetapi tidak bisa menangkap pesan logging jarak jauh.

Jika saya melakukan ini:

local RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo "$?" 
LOG "${RESULTS}";

Saya bisa mencatat output saya menggunakan fungsi LOG saya tetapi sepertinya tidak bisa mendapatkan kode keluar yang benar, saya berasumsi kode yang saya dapatkan adalah kode dari penugasan varible.

Saya ingin terus menggunakan fungsi LOG saya untuk menangkap semua output karena memformat dan mengirimkan sesuatu ke file, syslog, dan layar untuk saya.

Bagaimana saya bisa menangkap hasil dalam var DAN mendapatkan kode keluar yang benar dari skrip jarak jauh?


Jawaban:


37

Alasan Anda tidak mendapatkan kode kesalahan yang benar adalah karena localsebenarnya hal terakhir yang dieksekusi. Anda perlu mendeklarasikan variabel sebagai lokal sebelum menjalankan perintah.

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

Anda dapat melihat masalahnya di sini:

$ bar() { foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2
$ bar() { local foo=$(ls asdkjasd 2>&1); echo $?; }; bar
0
$ bar() { local foo; foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2

8

"Lokal" tampaknya menjadi masalah. Ini bekerja untuk saya:

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

Anda benar juga, tetapi jodanm lebih cepat!
mconlin

Ya, 26 detik.
Hauke ​​Laging

5
Bukan kelas bahasa Inggris tapi tidak benar mengatakan 'lebih cepat'.
mtahmed

5
Saya tahu itu hanya lelucon. Yang buruk kurasa. Di internet tidak ada yang tahu Anda adalah seekor anjing.
mconlin

juga jawaban jordanm menjelaskan MENGAPA ini masalahnya :)
Doktor J

3

Sebenarnya, tidak ada jawaban di atas yang menjebak kode kesalahan dan pesan ssh, yang dapat dilakukan sebagai berikut (abaikan fungsi kustom saya):

# move the deployment package from the tmp dir
msg=$(ssh -i "$(eval echo $identity_file)" -o ConnectTimeout=5 "$ssh_user"'@'"$ssh_server" \
sudo -iu "$etl_user" bash "$tgt_deployment_dir"'/src/bash/'"$run_unit/$run_unit"'.sh' \
    -a create-relative-package 2>&1)

# fail on any non-success
export exit_code=$?
export err_msg="network error: ""$msg"
test $exit_code -ne 0 && doExit $exit_code $err_msg
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.