如何自动为rsync SSH命令传递密码?

时间:2010-07-21 13:51:11

标签: ssh passwords rsync

我需要rsync执行ssh并希望自动执行,而无需手动传递ssh密码。

13 个答案:

答案 0 :(得分:83)

使用“sshpass”非交互式ssh密码提供程序实用程序

在Ubuntu上

 sudo apt-get install sshpass

rsync命令

 /usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p password ssh -o StrictHostKeyChecking=no -l username" src_path  dest_path

答案 1 :(得分:41)

对于脚本化的ssh登录,您应该使用没有密码的密钥文件。这显然是一个安全风险,请注意密钥文件本身是否足够安全。

Instructions for setting up passwordless ssh access

答案 2 :(得分:24)

您可以通过将环境变量rsync设置为您要使用的密码或使用RSYNC_PASSWORD选项来避免--password-file命令上的密码提示。

答案 3 :(得分:12)

如果您无法使用公钥/私钥,则可以使用expect:

#!/usr/bin/expect
spawn rsync SRC DEST
expect "password:"
send "PASS\n"
expect eof
if [catch wait] {
    puts "rsync failed"
    exit 1
}
exit 0

您需要将SRC和DEST替换为正常的rsync源和目标参数,并用您的密码替换PASS。只需确保此文件安全存储!

答案 4 :(得分:6)

使用ssh密钥。

查看ssh-keygenssh-copy-id

之后你可以这样使用rsync

rsync -a --stats --progress --delete /home/path server:path

答案 5 :(得分:6)

另一个有趣的可能性:

  1. 生成RSA或DSA密钥对(如上所述)
  2. 将公钥放入主机(如已经描述的那样)
  3. 运行:
  4. rsync --partial --progress --rsh="ssh -i dsa_private_file" host_name@host:/home/me/d .
    

    注意: -i dsa_private_file 这是您的RSA / DSA私钥

    基本上,这种方法与@Mad Scientist描述的方法非常相似,但是您不必将私钥复制到〜/ .ssh。换句话说,它对临时任务(一次无密码访问)非常有用

答案 6 :(得分:4)

我这样算:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir

答案 7 :(得分:3)

虽然你现在已经实现了它,

你也可以使用任何expect实现(你可以在Perl中找到替代品,Python:pexpect,paramiko等等。)

答案 8 :(得分:3)

以下适用于我:

SSHPASS='myPassword'
/usr/bin/rsync -a -r -p -o -g --progress --modify-window=1 --exclude /folderOne -s -u --rsh="/usr/bin/sshpass -p $SSHPASS ssh -o StrictHostKeyChecking=no -l root"  source-path  myDomain:dest-path  >&2

我必须安装sshpass

答案 9 :(得分:2)

自动输入rsync命令的密码很困难。我避免此问题的简单解决方案是挂载要备份的文件夹。然后使用本地rsync命令备份已安装的文件夹。

mount -t cifs //server/source/ /mnt/source-tmp -o username=Username,password=password
rsync -a /mnt/source-tmp /media/destination/
umount /mnt/source-tmp

答案 10 :(得分:2)

我使用VBScript文件在Windows平台上执行此操作,它非常适合我。

set shell = CreateObject("WScript.Shell")
shell.run"rsync -a Name@192.168.1.100:/Users/Name/Projects/test ."
WScript.Sleep 100
shell.SendKeys"Your_Password"
shell.SendKeys "{ENTER}"

答案 11 :(得分:0)

此处提供的示例提供了替代解决方案,和/或官方或非官方的解决方案不完整。如果需要设置ssh和公共密钥身份验证的帮助,我将使用教程@MadScientist。但是关于将rsync与ssh和公钥身份验证一起使用,这是我和其他许多人在这里和其他地方所引起的,这是两个带有显式路径示例和条目的示例,因此人们可以根据自己的需求进行调整而无需解释钝bash表示法。

从目标备份计算机执行此操作,该计算机从源备份拉到目标备份

rsync -avWeqr --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' user@10.1.999.3:/home/user/Server/ /home/keith/Server/

从源计算机执行此操作,然后从源计算机发送到目标备份

rsync -avWeqr --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ user@10.1.999.3:/home/user/Server/

由于ssh公共密钥身份验证是此问题的答案,因此解决方案是告诉rsync在哪里定位与目标服务器上授权的公共密钥相匹配的私有密钥。如果您是安全狂,则可以在每端创建特定的ssh密钥,甚至可以为rsync使用创建与用户不同的独特密钥。但这有点复杂,如果这些主机位于安全LAN上的防火墙后面,则不需要。在这种情况下,我建议在两台计算机上使用相同的ssh公共/专用密钥对。

此外,我可能会补充说,初始rsync标志在一定程度上是可选的,但是我需要特定的安排-avWeqr才能使--delete与其他所有标签一起正常工作参数。这些已经在Debian 9.7上进行了测试,并且可以正常工作。

答案 12 :(得分:-1)

根据Andrew Seaford发布的想法,这是使用sshfs:

完成的
echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin
rsync -a /mnt/source-tmp/ /media/destination/
umount /mnt/source-tmp