通过bash中的while循环执行Rsync ssh文件传输时显示错误



我的程序需要自动文件传输到许多远程系统。所以尝试使用期望的RSYNC SSH文件传输。当我运行时。通过终端提供必要的输入,或者通过一个包含传递值的简单bash脚本执行文件,它运行良好。

但是我想调用。ex文件通过RSYNC传输文件到100多台机器后,从数据库检查,所以我需要通过一些循环运行脚本,动态填充变量…

MY .ex文件:

#!/usr/bin/expect -f

set pass [lindex $argv 0]
set server [lindex $argv 1]
set name [lindex $argv 2]
set addr [lindex $argv 3]

set timeout -1
spawn rsync -e "ssh -q -o StrictHostKeyChecking=no" ${addr}  ${name}@${server}:/home/deba/

expect {
-re ".*Are.*.*yes.*no.*" {
send "yesn"
exp_continue
#look for the password prompt
}
"*?assword:*" {
send ${pass}
send "n"
interact
#The expect command will now return
}
}

显示错误的Bash脚本:

#!/bin/bash
cat /home/deba/content_sync/test/result_remote/sync_Dest_List.txt  | while read  line2
do
java -cp .:mysql-connector-java-5.1.24-bin.jar Remote_sync_pw_ip_reciever $line2
cat /home/deba/content_sync/test/result_remote/sync_Dest_List.txt  | while read  line
# this folder contains the arguments for password and server IP  separated by space
do
IFS=" " read var1 var2 <<< "$line"

./rsync1.ex $var1 $var2 $line2 /home/deba/cron.sh 
done
done

Errors Generated:

spawn rsync -e ssh -q -o StrictHostKeyChecking=no  /home/deba/cron.sh@deba:/home/deba/
skipping directory .
rsync: mkdir "/home/deba/cron.sh@deba:/home/deba" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(605) [Receiver=3.0.9]
rsync: connection unexpectedly closed (9 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]

但是bash代码的简单调用没有显示任何错误:

#!/bin/bash
./rsync1.ex rups78 10.129.30.44 deba /home/deba/cron.sh 

请建议解决方案,使整个文件传输过程完全自动化,而不需要任何人为干扰…

提前感谢…

要弄清楚您想要做什么有点困难,但是一个简单的建议是使用ssh密钥进行无密码登录。这样做有两个优点:

  • 不需要以明文形式存储密码
  • 从您的脚本中更简单的登录过程,您很可能根本不需要期望的部分。

当然,这需要您拥有在远程服务器上安装ssh密钥的特权。假设你有这个。然后设置作业是沿着这些点:

  1. 在本地机器上生成公钥:ssh-keygen -t dsa
  2. 将生成的~/.ssh/id_dsa.pub文件复制到远程机器上的~/.ssh/authorized_keys

在步骤2中。您必须将多个文件的内容放入一个文件中,只需将它们附加在一起即可。

最新更新