如何在多台服务器上运行同一个命令

如何在多台服务器上运行同一个命令

我有 4 台 suse 服务器作为集群工作。名称 CS-1 CS-2 CS-3 CS-4

在 CS-1 上,可以直接 ssh 到 CS-2 CS-3 CS-4(ssh CS-2、ssh CS-3、ssh CS-4) 在 CS-2 上,可以直接 ssh 到 CS-1 CS-3 CS-4 (ssh CS-1、ssh CS-3、ssh CS-4)

我需要在所有这 4 台服务器上执行 3 个命令

sed 's/aes128-ctr/aes129-ctr/' </etc/ssh/sshd_config> sshd_config.new; mv sshd_config.new sshd_config
sed 's/aes130-ctr/aes131-ctr/' </etc/ssh/sshd_config> sshd_config.new; mv sshd_config.new sshd_config
sed 's/aes132-ctr/aes133-ctr/' </etc/ssh/sshd_config> sshd_config.new; mv sshd_config.new sshd_config

如何在一个 shell 脚本中做到这一点?

答案1

有几种方法可以做到这一点。

如果这是您可能经常做的事情,您可能需要研究一下安西布尔或其他类似的自动化工具。

如果这是一次性的,可能最直接的方法是将这些命令复制到脚本中,将scp脚本复制到远程计算机,然后使用以下命令远程执行它们ssh

$ for host in cs-{2..4}; do scp my-script.sh myuser@"$host":; ssh -t $host "sudo ./my-script.sh"; done

顺便说一句,如果您对自己的命令充满信心sed,您可以执行以下操作,而不是手动写入临时文件并复制新文件:

sed --in-place 's/aes128-ctr/aes129-ctr/;s/aes130-ctr/aes131-ctr/;s/aes132-ctr/aes133-ctr/' /etc/ssh/sshd_config

由于这是一个命令,因此您可以简单地为每个主机执行以下操作:

$ ssh user@host "sed --in-place 's/aes128-ctr/aes129-ctr/;s/aes130-ctr/aes131-ctr/;s/aes132-ctr/aes133-ctr/' /etc/ssh/sshd_config"

答案2

如果您必须在某些服务器上运行相同的命令经常,我建议研究pssh同一工具和相关工具包裹

我在我的笔记本电脑上做了什么,我需要从那里控制〜50个远程主机(ssh设置已经使用密钥身份验证):

  1. 创建主机名列表,例如~/.dev-hosts.list.这个只有您的主机名列表
dev-host1
dev-host2
...
  1. date使用以下命令在该列表中的每个主机上运行:

pssh -h ~/.dev-hosts.list -l developer -i date

  1. 选修的:为了方便起见,将其全部包装在别名中:alias run.on.dev='pssh -h ~/.dev-hosts.list -l username'。之后,要date在这些机器上运行并获得输出,您只需敲击几下键盘即可:

run.on.dev -i date

显然,您几乎可以通过这种方式执行任何命令,包括您的sed案例。

请注意,它-l允许您指定通过 ssh 连接到这些主机的用户名,并-i允许您查看命令产生的输出。

相关内容