У меня есть простой скрипт bash для запуска удаленной команды на заданном наборе серверов.Баш-аргументы дословной интерпретации
#!/bin/bash
echo "Command to be run:"
echo "$*"
read nothing
servers="server1 server2 server3"
for server in `echo $servers`
do
echo $server
ssh $server "$*"
echo ""
done
Проблема заключается в том, что команда может содержать любое количество аргументов, следовательно, использование $ *, а также может иметь множество различных символов, включая кавычки и регулярные выражения. Основная потребность здесь в том, что оболочка принимает аргументы, независимо от того, что они есть, буквально, поэтому они передаются на удаленный сервер без изменений, не удаляя кавычки или интерпретируя скобки и т. Д.
Существует несколько вариантов, которые я видел, но большинство иметь дело с конкретной проблемой характера или усложнять сценарий или аргументы необходимы, и я ищу, чтобы по крайней мере аргументы свободны от экранирующих символов и т.д.
пример с использованием «@»:
./cmd tw_query --no-headings "search Host where name matches '(?i)peter' show summary, nodecount(traverse :::Detail where name matches 'bob')"
Дает:
Command to be run:
tw_query --no-headings search Host where name matches '(?i)peter' show summary, nodecount(traverse :::Detail where name matches 'bob')
Используйте '' $ @ "' вместо '' $ * "' Это должно решить ваши проблемы. –
Вы можете заменить 'для сервера в' echo $ servers' '' 'для сервера в $ servers' – damienfrancois
Передача строки, подобной этой' ssh', сложна, потому что ваша строка анализируется один раз перед вызовом вашего скрипта и установкой '$ * 'и снова, когда строка получена на удаленном конце. Обычно проще просто написать сценарий, скопировать его на удаленный хост и выполнить удаленный скрипт через 'ssh'. – chepner