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 地址。
我可以想到几种方法来做到这一点,但我强烈建议设置无密码ssh
访问,稍后你会感谢我。
这是迄今为止最好的方法,因为您肯定想再次连接到机器,这将使您的生活更加轻松。即使您选择使用空密码短语,这也是一种方式,比其他选项更安全,因为您不会将未加密的密码扔到周围。
首先,ssh
在你的机器上创建一个公钥:
ssh-keygen -t rsa
Run Code Online (Sandbox Code Playgroud)
系统会要求您输入密码,每次登录后第一次运行任何 ssh 命令时都会要求您输入该密码。这意味着对于多个ssh
或scp
命令,您只需输入一次。不过,您可以将其留空以获得完全无密码的访问。
生成公钥后,将其复制(作为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)
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
选项告诉sshpass
从SSHPASS
变量中获取密码。这比将其作为-p
选项的参数更安全一些。
如果您正在连接的服务器未知,或者其公钥未存储在您的机器中,这将静默失败。如果这似乎不起作用,只需连接一次(ssh
或scp
)到远程机器并接受其公钥。
pscp
改用pscp
是scp
接受密码作为命令行参数的替代方法。在基于 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)
归档时间: |
|
查看次数: |
28211 次 |
最近记录: |