for account in ${accounts}
do
`ssh -q id@server "touch EVENTS_${account}_${date}.log"`
done
我可以只执行 ssh 并运行 for 循环并触摸文件,而不是多次执行 ssh 吗?
答案1
ssh 允许您执行多个命令。只需用分号分隔每个命令即可。
command=": "
for account in ${accounts}
do
command=$command"; touch EVENTS_${account}_${date}.log"
done
ssh -q id@server "$command"
“:”所做的只是表示“继续执行下一个命令”。这样你的命令就不会以分号开始。
另外,您不需要在该命令周围使用反引号。
答案2
在远程计算机上运行循环。
ssh -q id@server "for account in ${accounts}; do touch EVENTS_\${account}_${date}.log; done"
请注意,我假设$accounts
和$date
不包含任何 shell 特殊字符 ( "$'()&;<>[\]`{|}~
)。特别是,$accounts
将被插入到远程 shell 中,然后在那里进行解释。如果您需要保护特殊字符,则需要更加小心引用:
q=\'\\\'\' # '\'' effectively quotes a single quote inside single quotes
ssh -q id@server 'for account in '\'"${accounts//\'/$q}"\''; do touch "EVENTS_${account}_${date}.log"; done'
或者,使用以下命令挂载远程文件系统sshfs并像在本地一样进行操作。
mkdir mnt
sshfs id@server mnt
for account in ${accounts}; do touch "mnt/EVENTS_\${account}_${date}.log"; done
答案3
集群ssh似乎是您想做的事情的完美工具。
ClusterSSH 是一个可以同时在多个服务器上进行相同更改的工具。 “cssh”命令打开所有指定主机的管理控制台和 xterm。在管理控制台中输入的任何文本都会复制到所有窗口。所有窗口也可以直接输入。
该工具适用于(但不限于)集群管理,其中必须在集群内的每个节点上运行相同的配置或命令。通过此工具一次性执行这些命令可确保所有节点保持同步。