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