【问题标题】:How to pass password automatically for rsync SSH command?如何为 rsync SSH 命令自动传递密码?
【发布时间】:2011-03-19 00:22:38
【问题描述】:

我需要通过ssh 执行rsync 并希望自动执行此操作,而无需手动为ssh 传递密码。

【问题讨论】:

  • 每次传输或登录 ssh 时提示 pypass 密码的最简单方法是创建一个密钥,以下是您可以分两步执行此操作的方法brightery.com/en/post/…
  • 另外,补充一下,如果你不想提示输入密码是因为你需要 rsync 很多文件,更好的解决方案是将所有文件存储在一个 txt 列表中只需传递选项--files-from= 这样它只会提示一次

标签: ssh passwords rsync


【解决方案1】:

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

Instructions for setting up passwordless ssh access

【讨论】:

  • 不能在命令文本中输入密码?
  • 不容易,ssh中没有选项
  • 应该注意,这并不总是可以做到的(例如,许多android ssh服务器实现非常有限)。
  • @Ponkadoodle OP 是关于客户端请求,而不是服务器端。 ssh -i 应该始终可以在客户端使用。您的意思是服务器可能不支持所有密钥类型(例如 ECDSA)?不过,这不是主要问题,只是使用ssh-keygen -t 的一个例子。我错过了什么吗?
  • 虽然这可能看起来很麻烦,但这是正确的答案。密码是敏感信息,不应明文存储或在程序中随意使用。这就是密钥文件的用途;只需了解identity files, rsync -e and ssh -i
【解决方案2】:

使用 ssh 密钥。

看看ssh-keygenssh-copy-id

之后您可以通过这种方式使用rsync

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

【讨论】:

  • 如果我在 ssh 中使用密钥,我会写: ssh u@serv -i ./rsa 但是如何在 rsync 中做到这一点?
  • 如果您将密钥放入您的 .ssh 目录并给它一个标准名称(通常是 id_rsa / id_rsa.pub),它将被 rsync 自动拾取。
【解决方案3】:

虽然你现在已经实现了,

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 仅在目标服务器运行 rsync 守护进程时才有效
    • 尽管除非使用 rsync 守护程序,否则此答案无济于事,但 Google 将我带到了这里,这正是我所需要的。对我来说,我需要直接 rsync 到 rsyncd,不需要 ssh。我刚刚使用了密码文件选项,并且非常适合脚本。
    • 以及如何在命令中准确使用它?任何示例命令?
    【解决方案5】:

    使用“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
    

    【讨论】:

    • 我知道这不是最佳实践,但我有一个 NAS 的 SSHD 无法执行基于密钥的身份验证。这个答案是我的自动备份难题中缺少的部分。所以 +1 最后的答案
    • 如果您不能使用密钥文件,但又不想在命令中包含密码,您可以将其写入临时文件并像这样包含:sshpass -p`cat .password` ssh [...]。然后通过chmod 400 .password 保护您的.password 文件,以确保只有您的用户可以阅读它。
    • 为了完整起见,在 ssh 到远程服务器的情况下,src_path 应该是 server:path,如下所示:server01.mydomain.local:/path/to/folder
    • 这绝对是正确的答案!它允许您在没有 ssh 魔法的情况下编写脚本,只需编写脚本即可。 ;) 荣誉@Rajendra
    • 由于-a开启rsync包括-rlptgoD,你可以像这样缩短命令:rsync -az ...
    【解决方案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。换句话说,它对于临时任务(一次性无密码访问)很有用

    【讨论】:

      【解决方案7】:

      如果你不能使用公钥/私钥,你可以使用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 替换为您的密码。请确保此文件已安全存储!

      【讨论】:

      • 我的Red Hat Enterprise Linux Server release 5.11 (Tikanga)上没有这些命令
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        按照 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
        

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

            以下对我有用:

            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

            【讨论】:

            • -a 已经暗示了 -rlptgoD,一般来说,在这里减少命令行会更有帮助。
            【解决方案12】:

            我让它像这样工作:

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

            【讨论】:

            • remote_port_ssh 会被设置成什么?它看起来像一个实际值的占位符。
            • @MaxWilliams 如果您的远程服务器 SSH 服务器在不同的端口上运行(应该),您可以更改 remote_port_ssh。如果它在默认端口上运行,您可以跳过这部分。
            • 那么我们是否必须将remote_port_ssh 替换为一个值或保持这样的状态?
            • 如果服务器端口是22,则丢弃,否则可以指定特定端口
            【解决方案13】:

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

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

            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 配置,并通过发送 @987654326 来验证源用户和目标用户各自拥有其他人各自的公共 ssh 密钥@。

            (同样,这是使用没有密码的 ssh 密钥对作为替代方法,not 用于通过文件传递密码。)

            【讨论】:

            • 还有一个重要的注意事项是,在备用端口示例中,您将 ssh 定向到您的私钥文件,并且当它在目标上执行命令时,它将根据其公钥进行身份验证。跨度>
            【解决方案14】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-09-29
              • 2017-06-17
              • 2012-09-02
              • 1970-01-01
              • 1970-01-01
              • 2015-05-31
              相关资源
              最近更新 更多