我有 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设置已经使用密钥身份验证):
- 创建主机名列表,例如
~/.dev-hosts.list
.这个只有您的主机名列表
dev-host1 dev-host2 ...
date
使用以下命令在该列表中的每个主机上运行:
pssh -h ~/.dev-hosts.list -l developer -i date
- 选修的:为了方便起见,将其全部包装在别名中:
alias run.on.dev='pssh -h ~/.dev-hosts.list -l username'
。之后,要date
在这些机器上运行并获得输出,您只需敲击几下键盘即可:
run.on.dev -i date
显然,您几乎可以通过这种方式执行任何命令,包括您的sed
案例。
请注意,它-l
允许您指定通过 ssh 连接到这些主机的用户名,并-i
允许您查看命令产生的输出。