带有密码的 sh 脚本中的 scp

Ste*_*old 7 scp passphrase

我有一个用于备份的 sh 脚本

scp /mybackupdir/* backupuser@backupserver:/backup
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以向 scp 添加密码?或者我是否必须检查 ssh-agent 是否正在运行,如果没有启动并添加密钥?

Nav*_*ern 6

您不能通过参数向 scp 提供密码。

但是,您可以通过密钥使用身份验证: ssh-keygen 将生成用于身份验证的 rsa 密钥对 ssh-copy-id 将您的公钥复制到另一台主机。

如果您不能或不想通过密钥使用身份验证,那么您可以编写期望脚本并从此脚本中提供密码。这不是最安全的实现方式!


Nil*_*ann 6

首先,让我们梳理一些容易混淆的事实:

  • SSH(以及因此的 scp)支持各种身份验证方法。目前最流行的两个是“password”和“publickey”
  • 若用“公钥”,那么客户端必须有一个私人公共密钥文件[1]。所述私人一个可以或可以不被使用密码加密
  • 当使用“publickey”方法时,ssh-agent 可以在内存中保存私钥。当私钥文件被加密并且不想一次又一次地输入其密码时,这会很方便。但是 ssh-agent 在使用基于密码的身份验证方法时没有帮助。

在 SSH 的上下​​文中,当人们使用术语...

  • ... “密码”,它们通常是指基于密码的身份验证方法
  • ...“密码短语”,它们通常表示私钥文件加密的密码短语

...但当然这只是一个约定和一个很大的混乱来源。


也就是说,我试着回答你的问题:

如果您的意思是基于密码的 SSH 身份验证

  • 使用允许以批处理模式提供 SSH 密码的客户端软件(例如作为命令行选项、作为 STDIN 或作为环境变量)。OpenSSH 不支持这个!
  • 或者在 ssh/scp 周围包裹一个“期望”脚本,如 [2] 中所述。
  • 或者从基于密码的身份验证切换到公钥身份验证。

如果您的意思是使用密码短语加密的私钥文件进行公钥身份验证

  • 从私钥文件中删除密码保护,参见例如 [3]。
  • 或者手动将密钥预加载到 ssh-agent 中,并确保 (a) 脚本运行时 ssh-agent 仍处于活动状态,以及 (b) 脚本可以找到代理的 unix 套接字 ($SSH_AUTH_SOCK)

  • [1] 在 OpenSSH 的情况下,例如 ~/.ssh/id_dsa 和 ~/.ssh/id_dsa.pub。后者的内容应该附加到服务器端的 ~/.ssh/authorized_keys
  • [2] /sf/ask/1337131561/
  • [3] /sf/ask/7867751/