127

我需要做并且想要自动做而不需要手动传递rsync密码。sshssh

4

14 回答 14

117

使用“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
于 2013-10-24T15:55:17.023 回答
52

对于脚本化的 ssh 登录,您应该使用不带密码的密钥文件。这显然是一个安全风险,请注意密钥文件本身是否受到充分保护。

设置无密码 ssh 访问的说明

于 2010-07-21T13:53:47.027 回答
35

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

于 2013-01-11T20:54:28.917 回答
19

我让它像这样工作:

sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir  remote_user@remote_host:/remote_dir
于 2018-10-19T08:30:15.897 回答
16

如果你不能使用公钥/私钥,你可以使用期望:

#!/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 替换为您的密码。只需确保此文件已安全存储!

于 2015-01-31T01:22:37.000 回答
6

使用 ssh 密钥。

ssh-keygenssh-copy-id

之后,您可以使用rsync这种方式:

rsync -a --stats --progress --delete /home/path server:path
于 2010-07-21T13:54:34.957 回答
6

另一个有趣的可能性:

  1. 生成 RSA 或 DSA 密钥对(如前所述)
  2. 将公钥放到主机上(如前所述)
  3. 跑:
rsync --partial --progress --rsh="ssh -i dsa_private_file" host_name@host:/home/me/d 。

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

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

于 2014-06-24T21:04:02.877 回答
6

以下对我有用:

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

于 2017-09-08T12:50:45.730 回答
4

自动输入 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
于 2016-03-29T19:56:32.297 回答
3

虽然你现在已经实现了,

您还可以使用任何期望实现(您会在 Perl、Python 中找到替代方案:pexpect、paramiko 等。)

于 2011-01-12T16:36:54.740 回答
3

当我第一次访问时,官方解决方案(和其他解决方案)不完整,所以几年后我回来发布这种替代方法,以防任何其他人在这里结束打算使用公钥/私钥对:

从目标备份机器执行此操作,该机器从源备份到目标备份

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 密钥对作为替代方法,而不是通过文件传递密码。)

于 2019-04-10T01:49:07.337 回答
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}"
于 2016-11-23T18:55:37.417 回答
1

在命令中公开密码是不安全的,尤其是在使用 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;

于 2021-08-30T08:23:10.403 回答
-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
于 2016-06-04T07:13:09.157 回答