#! /bin/bash
cd /path/to/ssh_logs || exit 1
for targethost in a b c; do
log_file="${targethost}/$(date --iso-8601=seconds).log"
mkdir -p "${targethost}" || { echo "Error: ${targethost}";exit 1; }
{ ssh batchuser@"${targethost}" "$command"; rc=$?;
echo $'\n'"finished (with exit code ${rc}): $(date --iso-8601=seconds)";
} >"$log_file" 2>&1
done
Редактирование 1:
Некоторое объяснение потребовало (я также изменил детали сценария):
/path/to/ssh_logs
в этом примере – создается один подкаталог для каждого целевого узла, в который помещаются выходные файлы. Альтернатива должна поместить все файлы в тот же каталог и сделать часть хоста имени файла. Это - больше вопрос вкуса (для разумных сумм файлов). Таким образом первый шаг должен попытаться измениться на этот каталог (и аварийное прекращение работы, если это перестало работать).for targethost in a b c; do ... ; done
цикл по хостам. В примере имена хостов трудно кодируются в сценарии. Кроме того, Вы могли записать им в текстовом файле, один на строку или разделенный пространством, и получить имена в сценарий этот путь: for targethost in $(<targethosts.txt); do
Вы можете выбрать определенное слово из последней напечатанной команды !!:
и дизайн слова. Как слово дизайна вам нужна 0
. Вы можете найти ^
и $
тоже полезно. Из человек Bash
:
Указатели слова
0 (ноль) Zeroth Word. Для оболочки это командное слово.
^ Первый аргумент. То есть слово 1.
$ Последний аргумент.
Так что в вашем случае попробуйте:
echo !!:0
В интерактивном режиме проще всего сделать это с помощью комбинации клавиш alt+0 и alt+. . Клавиша alt+. означает "вызывать n-е слово из предыдущей строки" (по умолчанию последнее) и alt++ дает ему аргумент 0.
Это должно работать для интерактивного базирования на большинстве систем (в общем случае, все оболочки, которые используют readline
в качестве библиотеки входных данных).
https://stackoverflow.com/questions/4009412/bash-how-to-use-arguments-from-previous-command