bash shell - ssh удаленный скрипт захватывает вывод и код выхода?

23

Я хочу использовать оболочку для вызова скрипта на удаленном сервере. Я хотел бы захватить выходные данные этого скрипта (его сообщения журнала) и код завершения, который он возвращает.

Если я сделаю это:

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 для захвата всех выходных данных, поскольку он форматирует и отправляет вещи в файл, системный журнал и экран для меня.

Как я могу получить результаты в переменной И получить правильный код завершения из удаленного сценария?

mconlin
источник
только вывод: superuser.com/questions/130443/… | unix.stackexchange.com/questions/1630/redirect-stdout-over-ssh
Сиро Сантилли 事件 改造 中心 法轮功 六四 事件

Ответы:

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
jordanm
источник
8

Кажется, проблема в «местном». Это работает для меня:

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?
Хауке Лагинг
источник
ты тоже был прав, но йоданм был быстрее!
Mconlin
Да, 26 секунд.
Hauke ​​Laging
5
Не английский урок, но неправильно говорить «быстрее».
mtahmed
5
Я знаю, что это была шутка. Плохой, я полагаю. В интернете никто не знает, что ты собака.
mconlin
также ответ Джорданма объясняет, ПОЧЕМУ это было проблемой :)
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
Йордан Георгиев
источник