2010-07-14 75 views
7

我在全屏模式下在我的Ubuntu上網本上使用GNU Emacs。當我編輯受版本控制的文件並點擊C-x v v提交最新的更改時,OpenSSH彈出窗口將打開並詢問我的存儲庫所在服務器的密碼。Emacs/CVS/OpenSSH:防止密碼彈出

不幸的是,由於全屏模式,彈出窗口不會出現,我無法輸入密碼。但它仍然是莫名其妙的,所以我也不能回到emacs,也就是說,離開全屏模式(或者做其他任何事情,比如C-g)。我基本上被困住了。

作爲一個emacs用戶,我發現彈出窗口令人討厭的想法;-)所以理想情況下,我希望在minibuffer中提供ssh密碼。我如何調整我的設置以實現這一目標? (我更喜歡每次輸入密碼而不是將密鑰對存儲在〜/ .ssh /中)。

+0

您已經添加了賞金,但您從未回覆過任何人第一次提出的建議。我們不知道你是否嘗試過這些解決方案。 – phils 2011-06-12 21:43:36

+0

@phils:好點(雖然我曾對此做過評論)。你自己的回答是一個很好的暗示,但這不完全是我的問題的答案。我認爲sanityinc的答案,你也很重視(謝謝),這是正確的方向。但這不是一個「解決方案」。 – Thomas 2011-06-18 13:14:43

回答

7

在啓動emacs(或在另一個shell中)之前,您可以使用ssh-agent

+0

原始海報更喜歡輸入密碼以使用基於密鑰的身份驗證。但我同意ssh-agent和密鑰對是更好的解決方案。 – stsquad 2010-07-14 12:09:19

1

我在這裏推測,因爲我在Emacs中既沒有使用CVS也沒有使用vc,但是我認爲Emacs正在爲合適的程序執行提交併且密碼提示符完全是Emacs外部的東西。所以我懷疑你想要做的是首先找出在沒有Emacs的情況下從你的shell執行無GUI更新所需的選項,然後在Emacs中修改vc-checkin-switches(或定義vc-cvs-checkin-switches)以匹配(請參閱defun vc-switches)。

1

這可能是ssh-askpass程序踢進來的,我認爲它看着DISPLAY環境變量來決定如何請求密碼。如果設置,它彈出一個圖形窗口,如果沒有,它會詢問TTY。

如果當從用戶請求的密碼(這是可能的)的VCS子系統檢測,那麼它可能是你可以爲子過程未設置$ DISPLAY:

(setenv "DISPLAY" nil) 

這可能有其他負面的副作用,儘管如此,如果有任何可能的幫助,也請查看「man ssh-askpass」。

+0

您可以使用建議或掛鉤將其應用於必需的代碼。我看到'vc-before-checkin-hook'和'vc-checkin-hook'(之後)被定義了,但是我猜你需要這麼做而不僅僅是提交?對於(完全)'Cx vv'的情況,下面的建議將涵蓋: '(defadvice vc-next-action(around my-ssh-prompt-fix-for-vc-next-action activate) (let((backup(getenv「DISPLAY」)))(setenv「DISPLAY」nil)ad-do-it(setenv「DISPLAY」backup)))' – phils 2010-07-19 09:27:45

+0

如果cvs運行的環境確實會影響到這一點,將會覆蓋CVS命令。 'vc-cvs-command'硬編碼「cvs」作爲命令並將其傳遞給'vc-do-command',所以一種選擇是爲cvs編寫一個包裝腳本(Emacs之外)來執行真實命令在修改後的環境中。這可能會影響到非Emacs對cvs的調用,所以你可以命名包裝器而不是「cvs」,並且在vc-do-command之前建立一些命令來改變它的'command' arg的值,使之與它匹配是「cvs」。 – phils 2010-07-19 10:10:03

+0

或者只是使用我的第一個評論'vc-do-command'而不是'vc-next-action'的建議方法? – phils 2010-07-19 10:12:51

1

你可以ssh來複通過現有連接的服務器,所有新的連接(聲明我個人使用基於ssh的代理,我強烈建議的解決方案。)。這意味着只要你打開了一個ssh連接(比如說在一個shell中),新的連接到同一個遠程主機就不會要求輸入密碼。我用

Host * 
    ControlPath ~/.ssh/master-%[email protected]%h:%p 
    ControlMaster auto 
    ServerAliveInterval 30 

in〜/ .ssh/config來設置它。

+0

很酷的技術,但不完全是我在這裏找的。但還是很高興知道! – Thomas 2011-06-14 17:48:07

1

嘗試在你的環境中莫名其妙地設置這樣的:

export CVS_RSH='ssh -o PreferredAuthentications="password"' 

這應該得到它停止嘗試公鑰認證,這也將打壓圖形化的ssh-askpass的顯示。這通過指定CVS將用於連接到遠程服務器的SSH命令來工作。請注意,這將適用於從設置環境變量的上下文運行的所有CVS命令。

您可能還想考慮在您的~/.ssh/config中設置它。您可以分別爲每個主機設置選項。 Here's a page that roughly shows how,雖然用於強制publickey認證。請注意,這將影響您的用戶帳戶的所有SSH使用,而不僅僅是CVS。這可能就是你正在尋找的東西,因爲你似乎更喜歡避免使用publickey認證。下面是你在~/.ssh/config添加塊的例子:

Host cvs 

    Hostname cvs.your.corp 
    User yourCVSusername 
    PreferredAuthentications password 

或者,你可以改變Host cvsHost cvs.your.corp如果您現有的訪問本採用的是FQDN,而不是隻是一個主機名的方式。

最後,您可以通過僅這一條線有你的~/.ssh/config文件(或將其添加到現有的頂部):

PreferredAuthentications password 

,這將使優先適用於所有的SSH連接到遠程主機。

好運。我希望這能讓你擺脫模態對話陷阱。

+0

謝謝,但我沒有使用SVN。 – Thomas 2011-06-18 13:16:30

+0

同樣的解決方案適用於CVS,只需設置'CVS_RSH'環境變量而不是'SVN_SSH'變量。我更新了答案以反映這一點。請注意,修改'〜/ .ssh/config'的第二種解決方案對於所有使用SSH的程序都適用,即使它們不支持'CVS_RSH'和'SVN_RSH'等環境變量。 – justis 2011-06-20 00:47:30

+0

我還爲第二種方案。 – justis 2011-06-20 00:54:42