用于登录多个服务器并执行命令并将输出附加到一个文件中的脚本

用于登录多个服务器并执行命令并将输出附加到一个文件中的脚本

我的任务是登录大约 300 个设备,执行以下命令,然后将输出复制到一个文件中。

我可以使用 SSH 作为登录方法,并且可以提供预定义的用户名和密码。

一旦我们进入设备,我需要登录专家模式并提供预定义的密码。

$ expert
>>> provide password 
$ lspci | egrep -i --color 'network|ethernet'

将输出复制到文件

我准备了以下脚本:

#!/bin/bash   
username=XXXX
passwd=XXX
cd /tmp

for host in `cat servers.txt`; 
do 
ssh $username@$host $passwd;

expert

echo "### $host ###" >> output.txt

lspci | egrep -i --color 'network|ethernet' >> output.txt

done

提示输入密码后,它给出以下内容:

Running commands is not allowed
./fibertest.sh: line 9: expert: command not found 

看起来它不是在远程运行命令,而是在本地计算机上运行。

答案1

你可以给pssh(又名并行 ssh)尝试一下,它在多台计算机上运行命令并在本地文件夹中获取结果/输出。

答案2

我建议你开始使用 Expect。 Expect 是为这种目的而创建的基于 tcl 的语言 - 与远程系统进行交互(但实际上像远程命令和输出解析等交互......)。

您可以编写非常简单的期望脚本并实现很多目标。试一试。还有 Perl 和 Python 的模块,所以如果您热衷于用这些语言编写脚本,您也可以。

以下是关于 Expect 的一些非常好的教程的列表:http://wiki.tcl.tk/11584

我正在使用 Expect 来管理大约 40 台服务器、各种管理任务、按定义的时间间隔收集命令输出等......

例如,如果您的机器不使用 SSH 密钥身份验证并且您不想使用 sshpass 等程序,但您仍然希望能够通过脚本登录(自动,无需人工交互),那就太好了。这只是一个例子,但 Expect 比这强大得多。

答案3

为了使用 SSH 在服务器上运行命令,您需要将命令放在与 SSH 命令同一行。

例子

编辑:经过思考,我删除了 ssh 命令中的 $password,因为服务器将尝试将其作为命令执行。您需要设置 ssh 密钥或将其与期望脚本结合起来以获取密码。

ssh $username@$host "expert; echo \"### $host ###\" >> output.txt; lspci | egrep -i --color 'network|ethernet' >> output.txt; scp output.txt $ADMIN_SERVER:$host-output.txt"

cat *-output.txt > output.txt

这行代码有点长,但您需要做的就是将命令括在引号中并用分号分隔,记得转义内部命令中使用的任何引号。另外请记住,您需要将输出文件复制回管理服务器/运行脚本表单的任何地方,然后将它们全部连接在一起。

相关内容