bash kabuk - ssh uzak komut dosyası yakalama çıktı ve çıkış kodu?


23

Uzak sunucudaki bir betiği çağırmak için kabuk kullanmak istiyorum. Bu betiğin çıktısını (günlük mesajları) ve döndürdüğü çıkış kodunu yakalamak istiyorum.

Bunu yaparsam:

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

Çıkış kodunu alıyorum ancak uzaktan kayıt iletilerini alamıyorum.

Bunu yaparsam:

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

Çıktığımı LOG işlevimi kullanarak günlüğe kaydederim ancak doğru bir çıkış kodu alamıyorum, aldığım kodun değişken atamasından gelen kod olduğunu kabul ediyorum.

Tüm çıktıları yakalamak için bir şeyler bir dosyaya, sistem günlüğüne ve benim için ekrana gönderdiği gibi LOG işlevimi kullanmaya devam etmek istiyorum.

Var komutundaki sonuçları nasıl yakalayabilirim ve uzak koddan doğru çıkış kodunu alabilirim?


Yanıtlar:


37

Doğru hata kodunu alamamanın nedeni local, aslında yürütülen en son şey. Komutu çalıştırmadan önce değişkeni yerel olarak bildirmeniz gerekir.

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

Sorunu burada görebilirsiniz:

$ 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

"Yerel" sorun gibi görünüyor. Bu benim için çalışıyor:

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

sen de haklıydın, ama jodanm daha hızlıydı!
mconlin

Evet, 26 saniye.
Hauke

5
İngilizce dersi değil, ancak 'daha hızlı' demek yanlış.
18

5
Şaka olduğunu biliyorum. Sanırım kötü bir tane. İnternette kimse senin bir köpek olduğunu bilmiyor.
mconlin

Ürdün'ün cevabı da bu sorunun neden NEDİR olduğunu açıklıyor :)
Doktor J

2

Aslında, yukarıdaki yanıtların hiçbiri aşağıdaki gibi yapılabilecek ssh hata kodunu ve mesajını yakalamaz (özel işlevlerimi yoksay):

# 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.