2012-09-08 101 views
4

此工程從我的本地終端:如何從node.js生成ssh命令時傳遞密鑰文件?

ssh -i ~/.ec2/mykey.pem [email protected] ls 

當然它中。但是當我使用node.js'child_process.spawn命令嘗試相同的命令時,它會抱怨密鑰不存在/無法訪問。

// child process 
var childProcess = require('child_process').spawn; 

// spawn the slave using slaveId as the key 
slaves[slaveId] = childProcess('ssh', [ 
    '-i /mykey.pem', 
    '[email protected]', 
    'ls' 
]) 

結果:試圖

stderr: Warning: Identity file /mykey.pem not accessible: No such file or directory. 
stderr: Permission denied (publickey). 

東西:路徑上

  1. 變化關鍵:
    /actual/path/to/mykey.pem
    mykey.pem(與在根目錄中的文件的副本節點項目)
    /mykey.pem(具有在節點項目的根的文件的副本)
    ~/.ec2.mykey.pem(它應該是)

  2. 而不SSH部分運行命令,即。 childProcess(ls); - 作品。

  3. chmod 644, 600, 400 etc. mykey.pem

我在這一點上唯一的理論是有一個在傳遞文件引用的一個問題,我需要使用fs模塊做東西。 (?)是的,我知道有用於ssh訪問節點的庫,但它們使用的密碼不會削減它,無論如何,我的要求並不真正證明圖書館。

請告訴我我很愚蠢,這是可能的。

UPDATE:

好了,我可以使用 exec命令是這樣的:

var childProcess = require('child_process').exec; 
slaves[slaveId] = childProcess('ssh -i mykey.pem [email protected] ls', function (error, stdout, stderr) {...} 

不過,我覺得我已經從創建使用fork真正從降級所有這些都是很好的消息和方便的屬性(我原來的實現在本地運行良好),有一臺真空吸塵器,並被告知自己做所有的工作(現在我想在遠程主機上啓動從屬服務器)。

+1

如果你用'-i/mykey.pem''產生了兩個元素:''-i','/ mykey.pem''會怎麼樣? –

+0

如果我將它分成兩個元素,那麼它就可以工作。這是使產卵工作的解決方案。 –

回答

4

我似乎最近跳起了布蘭登的評論:-)。他又合適了。當您執行ssh -i ~/.ec2/mykey.pem [email protected] ls時,在這種情況下,ssh可執行文件會獲得四個參數:-i,密鑰文件的名稱,主機地址和命令,例如。 ls -ltr /tmp。當它看到一個-i時,它期望下一個參數是密鑰文件的名稱,而不是將該名稱看作-i的尾部子字符串。

請記住,當你spawn一個程序,你調用它的情況下直接通過外殼去,所以你必須外殼沒有任何擴張,報價,等以後正好經過它的殼會通過它的參數在使用exec時,實際上是將一個命令行字符串傳遞給shell,所以shell會爲您執行所有這些操作,包括確定一個參數結束,另一個開始。

+0

謝謝,奇怪的是__will__接受一個命令,比如'ls -ltr/tmp'作爲一個參數,但'-i myfile.pem'需要被分解爲兩個。如上所述,現在它運作正常。 –