我目前在我的 Linux 服务器上运行一个 bash 脚本,每周一次遍历我的存储库,执行一些任务并远程备份它们。
今天我也开始备份一些远程存储库。我的计划是能够在备份 bash 脚本中在 for 循环内运行类似 (cd $dir && git pull origin master 2>> $LOGFILE) 的命令。我似乎遇到的问题是,我正尝试从 github 提取一些东西,这需要先解锁我的私钥文件才能继续。有什么方法可以让我预先提供该密码,以便我不会得到输入密码的交互式提示?
答案1
使用SSH 代理转发。您必须在初始机器上使用代理;您还必须在客户端和 Linux 服务器上启用代理转发。
假设周围都有 OpenSSH:
test -z "$SSH_AUTH_SOCK" && eval "$(ssh-agent)"
ssh-add -f /path/to/your/key-accepted-by-GitHub
ssh-add -f /path/to/your/key-accepted-by-your-user-on-the-linux-box
ssh -A userName@theLinuxBox /path/to/the/script
这sshd在您的服务器(“yourLinuxBox”)上必须允许代理转发(AllowAgentForwarding
在其 sshd_config 文件中;如果不存在,通常默认为“是”)。
在您的本地代理持有 GitHub 密钥并通过 SSH 连接将代理转发到 Linux 机器的情况下,任何正常使用远程控制在需要密钥的 Linux 机器上(例如git pull) 就能够使用。
或者,您可以使用您的条目.ssh/config
来指定“第一站”的位来缩写最后两个命令ssh backup-server /path/to/the/script
(您仍然必须确保 GitHub 密钥已添加到您的本地代理):
Host backup-server
HostName theLinuxBox # name or IP
User userName # username on remote system
IdentityFile /path/to/key-accepted-by-your-user-on-the-linux-box
ForwardAgent yes
笔记:不要启用代理转发到不受信任的服务器(服务器上的根可以使用其本地访问权限来使用存储在本地代理中的密钥)。
答案2
我认为以其他用户身份进行备份是一个更好的主意,因为您的私钥可能也允许访问其他地方。为该用户提供一个没有密码的私钥 ssh 密钥,并在您的脚本中使用该用户。在远程 git 服务器上,您可以限制其他用户的权限,以便只能提取您的 git 存储库。