我有10台unix服务器,我想一台一台地登录它们,执行4-5行代码,保存输出并退出。
例如: 10 份:
最初在 xyz 服务器
登录服务器 1 --> 执行 4-5 行 --> 将输出发送到 xyz 服务器 --> 退出
登录服务器 2 --> 执行 4-5 行 --> 将输出发送到 xyz 服务器 --> 退出
....
登录服务器 10 --> 执行 4-5 行 --> 将输出发送到 xyz 服务器 --> 退出
最后在 XYZ 服务器上输出文件。
比方说,我想执行一些时间命令,...比如将时间倒退到一小时,将新时间作为输出,将新时间保存在 xyz 服务器上的某个文件中,格式如下:
Server Name New Time
=========== =========
Server1 Date and Time
Server2 Date and Time
答案1
您最初的问题中没有太多解释,所以我猜是这样的。
您可以通过 SSH 进行远程调用,在远程服务器上执行命令,如下所示:
result=`ssh -t server1.mydomain.com "commands;separated;by;semicolons --with-args" > log-on-xyz.log 2>&1` echo "$result"
通过循环遍历列表中的每个服务器来执行此操作。最后,您可以将日志的输出回显到屏幕并将其删除。
可以通过用分号分隔命令来“链接”命令,允许使用参数。此外,您还可以在远程调用中使用局部变量作为参数。
编辑:请注意,这是 BASH 脚本,但稍加修改也适用于其他语言。
答案2
由于缺少一些信息,问题不清楚。让我们尝试一下目前为止的情况...假设 10 个服务器 IP 地址是 192.168.1.11..192.168.1.20:
#!/bin/bash
for host in 192.168.1.{11..20}
do
echo "#############################################################################"
echo "$host:"
# check if host is alive, if positive, then execute command in remote server
ssh -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=quiet user@$host exit
if [ $? -ne 0 ];then
echo -e "\033[0;101m\033[1;37mOFFLINE\033[0m"
else
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=quiet user@$host "execute_command"
fi
done
现在保存 shell 脚本并将 stdout 和 stderr 重定向到日志文件。
./script.sh &> log.txt
答案3
安装pdsh
,然后你可以运行如下命令:
pdsh -w server[0-9],server10 'command1 ; command2 ;... ; command5' > logfile.txt
注意:如果您不想为每个服务器输入密码,则需要在远程服务器上安装authorized_key。如有必要,您可以使用环境变量PDSH_SSH_ARGS
来指定 ssh 选项,包括要使用的身份文件 ( -i
)。
命令将被运行在平行下在所有服务器上,它们的输出将混合在一起(主机名前置到每个输出行)。您可以使用pdsh
的实用程序查看格式良好并按主机分隔的输出dshbak
:
dshbak logfile.txt | less
或者,您可以在重定向到日志文件之前通过 dshbak 进行管道传输:
pdsh -w server[0-9],server10 'command1 ; command2 ;... ; command5' |
dshbak > logfile.txt
IMO 最好保存原始日志文件并dshbak
在需要时使用,但这只是我的主观偏好。对于仅产生单行输出(例如uname
或uptime
)的远程命令来说,dshbak
由于输出非常简洁,因此过于冗长。例如,从我的家庭网络:
# pdsh -g all uptime
kali: 12:03:18 up 33 days, 23 min, 3 users, load average: 0.21, 0.06, 0.06
hanuman: 12:03:37 up 10 days, 21:59, 2 users, load average: 0.04, 0.05, 0.05
indra: 12:02:57 up 13 days, 1:12, 3 users, load average: 0.30, 0.26, 0.30
ganesh: 12:03:10 up 6 days, 10:11, 6 users, load average: 1.18, 1.34, 1.35
您可以在名为 的文件中定义主机和主机组,然后使用代替/etc/genders
指定主机组。例如,使用这样的文件:pdsh -g
pdsh -w
/etc/genders
server1 all,web
server2 all,web
server3 all,mail
server4 all,mail
server5 all,mysql
server6 all,mysql
pdsh -g all uname -a
uname -a
将在所有服务器上 运行。将仅在服务器 1 和服务器 2 上 pdsh -g web uptime
运行。将在服务器 1、2、5 和 6 上运行。依此类推。uptime
pdsh -g web,mysql df -h /
df
顺便说一句,一件奇怪的事情pdsh
是它被配置rsh
为默认使用而不是ssh
.您需要:
-R ssh
在 pdsh 命令行上使用(例如pdsh -R ssh -w server[0-9] ...
export PDSH_RCMD_TYPE=ssh
跑步前pdsh
- 运行
echo ssh > /etc/pdsh/rcmd_default
以设置ssh
为永久默认值。
如果pdsh
没有为您的发行版打包,您可以在 LLNL 找到它:https://computing.llnl.gov/linux/pdsh.html
还有其他几种工具可以完成与pdsh
.我尝试过其中的几个,发现它们的设置和使用通常比较麻烦。 pdsh
几乎只需零配置或最低配置即可工作。