使用shell脚本自动执行scp文件传输

我的unix系统上有一个目录中有n个文件。 有没有办法编写一个shellcript,将所有这些文件通过scp传输到指定的远程系统。 我将在脚本中指定密码,以便我不必为每个文件input密码。

而不是在shell脚本中对密码进行硬编码,而是使用SSH密钥,更加简单和安全。

$ scp -i ~/.ssh/id_rsa devops@myserver.org:/path/to/bin/*.derp . 

假设你的私钥在~/.ssh/id_rsa

要生成公钥/私钥对,请执行以下操作:

 $ ssh-keygen -t rsa 

以上将生成2个文件, ~/.ssh/id_rsa (私钥)和~/.ssh/id_rsa.pub (公钥)

要设置使用的SSH密钥(一次性任务):复制~/.ssh/id_rsa.pub的内容,并粘贴到myserver.org服务器中的~devops/.ssh/authorized_keys的新行。 如果~devops/.ssh/authorized_keys不存在,请随时创build它。

一个清晰的如何指导可在这里 。

 #!/usr/bin/expect -f # connect via scp spawn scp "user@example.com:/home/santhosh/file.dmp" /u01/dumps/file.dmp ####################### expect { -re ".*es.*o.*" { exp_send "yes\r" exp_continue } -re ".*sword.*" { exp_send "PASSWORD\r" } } interact 

http://blogs.oracle.com/SanthoshK/entry/automate_linux_scp_command

你也可以使用rsync。 它似乎更好的多个文件比scp恕我直言。

  rsync -avzh / path / to / dir / user @ remote:/ path / to / remote / dir / 

更新

您可以通过添加'-e'开关通过ssh使用rsync:

  rsync -avzh -e ssh / path / do / dir / user @ remote:/ path / to / remote / dir / 
 #!/usr/bin/expect -f spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp expect "password:" send "wifinetworks\r" expect "*\r" expect "\r" 

你为什么不试试这个?

 password="your password" username="username" Ip="<IP>" sshpass -p "$password" scp /<PATH>/final.txt $username@$Ip:/root/<PATH> 

通配符或多个文件呢?

 scp file1 file2 more-files* user@remote:/some/dir/ 

rsync是一个程序,其行为方式与rcp相同,但具有更多选项,并使用rsync远程更新协议在目标文件更新时大大加快文件传输速度。

rsync远程更新协议允许rsync通过networking连接传输两组文件之间的差异,使用技术报告中描述的有效校验和searchalgorithm。


将文件夹从一个位置复制到另一个位置

  #!/usr/bin/expect -f spawn rsync -a -e ssh username@192.168.1.123:/cool/cool1/* /tmp/cool/ expect "password:" send "cool\r" expect "*\r" expect "\r" 

如果每次运行脚本时都input一次密码即可,可以使用SSH主连接轻松完成。

 #!/usr/bin/env bash USER_AT_HOST="user@host" # use "$1@$2" here if you like SSHSOCKET=~/".ssh/$USER_AT_HOST" # This is the only time you have to enter the password: # Open master connection: ssh -M -f -N -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" # These do not prompt for your password: scp -o ControlPath="$SSHSOCKET" file1.xy "$USER_AT_HOST":remotefile1.xy scp -o ControlPath="$SSHSOCKET" file2.xy "$USER_AT_HOST":remotefile2.xy # You can also use the flag for normal ssh: ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo hello" ssh -o ControlPath="$SSHSOCKET" "$USER_AT_HOST" "echo world" # Close master connection: ssh -S "$SSHSOCKET" -O exit "$USER_AT_HOST" 

你只能用ssh公钥/私钥来完成。 或者使用可以在其中设置密码的腻子。 scp不支持在命令行中input密码。

您可以在这里find公钥/私钥的说明: http : //www.softpanorama.org/Net/Application_layer/SSH/scp.shtml

这将工作:

 #!/usr/bin/expect -f spawn scp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no file1 file2 file3 user@host:/path/ expect "password:" send "xyz123\r" expect "*\r" expect "\r" interact 

尝试lftp

 lftp -u $user,$pass sftp://$host << --EOF-- cd $directory put $srcfile quit --EOF-- 

命令scp可以像传统的UNIX cp一样使用。 所以如果你这样做:

 scp -r myDirectory/ mylogin@host:TargetDirectory 

将工作