我有一个简单的 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
问题是命令可以包含任意数量的参数,因此使用 $* 并且还可以包含许多不同的字符,包括引号和正则表达式。这里的基本需求是让 shell 接受参数,不管它们是什么,从字面上看,这样它们就可以原封不动地传递给远程服务器,而无需删除引号或解释括号等。
我见过许多变体,但大多数都处理特定的字符问题或使所需的脚本或参数过于复杂,我希望至少保持参数没有转义字符等。
使用“@”的示例:
./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')