2015-12-30 53 views
3

因此,這已被證明是谷歌非常困難的事情。我有一個工作設置,我可以在一天結束時休眠或關閉的筆記本電腦上運行一切。這樣做明顯切斷了我的SSH會話在puTTY。稍微戳了一下之後,我發現了一個很好的方法來自動啓動屏幕,並在通過puTTY連接時(即將if [ -z "$STY" ]; then screen -R; fi添加到我的.bashrc的末尾)獲取斷開的會話。當恢復中斷的屏幕會話時重新連接SSH代理轉發

這很好用,但我仍然有問題。我通過我的筆記本上的Pageant(我最初輸入密碼的地方)使用SSH代理轉發到輔助服務器。從我所知道的情況來看,這個套接字在PuTTY會話中斷時中斷,在重新加載並重新連接到屏幕時不會重新連接。

這裏是我的測試:

20:01:38 {~/test}$ git clone [email protected]:coldcandor/env.git 
Cloning into 'env'... 
remote: Counting objects: 1105, done. 
remote: Total 1105 (delta 0), reused 0 (delta 0), pack-reused 1105 
Receiving objects: 100% (1105/1105), 341.06 KiB | 453.00 KiB/s, done. 
Resolving deltas: 100% (544/544), done. 
Checking connectivity... done. 
20:01:43 {~/test}$ rm -rf env 

膩子斷開並重新連接

20:01:58 {~/test}$ git clone [email protected]:coldcandor/env.git 
Cloning into 'env'... 
Permission denied (publickey). 
fatal: Could not read from remote repository. 

Please make sure you have the correct access rights 
and the repository exists. 

正如你所看到的,它不保留轉發。但是,如果我不重新連接到屏幕,或重新連接後完全退出並重新打開屏幕,則沒關係。

我該如何解決這個問題?

回答

3

有趣的是,在試圖使由Jakuje工作提供的解決方案的過程中,我偶然發現了一個git link這反過來有一個超級用戶post其中有想法的一個工作版本。這裏的短版本:

if [ -S "$SSH_AUTH_SOCK" ] && [ ! -h "$SSH_AUTH_SOCK" ]; then 
    ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock 
fi 
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock 

要確保,如果你想了解更多信息或其他潛在的方法來查看該頁面。有一些討論認爲這可能不適用於非常特殊的情況。

2

screen正在保留來自第一個連接的環境變量,並且套接字斷開連接。新的ssh會話會爲您創建一個新套接字,但該會話的環境變量$SSH_AUTH_SOCK會被screen之一覆蓋。

乾淨的方式如何退出將保存這個變量到恢復的屏幕,但我沒有找到一種方法來這樣做。

作爲一種變通方法,我能想到添加幾行到你的.bashrc

# move auth socket to known place so even restored screen can find it 
if [ -n "$SSH_AUTH_SOCK" ]; then 
    [ -f "~/.ssh/agent.socket" ] && rm -f "~/.ssh/agent.socket" 
    ln "$SSH_AUTH_SOCK" "~/.ssh/agent.socket" 
    SSH_AUTH_SOCK="~/.ssh/agent.socket" 
fi 
# you already have 
if [ -z "$STY" ]; then screen -R; fi 

(沒有測試它,我希望有沒有語法錯誤,但我相信你明白我的意思,你可以。修復它 - 在我的答案下有編輯按鈕)。

+0

這個解釋爲什麼非常有意義。我會玩弄你的建議,看看它是否能解決問題(當然要回來後再更新)。謝謝! –

+0

你在正確的軌道上!它沒有工作,但試圖修復它時,我偶然發現了一個工作版本 - 請參閱我接受的答案。顯然,我原來的google-fu並不好... –