在网络中自动化 scp 的脚本

Ram*_*esh 3 scripting ssh expect

我有一个充满 Linux 机器的网络。在这个网络中,我有一个用户为user1,所有机器的密码为密码

我有以下脚本将文件放在网络所有机器中user1的主目录中。

#!/usr/bin/expect -f

# connect via scp
spawn cat /home/user1/Desktop/IPlistfile.txt | while read line do
spawn scp /home/user1/Desktop/filetobesent.txt user1@${line}:/home/user1/Desktop
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "password\r"
}
}
interact
done
Run Code Online (Sandbox Code Playgroud)

问题是我收到一条错误消息“ can't read line. No such variable”。但是,如果我直接使用 IP 地址而不是行变量,则可以传输文件。

编辑:IPlistfile.txt 包含我网络中的 IP 地址列表。每行包含一个 IP 地址。

ter*_*don 6

我可以想到几种方法来做到这一点,但我强烈建议设置无密码ssh访问,稍后你会感谢我。

1. 设置无密码访问您的机器。

这是迄今为止最好的方法,因为您肯定想再次连接到机器,这将使您的生活更加轻松。即使您选择使用空密码短语,这也是一种方式,比其他选项更安全,因为您不会将未加密的密码扔到周围。

首先,ssh在你的机器上创建一个公钥:

ssh-keygen -t rsa
Run Code Online (Sandbox Code Playgroud)

系统会要求您输入密码,每次登录后一次运行任何 ssh 命令时都会要求您输入该密码。这意味着对于多个sshscp命令,您只需输入一次。不过,您可以将其留空以获得完全无密码的访问。

生成公钥后,将其复制(作为user1)到网络中的每台计算机:

while read ip; do 
 ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip 
done < IPlistfile.txt
Run Code Online (Sandbox Code Playgroud)

您必须手动输入每个 IP 的密码(除非您也为此步骤使用以下解决方案之一),但是一旦完成,您就可以使用简单的方法将文件复制到这些机器中的任何一台:

while read ip; do
  scp /home/user1/Desktop/filetobesent.txt user1@$ip:~/Desktop
done < IPlistfile.txt
Run Code Online (Sandbox Code Playgroud)

如果您已sshpass安装,则可以自动执行此操作,因此您无需为每台机器键入密码:

SSHPASS='password'
while read ip; do
  sshpass -e  scp /home/user1/Desktop/filetobesent.txt user1@$ip:~/Desktop
done < IPlistfile.txt
Run Code Online (Sandbox Code Playgroud)

2.安装 sshpass

这是一个漂亮的小程序,允许您将ssh密码作为命令行参数传递。显然,这不是一个非常安全的解决方案,我强烈建议您阅读man sshpass.

无论如何,它可能在您的发行版存储库中可用,在基于 Debian 的系统上可以安装它

sudo apt-get install sshpass
Run Code Online (Sandbox Code Playgroud)

我无法检查,因为我没有基于 RedHat 的机器,但据我在这里搜索可以看出,它应该可以安装在 Fedora 上

sudo yum install sshpass
Run Code Online (Sandbox Code Playgroud)

安装完成后,您可以简单地运行

SSHPASS='password'
while read ip; do
  sshpass -e scp /home/user1/Desktop/filetobesent.txt user1@$ip:~/Desktop
done < IPlistfile.txt
Run Code Online (Sandbox Code Playgroud)

-e选项告诉sshpassSSHPASS变量中获取密码。这比将其作为-p选项的参数更安全一些。

重要的:

如果您正在连接的服务器未知,或者其公钥未存储在您的机器中,这将静默失败。如果这似乎不起作用,只需连接一次(sshscp)到远程机器并接受其公钥。

3.pscp改用

pscpscp接受密码作为命令行参数的替代方法。在基于 Debian 的系统上,这可以安装

sudo apt-get install putty-tools
Run Code Online (Sandbox Code Playgroud)

正如我之前所说,我无法检查,但它应该可以在 Fedora 上安装

sudo yum install putty
Run Code Online (Sandbox Code Playgroud)

然后你可以复制你的文件

while read ip; do
  pscp -pw password /home/user1/Desktop/filetobesent.txt user1@$ip:~/Desktop
done < IPlistfile.txt
Run Code Online (Sandbox Code Playgroud)