Pat*_*ign 230 git ssh redhat bitbucket ssh-agent
我有一个站点作为远程Git repo从Bitbucket.com使用SSH别名拉.我可以在我的服务器上手动启动ssh-agent,但每次通过SSH登录时都必须这样做.
我手动启动ssh-agent:
eval ssh-agent $SHELL
Run Code Online (Sandbox Code Playgroud)
然后我添加代理:
ssh-add ~/.ssh/bitbucket_id
Run Code Online (Sandbox Code Playgroud)
然后它出现在我做的时候:
ssh-add -l
Run Code Online (Sandbox Code Playgroud)
我很高兴去.有没有办法自动化这个过程,所以我不必每次登录都这样做?服务器正在运行RedHat 6.2(Santiago).
Lit*_*mus 337
请仔细阅读这篇文章.您可能会发现这非常有用:
http://mah.everybody.org/docs/ssh
为了防止上述链接在某一天消失,我正在捕捉下面解决方案的主要部分:
Joseph M. Reagle的解决方案来自Daniel Starin:
将以下内容添加到您的
.bash_profile
SSH_ENV="$HOME/.ssh/environment"
function start_agent {
echo "Initialising new SSH agent..."
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
/usr/bin/ssh-add;
}
# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
#ps ${SSH_AGENT_PID} doesn't work under cywgin
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
Run Code Online (Sandbox Code Playgroud)
这个版本特别好看,因为它会看到你是否已经启动了ssh-agent,如果它找不到它,它将启动并存储设置,以便下次启动时它们可以使用贝壳.
sph*_*nik 83
在Arch Linux上,以下工作非常棒(应该适用于所有基于systemd的发行版):
通过将以下内容添加到以下内容来创建systemd用户服务~/.config/systemd/user/ssh-agent.service:
[Unit]
Description=SSH key agent
[Service]
Type=forking
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -a $SSH_AUTH_SOCK
[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)
安装shell以获得socket(.bash_profile, .zshrc, ...)的环境变量:
export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"
Run Code Online (Sandbox Code Playgroud)
启用该服务,因此它将在登录时自动启动,并启动它:
systemctl --user enable ssh-agent
systemctl --user start ssh-agent
Run Code Online (Sandbox Code Playgroud)
将以下配置设置添加到ssh配置文件~/.ssh/config(这可以从SSH 7.2开始):
AddKeysToAgent yes
Run Code Online (Sandbox Code Playgroud)
这将指示ssh客户端始终将密钥添加到正在运行的代理,因此不需要事先ssh-add.
xel*_*ber 56
老问题,但我确实遇到过类似的情况.不要以为上述答案完全实现了所需要的.缺少的是keychain; 安装它,如果它还没有.
sudo apt-get install keychain
Run Code Online (Sandbox Code Playgroud)
然后将以下行添加到您的 ~/.bashrc
eval $(keychain --eval id_rsa)
Run Code Online (Sandbox Code Playgroud)
ssh-agent如果它没有运行,则启动它,如果是,则连接到它,将ssh-agent环境变量加载到shell中,然后加载ssh密钥.
更改id_rsa为~/.ssh要加载的私钥.
参考
mid*_*nok 37
公认的解决方案有以下缺点:
如果您的密钥不需要输入密码,我建议您使用以下解决方案.将以下内容添加到您的.bash_profile 最后(根据您的需要编辑密钥列表):
exec ssh-agent $BASH -s 10<&0 << EOF
ssh-add ~/.ssh/your_key1.rsa \
~/.ssh/your_key2.rsa &> /dev/null
exec $BASH <&10-
EOF
Run Code Online (Sandbox Code Playgroud)
它具有以下优点:
它有可能的缺点:
ssh-add命令只影响一个会话,这实际上只是在非常不典型的情况下才是问题;请注意,多个ssh-agent进程不是缺点,因为它们不占用更多内存或CPU时间.
Col*_*son 21
将此添加到您的~/.bashrc:
if [ ! -S ~/.ssh/ssh_auth_sock ]; then
eval `ssh-agent`
ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add
Run Code Online (Sandbox Code Playgroud)
这应该只在每次重新启动后第一次登录时提示输入密码.ssh-agent只要它继续运行,它将继续重用.
所以我过去常常使用上面描述的方法,但是当我上次的bash会话结束时,我更喜欢代理死掉.这比其他解决方案稍长,但这是我的首选方法.基本思想是第一个bash会话启动ssh-agent.然后每个额外的bash会话检查配置文件(~/.ssh/.agent_env).如果存在并且存在会话运行,则源环境并创建到套接字文件的硬链接/tmp(需要与原始套接字文件位于相同的文件系统上).当bash会话关闭时,每个会删除自己的硬链接.关闭的最后一个会话将发现硬链接有2个链接(硬链接和原始链接),删除进程自己的套接字并杀死进程将导致0,在最后一个bash会话关闭后留下一个干净的环境.
# Start ssh-agent to keep you logged in with keys, use `ssh-add` to log in
agent=`pgrep ssh-agent -u $USER` # get only your agents
if [[ "$agent" == "" || ! -e ~/.ssh/.agent_env ]]; then
# if no agents or environment file is missing create a new one
# remove old agents / environment variable files
kill $agent running
rm ~/.ssh/.agent_env
# restart
eval `ssh-agent`
echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ~/.ssh/.agent_env
echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ~/.ssh/.agent_env
fi
# create our own hardlink to the socket (with random name)
source ~/.ssh/.agent_env
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln -T $SSH_AUTH_SOCK $MYSOCK
export SSH_AUTH_SOCK=$MYSOCK
end_agent()
{
# if we are the last holder of a hardlink, then kill the agent
nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`
if [[ "$nhard" -eq 2 ]]; then
rm ~/.ssh/.agent_env
ssh-agent -k
fi
rm $SSH_AUTH_SOCK
}
trap end_agent EXIT
set +x
Run Code Online (Sandbox Code Playgroud)
为了添加另一个解决方案:P,我将@spheenik和@ collin-anderson的解决方案结合使用。
# Ensure that we have an ssh config with AddKeysToAgent set to true
if [ ! -f ~/.ssh/config ] || ! cat ~/.ssh/config | grep AddKeysToAgent | grep yes > /dev/null; then
echo "AddKeysToAgent yes" >> ~/.ssh/config
fi
# Ensure a ssh-agent is running so you only have to enter keys once
if [ ! -S ~/.ssh/ssh_auth_sock ]; then
eval `ssh-agent`
ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
Run Code Online (Sandbox Code Playgroud)
可以稍微优雅一点,但它简单易读。此解决方案:
AddKeysToAgent yes在您的ssh配置中,因此密钥将在使用后自动添加欢迎评论:)
尝试了许多来源的解决方案,但似乎都太麻烦了。终于找到最简单的了 :)
如果您还不熟悉zsh和oh-my-zsh,请安装它。你会喜欢的 :)
然后编辑 .zshrc
vim ~/.zshrc
Run Code Online (Sandbox Code Playgroud)
找到plugins部分并更新它以使用ssh-agent如下:
plugins=(ssh-agent git)
Run Code Online (Sandbox Code Playgroud)
就这样!你必须ssh-agent启动和运行每次启动您的shell
| 归档时间: |
|
| 查看次数: |
205105 次 |
| 最近记录: |