Возможно подготовить файл журнала на другой стороне и трубы его на стандартный вывод, например:
ssh -n [email protected] 'x() { local ret; "[email protected]" >&2; ret=$?; echo "[`date +%Y%m%d-%H%M%S` $ret] $*"; return $ret; };
x true
x false
x sh -c "exit 77";' > local-logfile
В основном только префиксом все на пульте дистанционного управления вы хотите, чтобы вызвать эту x
обертке. Он также работает для условных выражений, так как он не изменяет код выхода команды.
Вы можете легко выполнить эту команду.
Этого пример записывает в журнале что-то вроде:
[20141218-174611 0] true
[20141218-174611 1] false
[20141218-174611 77] sh -c exit 77
Конечно, вы можете сделать это лучше интерпретируемым или адаптировать его к вашему whishes как файл_журнал будет выглядеть. Обратите внимание, что необработанный нормальный stdout
удаленных программ записывается в stderr
(см. Перенаправление в x()
).
Если вам нужен рецепт для сбора и подготовки вывода команды для файла журнала, вот копия такого улавливателя от https://gist.github.com/hilbix/c53d525f113df77e323d - но да, это немного больший шаблон, чтобы «Запустить что-то в текущем контексте оболочки , постобработка стандартного вывод + STDERR, не нарушая код возврата ":
# Redirect lines of stdin/stdout to some other function
# outfn and errfn get following arguments
# "cmd args.." "one line full of output"
: catch outfn errfn cmd args..
catch()
{
local ret o1 o2 tmp
tmp=$(mktemp "catch_XXXXXXX.tmp")
mkfifo "$tmp.out"
mkfifo "$tmp.err"
pipestdinto "$1" "${*:3}" <"$tmp.out" &
o1=$!
pipestdinto "$2" "${*:3}" <"$tmp.err" &
o2=$!
"${@:3}" >"$tmp.out" 2>"$tmp.err"
ret=$?
rm -f "$tmp.out" "$tmp.err" "$tmp"
wait $o1
wait $o2
return $ret
}
: pipestdinto cmd args..
pipestdinto()
{
local x
while read -r x; do "[email protected]" "$x" </dev/null; done
}
STAMP()
{
date +%Y%m%d-%H%M%S
}
# example output function
NOTE()
{
echo "NOTE `STAMP`: $*"
}
ERR()
{
echo "ERR `STAMP`: $*" >&2
}
catch_example()
{
# Example use
catch NOTE ERR find /proc -ls
}
Смотрите вторую последнюю строку для примера (прокрутите вниз)
Вы говорите, что мне нужно ssh отдельно для запуска каждой команды, чтобы я мог получить их статус выхода? Я пытаюсь запустить как минимум 5 команд в том же сеансе ssh в моем реальном коде. –
Привет, @larsks. Можете ли вы объяснить, что означает 'ssh localhost exit 10'? Это означает выполнение ssh localhost с явным 10 как код состояния? Здесь выход - это опция ssh или команда linux 'exit'? –
Помните, что основным синтаксисом команды ssh является 'ssh'. Поэтому в приведенном выше ответе 'exit 10' - это команда, переданная удаленной оболочке. –
larsks