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

我需要做 rsyncssh,并希望这样做自动无需通过密码的 ssh手动需要。

358049 次浏览

对于脚本化的 ssh 登录,您应该使用一个没有密码的密钥文件。这显然是一个安全风险,要注意密钥文件本身是充分安全的。

设置无密码 ssh 访问的说明

使用 ssh 键。

看看 ssh-keygenssh-copy-id

之后,你可以这样使用 rsync:

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

虽然你现在已经实现了,

您还可以使用任何 期待实现(您可以在佩尔、 Python 中找到替代方案: pExpt、 parmiko 等)

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

使用“ 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. 生成 RSA 或 DSA 密钥对(如前所述)
  2. 将公钥放到主机上(如前所述)
  3. 运行:
rsync --partial --progress --rsh="ssh -i dsa_private_file" host_name@host:/home/me/d .

注意: 我是 dsa _ private _ file是您的 RSA/DSA 私钥

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

如果不能使用公钥/私钥,可以使用 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 替换为密码。只要确保这个文件存储安全!

自动输入 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

遵循 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

我使用 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}"

下面这些对我有用:

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

我让它这样工作:

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

当我第一次访问时,官方的解决方案(以及其他方案)是不完整的,所以多年后,我回来发布了这个替代方案,以防万一有其他人在这里打算使用公钥/私钥对:

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

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/

如果仍然有人提示您输入密码,那么您需要检查 /etc/ssh/sshd_config中的 ssh 配置,并通过使用 ssh-copy-id user@10.9.9.3发送源和目标中的用户,验证它们各自拥有其他用户各自的公共 ssh 密钥。

(同样,这是为了使用不带密码的 ssh 密钥对作为替代方法,而 不是是为了通过文件传递密码。)

在命令中公开密码是不安全的,特别是在使用 bash 脚本时,如果您尝试使用密钥文件,那将非常好。 使用 ssh-keygen在主机中创建密钥,并使用 ssh-copy-id "user@hostname.example.com复制公钥,然后使用 rsync addin 选项 -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;

这是一个使用 gpg 加密密码的安全解决方案。

1. 使用以下命令在与 rsync 脚本相同的文件夹中创建一个. secret 文件,其中包含您的密码:

echo 'my-very-secure-password' > .secret

请注意,为了额外的安全性,默认情况下该文件是隐藏的。

2. 使用以下 gpg 命令加密密码文件,并按照提示操作:

gpg -c .secret

这将创建另一个名为. secret. gpg 的文件。您的密码现在已经加密。

3. 删除纯文本密码文件

rm .secret

4. 最后在 rsync 脚本中使用 gpg 和 sshpass,如下所示:

gpg -dq secret.gpg | sshpass rsync -avl --mkpath /home/john user_name@x.x.x.x/home

该示例使用 IP x.x.x.x 将名为 john 的用户的整个主文件夹同步到远程服务器