我需要做并且想要自动做而不需要手动传递rsync
密码。ssh
ssh
14 回答
使用“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
对于脚本化的 ssh 登录,您应该使用不带密码的密钥文件。这显然是一个安全风险,请注意密钥文件本身是否受到充分保护。
您可以rsync
通过将环境变量设置为RSYNC_PASSWORD
您要使用的密码或使用--password-file
选项来避免命令上的密码提示。
我让它像这样工作:
sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir remote_user@remote_host:/remote_dir
如果你不能使用公钥/私钥,你可以使用期望:
#!/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 替换为您的密码。只需确保此文件已安全存储!
使用 ssh 密钥。
看ssh-keygen
和ssh-copy-id
。
之后,您可以使用rsync
这种方式:
rsync -a --stats --progress --delete /home/path server:path
另一个有趣的可能性:
- 生成 RSA 或 DSA 密钥对(如前所述)
- 将公钥放到主机上(如前所述)
- 跑:
rsync --partial --progress --rsh="ssh -i dsa_private_file" host_name@host:/home/me/d 。
注意:-i dsa_private_file这是您的 RSA/DSA 私钥
基本上,这种方法与@Mad Scientist 描述的方法非常相似,但是您不必将私钥复制到 ~/.ssh。换句话说,它对于临时任务(一次性无密码访问)很有用
以下对我有用:
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
自动输入 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
虽然你现在已经实现了,
您还可以使用任何期望实现(您会在 Perl、Python 中找到替代方案:pexpect、paramiko 等。)
当我第一次访问时,官方解决方案(和其他解决方案)不完整,所以几年后我回来发布这种替代方法,以防任何其他人在这里结束打算使用公钥/私钥对:
从目标备份机器执行此操作,该机器从源备份到目标备份
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' user@10.9.9.3:/home/user/Server/ /home/keith/Server/
从源机器执行此操作,该机器从源发送到目标备份
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ user@10.9.9.3:/home/user/Server/
而且,如果您没有为 ssh 使用备用端口,请考虑以下更优雅的示例:
从目标备份机器执行此操作,该机器从源备份到目标备份:
sudo rsync -avi --delete user@10.9.9.3:/var/www/ /media/sdb1/backups/www/
从源机器执行此操作,该机器从源发送到目标备份:
sudo rsync -avi --delete /media/sdb1/backups/www/ user@10.9.9.3:/var/www/
如果仍然提示您输入密码,那么您需要检查您的 ssh 配置,/etc/ssh/sshd_config
并验证源和目标中的用户是否都拥有其他人各自的公共 ssh 密钥,方法是使用ssh-copy-id user@10.9.9.3
.
(同样,这是使用没有密码的 ssh 密钥对作为替代方法,而不是通过文件传递密码。)
我使用 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}"
在命令中公开密码是不安全的,尤其是在使用 bash 脚本时,如果您尝试使用密钥文件,那就太好了。使用在您的主机中创建密钥ssh-keygen
并复制公钥ssh-copy-id "user@hostname.example.com
,然后使用 rsync 添加选项-e "ssh -i $HOME/.ssh/(your private key)"
以通过您之前创建的私钥使用 ssh 连接强制 rsync。
例子 :
rsync -avh --exclude '$LOGS' -e "ssh -i $HOME/.ssh/id_rsa" --ignore-existing $BACKUP_DIR $DESTINATION_HOST:$DESTINATION_DIR;
按照 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