我需要rsync
执行ssh
并希望自动执行,而无需手动传递ssh
密码。
答案 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登录,您应该使用没有密码的密钥文件。这显然是一个安全风险,请注意密钥文件本身是否足够安全。
答案 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-keygen
和ssh-copy-id
。
之后你可以这样使用rsync
:
rsync -a --stats --progress --delete /home/path server:path
答案 5 :(得分:6)
另一个有趣的可能性:
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