bash shell - код віддаленого захоплення скрипта і вихідний код скрипта?


23

Я хочу використовувати shell для виклику сценарію на віддаленому сервері. Я хотів би зафіксувати вихід цього сценарію (його протокольні повідомлення) та вихідний код, який він повертає.

Якщо я це роблю:

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

Я отримую вихідний код, але не можу захоплювати повідомлення віддаленого журналу.

Якщо я це роблю:

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

Я можу зареєструвати свій вихід за допомогою своєї функції LOG, але не можу отримати правильний код виходу, я вважаю, що отриманий код - це код із змінного призначення.

Я хотів би продовжувати використовувати свою функцію LOG для зйомки всіх результатів у форматі та відправлення речей у файл, syslog та екран.

Як я можу зафіксувати результати у var І отримати правильний код виходу з віддаленого сценарію?


Відповіді:


37

Причина, по якій ви не отримуєте правильний код помилки, полягає в тому local, що насправді виконується остання річ. Вам потрібно оголосити змінну як локальну до запуску команди.

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

Ви можете побачити проблему тут:

$ 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

«Місцеві», здається, є проблемою. Це працює для мене:

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

Ви теж були праві, але jodanm був швидше!
mconlin

Так, 26 секунд.
Hauke ​​Laging

5
Не клас англійської мови, але неправильно сказати "швидше".
mtahmed

5
Я знаю, що це був жарт. Я думаю, поганий. В Інтернеті ніхто не знає, що ви собака.
mconlin

також у відповіді jordanm пояснюється ЧОМУ з цим була проблема :)
Doktor J

3

Насправді жоден з вищезазначених відповідей не вловлює код помилки ssh та повідомлення, що можна зробити так (ігноруйте мої спеціальні функції):

# 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.