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


111

我需要做rsyncssh并且想要自动进​​行操作,而无需ssh手动传递密码。

Answers:


44

对于脚本化的ssh登录,应使用不带密码的密钥文件。这显然是安全隐患,请注意密钥文件本身已得到充分保护。

设置无密码ssh访问的说明


9
有没有可能在命令文本中输入密码?
liysd

3
不容易,ssh中没有它的选择
疯狂科学家

应当指出,这并非总是可以做到的(例如,许多android ssh服务器的实现都非常有限)。
Ponkadoodle

@Ponkadoodle OP是关于客户端请求,而不是服务器端。ssh -i在客户端始终应该是可能的。您是说服务器可能不支持所有密钥类型(例如ECDSA)吗?不过,这不是主要问题,仅是使用的一种情况ssh-keygen -t。我想念什么吗?
乔纳森·H

1
虽然乍一看似乎很麻烦,但这是正确的答案。密码是敏感信息,不应将其明确存储或在程序中粗心使用。这就是密钥文件的用途;只是了解身份文件,rsync -e以及ssh -i
乔纳森·H

94

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

在Ubuntu上

 sudo apt-get install sshpass

命令同步

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

4
我知道这不是最佳做法,但是我的NAS的SSHD严重受损,无法进行基于密钥的身份验证。这个答案是我的自动备份难题的缺失部分。因此,+ 1是最后一个答案
Mike Gossmann

8
如果你不能使用一个密钥文件,但不想在命令中包括密码,你可以记录到一个临时文件,包括像这样:sshpass -p`cat .password` ssh [...]。然后.password通过chmod 400 .password确保您的用户只能阅读它来保护您的文件。
lutuh 2015年

5
为了完整起见,在ssh到远程服务器的情况下,src_path应该是server:path,如下所示:server01.mydomain.local:/path/to/folder
harperville

这绝对是正确的答案!它使您无需使用ssh魔术就能编写脚本,而只需编写一个脚本即可。;)恭维@Rajendra
真正的faf

1
由于-a启用rsync包括在内-rlptgoD,因此您可以缩短以下命令:rsync -az ...
Jannie Theunissen

24

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


41
仅在目标服务器运行了rsync守护程序的情况下才起作用
Darryl Hebbes

4
即使除非使用rsync守护程序,否则该答案都无济于事,Google将我放在了这里,而这正是我所需要的。对我来说,我需要直接将rsync转换为rsyncd,而无需ssh。我只是使用password-file选项,并且非常适合脚本。
gregthegeek 2014年

14

如果您不能使用公钥/私钥,则可以使用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

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


3
这些命令在我Red Hat Enterprise Linux Server release 5.11 (Tikanga)
至2015年

13

我让它像这样工作:

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

remote_port_ssh被设置为什么?它看起来像是实际值的占位符。
Max Williams

6

使用ssh键。

看看ssh-keygenssh-copy-id

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

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

如果我在ssh中使用密钥,我会写:ssh u @ serv -i ./rsa但是如何在rsync中做到这一点?
liysd

2
如果将密钥放入.ssh目录并为其指定标准名称(通常为id_rsa / id_rsa.pub),则rsync将自动将其拾取。
Craig Trader 2010年

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。换句话说,它对于临时任务(一次无密码访问)很有用。


5

以下对我有用:

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


2
-a已经暗示了-rlptgoD,通常,在此处使用简化的命令行会更有帮助。
基督徒

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


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}"

2

当我第一次访问时,官方解决方案(和其他解决方案)并不完整,因此,几年后,我回来发布了这种替代方法,以防万一其他人打算使用公共/私有密钥对:

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

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


还有一个重要的注意事项是,在备用端口示例中,您将ssh定向到您的私钥文件,并且当它在目标上执行命令时,它将根据其公钥进行身份验证。
oemb1905 '19

-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
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.