如何在不使用密码提示的情况下不使用公共密钥身份验证来进行同步?


44

我需要执行rsync,而不会提示我输入密码。

我在rsync联机帮助页中看到它不允许将密码指定为命令行参数。
但是我注意到它允许通过变量指定密码RSYNC_PASSWORD

因此,我尝试导出变量,但rsync一直要求我提供密码。

export RSYNC_PASSWORD="abcdef"
rsync root@1.2.3.4:/abc /def

我究竟做错了什么?

请考虑:

换句话说,我需要使RSYNC_PASSWORD方法起作用!:-)


您是否在远程服务器上启用了rsync守护进程?
Rahul Patil 2014年

Answers:


13

此密码环境变量仅在使用rsync协议时显示:

rsync rsync://username@1.2.3.4:/abc /def

为此,您还需要将rsync作为守护程序(--daemon选项)运行,这通常使用来完成inetd.conf

使用此协议时,abc应对应于中定义的目标/etc/rsyncd.conf。用户名应该出现在auth users该目标的一行中,并且应该使用该secrets file选项指定密码文件。

此机密文件包含以下格式的用户名和密码之间的映射:

username:password

您可以使用RSYNC_PASSWORD环境变量指定该密码。


运行rsync服务器的一种快速方法是https://s3.amazonaws.com/skaperen/rsend
Skaperen 2015年

65

如果rsync守护程序不在目标计算机上运行,​​并且您不希望向本地计算机上的所有人公开密码(为什么有人不应该在命令行中使用密码?),则可以使用sshpass

 sshpass -p "password" rsync root@1.2.3.4:/abc /def

注意命令开始处的空格,在bash外壳中,这将阻止命令(和密码)存储在历史记录中。我不建议使用该RSYNC_PASSWORD变量,除非绝对必要(根据对该答案的先前编辑),我建议禁止历史记录存储,或者至少在之后清除历史记录。此外,您可以tput reset用来清除终端历史记录。


2
为什么你会建议的命令添加密码的明文,这是很糟糕的Linux管理员101
埃迪-

超级方便..一直在寻找一种方法。谢谢。
艾萨克·格雷格森

6
虽然很难以明文形式添加密码,但这是目前唯一合理的简单方法。
Weston Ganger

15
你总是可以做这样的事情:sshpass -p $(cat passFile) ..隐藏在bash历史清关,,和chmod的密码文件400来保护它
克雷西米尔Pendic

3
我知道它已经很老了,但是为了新手读者,引用密码-密码可以包含特殊字符和空格。-p "$RSYNC_PASSWORD"
帕迪·兰道

16

您可以使用标准的ssh身份进行无密码登录。如果有~/.ssh/id_rsa或类似符号,默认情况下会处理此问题,但是您也可以将自己的路径硬编码为授权密钥对的私钥。

这样就可以在不暴露密码的情况下进行批处理/脚本编写,并且如果私钥遭到破坏,则可以从目标服务器中删除公钥。

rsync -e"ssh -i /path/to/privateKey" -avR $sourcedir ${ruser}@${rhost}:~/${rdir}/

您也可以添加参数,例如-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null不强制执行远程主机密钥验证。!警告-在中间攻击时开放人,这是普遍的不良做法!


1
如果您要在Windows 10上使用新的Bash shell,这将特别有用。我想知道为什么rsync不能无密码地工作。我意识到它正在使用~/.ssh外壳内的文件夹(rsync所在的文件夹)。一旦我使用-e指向里面的键/mnt/c/Users/MyUsername/.ssh,它就会按预期工作。(感谢:D)
Toby Deshane

12

对于脚本编写非常有用的是使用--password-file命令行选项。

  • 创建一个名为rsync_pass的空文件
  • 将密码写入此文件(仅此而已)
  • chmod 600 rsync_pass
  • rsync $args --password-file=rsync_pass user@rsynchost::/share localdirectory

这可以用于脚本编写,并且比将密码导出到系统变量更安全。


4
读者注意:这也需要在服务器上运行rsync守护程序。我真的希望ssh密钥足以实现无密码的rsync。
Sridhar Sarnobat,2015年

恕我直言,这是唯一的正确方法,如果不想使用ssh。
maxf130

这个答案最
合理
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.