我可以一次性执行 ssh、for 循环和触摸文件吗?

我可以一次性执行 ssh、for 循环和触摸文件吗?
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。在管理控制台中输入的任何文本都会复制到所有窗口。所有窗口也可以直接输入。

该工具适用于(但不限于)集群管理,其中必须在集群内的每个节点上运行相同的配置或命令。通过此工具一次性执行这些命令可确保所有节点保持同步。

相关内容