2017-01-27 55 views
7

ð通過CLI與類似如下的命令成功,我已經成功地ssh」到谷歌雲計算creds靜靜地失敗:SSH2模塊與CLI

ssh -i ~/.ssh/my-ssh-key [email protected] 

但使用ssh2模塊沒有給予任何輸出,包括錯誤。

var fs = require('fs'); 
var Client = require('ssh2').Client; 

var connSettings = { 
    host: IP, // 'XXX.XXX.XXX.XX' 
    port: PORT, // XXXX 
    username: ME, 
    privateKey: privateKey, //fs.readFileSync(location, 'utf8') 
    passphrase: passphrase, 
    password: password 
}; 

var conn = new Client(); 

conn.on('ready', function() { //first example in README 
    console.log('Client :: ready'); 
    conn.exec('uptime', function(err, stream) { 
    if (err) throw err; //nothing 
    stream.on('close', function(code, signal) { 
     console.log('Stream :: close :: code: ' + code + ', signal: ' + signal); //nothing 
     conn.end(); 
    }).on('data', function(data) { 
     console.log('STDOUT: ' + data); //nothing 
    }).stderr.on('data', function(data) { 
     console.log('STDERR: ' + data); //nothing 
    }); 
    }); 
}) 
.on('error', function(err) { 
    console.error('err', error); //nothing 
}) 
.connect(connSettings); 

我尾礦/var/log/secure爲我調試的節點劇本,我可以看到日誌條目,當我在ssh和關閉從CLI會話,但什麼都沒有,當我通過節點ssh2嘗試。

什麼可能導致此連接默默失敗?

+0

錯誤的端口,它正在等待握手超時?嘗試添加'debug:console.log'到你的連接配置中,看看發生了什麼/沒有發生。 – mscdex

+0

@mscdex我可以看到,當我登錄該對象,他們都是正確的。似乎應該至少有一些錯誤。 – 1252748

+0

你可以在其他地方發佈調試輸出嗎?你使用的是什麼版本的'ssh2'? – mscdex

回答

5

更新:我有它在您的客戶端將登錄服務器的ident字符串良好的權威,那就是在連接時立即發送。所以,如果你不要看到的信息,它必須是服務器沒有發送任何東西的情況。 現在,由於您嘗試使用CLI SSH並且它可以正常工作,所以一旦我們排除了不可能的情況,剩下的唯一解釋就是您不在連接到同一個服務器/端口的。出於某種原因,目標服務器上的端口8080未運行SSH2服務器。

一個可能的解釋是這樣的:服務器運行的是8080端口一樣,允許連接,但不發送任何東西最初(例如HTTP服務器)。當您使用CLI SSH進行連接時,您認爲它使用的是端口8080,但由於某些原因ssh_config文件中的指令未啓動,並且CLI SSH連接到真正的SSH服務器,並且工作正常節點SSH連接到不同的服務器,這就是爲什麼它不起作用。

要進行檢查,儘量telnet'ting到該服務器的8080端口,並確認它確實有一個SSH2橫幅迴應:

Connected to xxx.xxx.xxx.xxx port 22 
Escape character is '^]'. 
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8 
^C 
Connection closed by foreign host. 

如果不回答與「SSH -... 「橫幅廣告,我認爲這足以證明CLI SSH連接到別處。哪裏?要發現此情況,請再次運行帶調試的CLI SSH:

ssh -vvv xxx.xxx.xxx.xxx ... 2>&1 | grep "Connecting to" 

(必須按Ctrl-C才能退出)。這應該給你:

debug1: Connecting to whatever [xxx.xxx.xxx.xxx] port XYZK 

這xxx.xxx.xxx.xxx和XYZK值是你需要傳遞給node客戶的人。

以前的答案

我不熟悉nodejs的SSH2,但我有一個SSH2庫(閉源,在那個)幾個月前玩這種把戲確切我。 「連接...」後面沒有什麼

事實證明,客戶端正在使用服務器不支持的密碼,出於某種原因,OpenSSH2的CLI客戶端顯示此消息時,庫選擇不顯示錯誤。深入到底是很麻煩的。

我從GitHub頁面看到一些密碼需要「node v0.11.12或更新」。這是你的情況嗎?如果沒有,你可能想嘗試更新node

無論如何我會遵循@ AttRigh的建議並在調試模式下在服務器上運行sshd。如果您不能:

  • 日誌SSH2 CLI客戶端的全面調試模式輸出,並提取什麼加密器,它使用,
  • 建立與密碼,沒有別人sshd服務器,
  • 運行節點的客戶對該服務器。

而且,現在我想起來了,你可能無論如何設置了sshd服務器使用默認設置,並確保您可以連接到該。這會限制這個問題。

+0

這個問題不是密碼,因爲握手開始時會有調試輸出,就像OpenSSH客戶端顯示每個類別在每個類別中提供的內容(主機密鑰格式​​,DH,密碼,hmac,壓縮)一樣。事實上,ssh2客戶端甚至沒有看到服務器的標識字符串,因爲它在連接之後實際上會記錄它。 – mscdex

+0

@mscdex,我已經嘗試過,並得出結論,您對端口8080不提供SSH2服務器的懷疑很可能是正確的。相應地更新了答案(我可能會最終完全刪除它 - 這個問題可能在「簡單錯誤」類別中並因此成爲關閉的候選者)。 – LSerni

+0

@LSerni Telneting('telnet xxx.xxx.xxx.xxx 8080')給了我這個輸出:'嘗試xxx.xxx.xxx.xxx ... 連接到xx.xxx.xxx.xxx.bc.googleusercontent.com 。 轉義字符是'^]''。我想我明白你在說什麼,但我不確定如何解決它。你可以解釋嗎?謝謝。 – 1252748