Ads 468x60px

Pages

2011年3月15日 星期二

回復 screen session 時,自動連結到 ssh-agent


一般情況下,我都是透過我的 notbook 的 macOSX(terminal) or windows(pietty) ssh 進去一台主機(dev)後,執行 screen 再開一些 windows 連到其他的主機(m1,m2,m3...)上做事,但是在併用 ssh-agent 及 screen detach 時,時常會發生找不到 agent 的情況,網路上有一大堆的解法,參考 http://www.reasonablyopinionated.com/2009/03/automatically-reconnecting-to-ssh-agent.html ,最後,我使用如下的方式解決。

先從 notebook 登入主機 dev
notebook> $ ssh dev

修改 dev 主機上的 .bash_profile,增加下面的 code
test $SSH_AUTH_SOCK && ln -sf "$SSH_AUTH_SOCK" "/tmp/ssh-agent-$USER-screen"
修改 dev 主機上的 .screenrc,增加下面的 code
setenv SSH_AUTH_SOCK "/tmp/ssh-agent-$USER-screen"

好了,登出主機 dev
dev> $ exit
notebook> $

接著再重新登入主機 dev, 方法一使用 -A 會啟 ssh-agent-forwarding, 也就是會有 ssh-agent 自動執行,如果你沒辦法這樣做,就用方法二,ssh dev,進去後,再執行 eval `ssh-agent`
方法一:
notebook> $ ssh -A dev
dev> $ env | grep -i ssh
SSH_CLIENT=172.17.x.x 64323 22
SSH_TTY=/dev/pts/27
SSH_AUTH_SOCK=/tmp/ssh-agent-username-screen
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
CVS_RSH=ssh
SSH_CONNECTION=172.17.x.x 64323 192.168.x.x. 22

方法二:
notebook> $ ssh A
dev> $ eval `ssh-agent`
dev> $ env | grep -i ssh
SSH_AUTH_SOCK=/tmp/ssh-agent-username-screen

最後,執行 screen, ssh-add 把 key 加到 ssh-agent 裡。
dev> $ screen
dev (window1) > $ ssh-add

做完後工作,把 screen detach (Ctrl-A D). 下次進來再 attach screen (screen -r) 就會自動連結到有效的 ssh-agent 了。


===============================================
好心前同事提供的另一種方法(與上一個方法,擇一使用)
===============================================
提下列代碼加到 .bash_profile 裡
notebook>
FOUND_SSH_AGENT_PID=`ps axU $USER | grep ssh-agent | grep -v grep | awk {'print $1'}`
source ~/.agent

if [ "${SSH_AGENT_PID}x" != "x" -a "$SSH_AGENT_PID" = "$FOUND_SSH_AGENT_PID" ]
then
    SSHL=`ssh-add -l`
    if [ ! "$SSHL" != "The agent has no identities." ]
    then
        ssh-add
    fi
else
    ssh-agent > ~/.agent
    source ~/.agent
    ssh-add
fi

接著,修改 dev 主機上的 .screenrc,,把 setenv 註解或刪掉
## setenv SSH_AUTH_SOCK "/tmp/ssh-agent-$USER-screen"

Enjoy!

0 意見:

張貼留言