我最近问了一个question on AskUbuntu关于让ssh-agent自动保存我的密码保护密钥供以后重新使用,而不必在bash登录(非GUI/Gnome)期间重新输入密码。我收到了一个很好的bash脚本,但不幸的是,无论git操作如何,都会触发它请求密码。我只想提示他们的密钥是否已经在ssh-agent中,并且正在执行远程git操作。如何获取远程git操作来触发ssh-agent的ssh-add事件?
这是由于我在我的bash提示中使用了$(__git_ps1 "[%s]")
来显示当前工作目录(pwd
)的git分支。所以当我进入机器时,它会立即要求我输入密钥密码,然后才能显示bash提示符!
从the answer to my question on AskUbuntu当前脚本的样子:
在~/.bash_profile
:
# File: ~/.bash_profile
# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
. ~/.profile
fi
# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
echo "Starting ssh agent"
eval $(ssh-agent -s)
agent_started=1
fi
# ssh become a function, adding identity to agent when needed
ssh() {
if ! ssh-add -l >/dev/null 2>-; then
ssh-add ~/.ssh/id_dsa
fi
/usr/bin/ssh "[email protected]"
}
export -f ssh
# another example: git
git() {
if ! ssh-add -l >/dev/null 2>-; then
ssh-add ~/.ssh/id_dsa
fi
/usr/bin/git "[email protected]"
}
export -f git
所以你可以看到git的功能被触发每个git的操作。
我以为git会使用ssh
来建立连接,但它似乎并没有触发上述脚本中的ssh()
函数。 git如何执行其ssh操作?它直接访问/ usr/bin/ssh而不是依赖bash路径吗?
你有没有更好的方法来做到这一点或为当前脚本一个很好的解决方法?
git可执行文件/ usr/bin/git不是用bash(AFAIK)写的,所以没有理由执行你的ssh函数。 – nhed 2011-04-26 13:40:57
@nhed那是我的假设。我想知道我是否可以用bash'ssh'包装器脚本替换'/ usr/bin/ssh',这样它会被触发? – Treffynnon 2011-04-26 13:49:45
听起来很危险,git的man-page提到了一个env变量GIT_SSH--让这个指向一个包装器 - 这可能更清晰。给我一杆 – nhed 2011-04-26 19:06:05