Shell脚本:想要登录同一域中的某个服务器并执行命令并退出

Shell脚本:想要登录同一域中的某个服务器并执行命令并退出

我有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在需要时使用,但这只是我的主观偏好。对于仅产生单行输出(例如unameuptime)的远程命令来说,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 -gpdsh -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 -auname -a将在所有服务器上 运行。将仅在服务器 1 和服务器 2 上 pdsh -g web uptime运行。将在服务器 1、2、5 和 6 上运行。依此类推。uptimepdsh -g web,mysql df -h /df

顺便说一句,一件奇怪的事情pdsh是它被配置rsh为默认使用而不是ssh.您需要:

  1. -R ssh在 pdsh 命令行上使用(例如pdsh -R ssh -w server[0-9] ...
  2. export PDSH_RCMD_TYPE=ssh跑步前pdsh
  3. 运行echo ssh > /etc/pdsh/rcmd_default以设置ssh为永久默认值。

如果pdsh没有为您的发行版打包,您可以在 LLNL 找到它:https://computing.llnl.gov/linux/pdsh.html


还有其他几种工具可以完成与pdsh.我尝试过其中的几个,发现它们的设置和使用通常比较麻烦。 pdsh几乎只需零配置或最低配置即可工作。

相关内容