Я ежедневно работаю с определенной клиентской средой, состоящей из 5 серверов AIX, и иногда мне нужно выполнить одну и ту же команду на всех 5 из них.
Поэтому я установил аутентификацию между серверами на основе ключей SSH и создал небольшой ksh-скрипт, который транслирует команду всем из них:
#!/usr/bin/ksh
if [[ $# -eq 0 ]]; then
print "broadcast.ksh - broadcasts a command to the 5 XXXXXXXX environments and returns output for each"
print "usage: ./broadcast.ksh command_to_issue"
exit
fi
set -A CUST_HOSTS aaa bbb ccc ddd eee
for host in ${CUST_HOSTS[@]}; do
echo "============ $host ================"
if [[ `uname -n` = $host ]]; then
$*
continue
fi
ssh $host $*
done
echo "========================================="
echo "Finished"
Теперь это работает нормально, пока я не захочу использовать подстановочный знак на удаленном конце, например:
./broadcast.ksh ls -l java*
поскольку '*' расширяется в локальной системе, а не в удаленной.
Теперь, используя удаленные команды ssh, я могу обойти это, используя одинарные кавычки:
ssh user@host ls -l java* <-- will _not_ work as expected, since asterisk will be interpreted locally
ssh user@host 'ls -l java*' <-- _will_ work as expected, since asterisk will be interpreted on the remote end
Теперь я попытался включить это в свой сценарий и попытался создать переменную $ command, состоящую из содержимого $ *, окруженного одинарными кавычками, но утонул в море экранирования обратных косых черт и попыток конкатенации в ksh, чтобы не было польза
Я уверен, что есть простое решение, но я не нашел его, поэтому подумал, что выйду и спрошу.
Спасибо,
Джеймс