2010-07-28 73 views
2

堅持這是我在做什麼:SSH是閱讀從控制檯的密碼,而不是標準輸入

ssh_ = new Process(); 
    ssh_.StartInfo.FileName = SshProvider; 
    ssh_.StartInfo.Arguments = "-t -t " + Environment.UserName + "@" + serverName_; 
    ssh_.StartInfo.UseShellExecute = false; 
    ssh_.StartInfo.RedirectStandardInput = true; 
    ssh_.StartInfo.RedirectStandardOutput = true; 
    ssh_.StartInfo.RedirectStandardError = true; 
    ssh_.StartInfo.CreateNoWindow = true; 
    ssh_.Start(); 
    new Thread(new ThreadStart(ReadStdOut)).Start(); 
    new Thread(new ThreadStart(ReadStdErr)).Start(); 

我想讀的標準輸出(或標準錯誤)的密碼提示,寫密碼進入標準輸入,但ssh正在從我開始使用我的單聲道應用程序的控制檯上進行書寫和閱讀。我不明白這是爲什麼,因爲我已經在上面的代碼中重定向了這些流。

回答

2

我應該用C#文庫中像SharpSSH或格拉納多斯,而不是試圖與另一個進程交互。

3

ssh不會從標準輸入讀取。這是非常有意的行爲,專門用於防止人們嘗試從腳本或其他程序傳入密碼。他們沒有標誌來禁止這種行爲;沒有辦法改變它。

執行自動登錄的預期方式是使用私鑰/公鑰機制繞過密碼提示。高級別步驟是:

  1. 在客戶端上運行ssh-keygen以創建公鑰 - 私鑰對。
  2. 將公鑰文件的內容(例如~/.ssh/id_rsa.pub)添加到服務器的授權主機文件(例如~/.ssh/authorized_keys2)。

通過這樣做,您授權客戶端使用其密鑰連接到服務器,因此不需要密碼。

0

這比這更復雜一點。

SSH和其他應用程序希望爲其「輸入」提供比字節流更多的服務,它們需要終端處於活動狀態。

終端提供各種服務,例如開啓和關閉「echo」字符(您將其關閉以輸入密碼,將其打開以進行常規操作)。能夠捕獲某些控制序列(有選擇地忽略中斷或掛起信號),在顯示屏幕上收到變化的通知(ssh需要這樣做,以便它可以通知遠程端,終端大小已更改,並且遠程編輯器可以正確重新顯示本身)。

的Unix提供了一個名爲服務「僞終端」(簡稱「PTY」)提供此功能和Mono有一個.NET的結合,可以讓你控制使用僞終端的過程,你可以在這裏找到代碼:

http://github.com/mono/pty-sharp

這裏有一個樣本。

相關問題