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?

mconlin
sumber
hanya keluaran: superuser.com/questions/130443/… | unix.stackexchange.com/questions/1630/redirect-stdout-over-ssh
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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
jordanm
sumber
8

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

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?
Hauke ​​Laging
sumber
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
Yordan Georgiev
sumber