我必须在大约 1000 个网络设备上运行命令并将输出保存到文件中。在一个文件中,我列出了必须使用 SSH 连接的所有网络设备名称。然后我必须运行一个命令,例如show interface description
,然后将输出保存到文件中。这些设备均设置了通用用户名和密码,所有设备上的用户名和密码都相同。所以基本上我需要一个脚本来在列表文件中的所有设备上运行这些命令:
ssh user@device1
password: passwordhere
user@device1> show interface description
user@device1> exit
然后将所有输出保存到文件中。我正在使用红帽企业服务器。
答案1
您需要自动化的主要工作是输入ssh
密码。我知道您可以尝试两种方法,设置无密码ssh
或安装sshpass
:
用于
sshpass
输入密码。如果您有DAG 存储库设置完毕后,您应该可以使用 yum 安装:yum install sshpass
如果没有,您也可以直接下载RPM或添加存储库然后安装:
下载 rpmforge-release 包。选择下面两个链接之一,选择与您的主机架构相匹配的链接。如果您不确定使用哪一个,可以使用以下命令检查您的架构
uname -i
安装 DAG 的 GPG 密钥
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
安装下载的包
rpm -i rpmforge-release-0.5.2-2.el6.rf.*.rpm
安装
sshpass
yum install sshpass
安装后
sshpass
,给定一个名为 的文件ips.txt
,例如,其中每行包含设备的名称或 IP,您可以像这样自动化该过程:while read ip; do echo -n "$ip: " >> local_file.log; sshpass -p 'your password' ssh user@$ip remote_command >> local_file.log done < ips.txt
ssh
或者,您可以为每个设备设置无密码并跳过安装sshpass
:设置无密码
ssh
ssh-keygen -t rsa while read ip; do ssh-copy-id -i ~/.ssh/id_rsa.pub user@$ip; done < ips.txt
运行你的工作
while read ip; do echo -n "$ip: " >> local_file.log; ssh user@$ip remote_command >>local_file.log done < ips.txt
答案2
几年前,我在自动化远程连接方面遇到了类似的问题。我用了预计这是一个非常灵活的工具,但有时使用起来有点微妙。它将执行用户通过在命令行中键入可以执行的任何操作,但系统的所有可能反应都必须可由脚本识别expect
(因此该工具的名称:它不喜欢意外)。
然而,这可能对你的问题来说是一个大锤,@erdon 提出的解决方案可能更轻、更合适。
答案3
为此,您可以使用 Python 和 Paramiko 脚本。抱歉这个插件,但我已经在这里发布了一个脚本“http://certifiedgeek.weebly.com/blog/network-scripting-via-ssh-with-python-and-paramiko“脚本所在的位置”https://github.com/cwgueco/netscript”
该脚本“netscript.py”具有以下选项:
netscript.py -t <target> -u <username> -p <password> -i <command_file> -v
- the target is the IP address/hostname
- username/password should have allowed privilege to run commands
- command_file is a text file where the commands are listed
- v for verbose wherein you can pipe this to a file
只需创建一个脚本,该脚本将在连接到每个设备并运行相同的命令集并将每个输出通过管道传输到文件时循环此 python 脚本。