使用Shell脚本自动传输SCP文件


83

我的unix系统上的目录中有n个文件。有没有一种方法可以编写Shellscript,该脚本将通过scp将所有这些文件传输到指定的远程系统。我将在脚本中指定密码,这样就不必为每个文件输入密码。


2
您能告诉我在rsync中在shell脚本中使用密码是否有效,或者您是否尝试过密码?谢谢。

Answers:


88

不用在shell脚本中对密码进行硬编码,而是使用SSH密钥,它更容易且安全。

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

假设您的私钥位于,~/.ssh/id_rsa并且您要发送的文件可以使用*.derp

生成公钥/私钥对:

$ ssh-keygen -t rsa

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

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

此处提供清晰的操作指南。


1
即使按照这些说明进行操作,仍然会提示我输入密码...我是否还缺少其他标准?
scottysseus

@ScottScooterWeidenkopf可能有些错误,例如.ssh目录或authorized_keys文件可能没有正确的权限(700)。
Pradeep Pati 2015年

2
@PradeepPati我想出了我的问题。没错,问题出在权限。在您提供的链接中,作者提到了一些权限更改。我做了这些更改,现在一切正常。
scottysseus

1
为了避免与该解决方案的复制粘贴用法混淆,目前,此答案似乎是从远程转移到本地的,这与OP的意图相反。
Ciabaros

@Ciabaros好收成!我更新了答案。谢谢!
Pradeep Pati

42
#!/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


Windows用户注意事项:expectMSYS2中打包的内容将与整个输出匹配,因此第一个规则将始终匹配。如果交换两个规则的顺序,则将获得所需的行为。
fzbd

18

你为什么不试试这个呢?

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

1
#!/ usr / bin / expect -f的不错替代选择
TH_16'7

16

您也可以使用rsync。对于多个文件,它似乎比scp IMHO更好。

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 /

3
关于scpist的好处是它使用安全通道。rsync没有。

3
您可以强制rsync使用ssh:'rsync -avz -e ssh remoteuser @ remotehost:/ remote / dir / this / dir /'

@flokra。谢谢,我正好在添加该更新的过程中,并且分心了。
bsisco

9
这仍将调用交互式密码提示。我相信OP想要一个完全自动化的解决方案
Tom Auger

@Dimitri scp -r递归复制文件。它与在脚本中存储密码并通过bash脚本将其传递给scp调用无关!我不太了解您的评论。
汤姆·奥格

9
#!/usr/bin/expect -f
spawn scp -r BASE.zip abhishek@192.168.1.115:/tmp
expect "password:"
send "wifinetworks\r"
expect "*\r"
expect "\r"

可以预期用于rsync吗?我正在尝试做某事,但是我的RSA密钥方法不起作用。它不断询问我远程计算机的密码。

5

那通配符或多个文件呢?

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

4

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

rsync远程更新协议允许rsync使用此软件包随附的技术报告中所述的高效校验和搜索算法,通过网络连接仅传输两组文件之间的差异。


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

   #!/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"  

3

如果可以在每次运行脚本时都输入一次密码,则可以使用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"


1

这将起作用:

#!/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

1

这是带有.pem密钥文件的SCP的bash代码。只需将其保存到script.sh文件,然后使用“ sh script.sh”运行

请享用

#!/bin/bash
#Error function
function die(){
echo "$1"
exit 1
}

Host=ec2-53-298-45-63.us-west-1.compute.amazonaws.com
User=ubuntu
#Directory at sent destination
SendDirectory=scp
#File to send at host
FileName=filetosend.txt
#Key file
Key=MyKeyFile.pem

echo "Aperture in Process...";

#The code that will send your file scp
scp -i $Key $FileName $User@$Host:$SendDirectory || \
die "@@@@@@@Houston we have problem"

echo "########Aperture Complete#########";

0

试试lftp

lftp -u $user,$pass sftp://$host << --EOF--

cd $directory

put $srcfile

quit

--EOF--

-1

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

scp -r myDirectory/ mylogin@host:TargetDirectory

将工作


1
这似乎没有解决密码问题。
Delicia Brummitt 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.