我有一个用于备份的 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)
- [1] 对于 OpenSSH,例如 ~/.ssh/id_dsa 和 ~/.ssh/id_dsa.pub。后者的内容应附加到服务器端的 ~/.ssh/authorized_keys
- [2]https://stackoverflow.com/questions/19101879/bash-expect-script-for-ssh
- [3]https://stackoverflow.com/questions/112396/how-do-i-remove-the-passphrase-for-the-ssh-key-without-having-to-create-a-new-ke
答案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)密钥对(公钥-私钥)时输入空密码(这不是源系统或远程客户系统的密码)。