使用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
将工作