使用密码在 sh 脚本内进行 scp

使用密码在 sh 脚本内进行 scp

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

scp /mybackupdir/* backupuser@backupserver:/backup

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

答案1

首先我们来理清几个容易混淆的事实:

  • SSH(以及 scp)支持各种身份验证方法。目前最流行的两种方法是“密码”和“公钥”
  • 如果使用“publickey”,那么客户端必须有一个私人的和一个民众密钥文件 [1]。私人的可以使用或不使用密码加密
  • 当使用“publickey”方法时,ssh-agent 可以将私钥保存在内存中。当私钥文件已加密并且用户不想反复输入其密码时,这非常方便。但是当使用基于密码的身份验证方法时,ssh-agent 毫无帮助。

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

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

...但这当然只是一种惯例,也是造成混乱的一个很大原因。


话虽如此,我还是尝试回答你的问题:

如果你指的是基于密码的 SSH 身份验证

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

如果你指的是使用密码加密的私钥文件进行公钥认证

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

答案2

您不能向 scp 提供带有参数的密码。

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

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

答案3

你应该读一下这篇文章:

使用 ssh-keygen 进行无密码 SSH 登录的 3 个步骤

您可以将脚本更改为:

rsync --rsh='ssh -p(Type your SSH port)' -av /yourBackupDir [email protected]:/backup | mail -s "backup on `hostname`" [email protected]

答案4

如果您不想询问密码,请在使用 ssh-keygen 创建(rsa)密钥对(公钥-私钥)时输入空密码(这不是源系统或远程客户系统的密码)。

相关内容