Если Вы имеете в виду удаленно, который не ясен из Вашего вопроса. Если Вы не делаете, опустите шаг 2 и 3
Если вам нужно что-то для захвата вывода, взаимодействия с сеансом оболочки и / или взаимодействия с приложениями pty, такими как screen
, вы можете попробовать написать на более высоком уровне библиотека SSH языка, например Net: SSH Ruby. Это требует некоторого обучения, но я считаю, что он сделает все, что вам нужно.
Мне нужно получить доступ к stdout, stderr и коду выхода каждой команды отдельно. Это затрудняет объединение команд в цепочку с помощью && или;.
Я не знаю, действительно ли я рекомендую это, но вы могли бы написать такую функцию оболочки, как эта:
function prefix ()
(
PREFIX="$1"
OUT=''
while read -r ; do
OUT="${OUT}${PREFIX}${REPLY}"$'\n'
done
echo "$OUT"
)
function run_cmd ()
{
echo "Running command << $@ >> . . ."
(
( ( "$@" ; echo "\$?: $?" >&3 ) | prefix 'STDOUT: ' >&3 ) 2>&1 \
| prefix 'STDERR: '
) 3>&1
}
Тогда if ./ foo.sh bar
выводит foo \ nbar \ n
в стандартный вывод и baz \ nbip \ n
в стандартную ошибку и выходит с кодом 1 , то run_cmd ./foo.sh bar
напечатает что-то вроде:
Running command << ./foo.sh bar >> . . .
$?: 0
STDOUT: foo
STDOUT: bar
STDERR: baz
STDERR: bip
Это должно позволить вам связать последовательность команд, при условии, что вы используете run_cmd
для всех тех, которые вы нужны STDOUT / STDERR / коды выхода для. (Но поскольку сама команда выполняется в пятиуровневой подоболочке, вы можете ' t используйте run_cmd
для запуска любой команды, которая должна установить переменные среды для использования другими командами. Надеюсь, у вас нет команд, которые и выдают выходные и переменные установки?)
Я также считаю, что подход Кайла был бы наиболее многообещающим. Если это не сработает, вы можете написать свой основной скрипт так, чтобы он входил в бесконечный цикл, в котором он ищет командные файлы, которые затем исходят, и делает stdout, stderr и код выхода доступными в форме, пригодной для ваших целей. .
Затем вы должны вставить командные файлы через альтернативный канал, вероятно, просто scp
или что-то подобное.
Вы уже смотрели pssh
? Он удовлетворяет большинство ваших требований, и при некотором творчестве и воображении он вполне может вам помочь:
И так далее ...