2013-11-25 168 views
0

我試圖連接到在遠程計算機上運行的進程。我用ssh2連接到刪除機器。現在我試圖連接到在機器上運行的進程。進程名稱是dd_servicescNodeJs套接字連接問題

c.exec('OmneBabble dd_servicesc',function(){} 

我用上面的代碼命令連接到進程。在連接上,我想執行一系列連接。但目前的問題是,如果我再次使用c.exec,下一個命令在進程外執行,因此返回權限被拒絕。爲了更好地理解請檢查下面

OmneBabble dd_servicesc 
    >0 1 om_get_user_info 31003 1 MACLEAN1-11365 

這裏初始命令是OmneBabble dd_servicesc其內0 1 31003 om_get_user_info 1 MACLEAN1-11365需要被執行。請指出我可以參考的任何鏈接,找到解決此問題的方法。

問候,

麥克萊恩

Update 



function ssh() 
{ 
var Connection = require('ssh2'); 

var c = new Connection(); 
c.on('connect', function() { 
    console.log('Connection :: connect'); 
}); 

c.on('ready', function() { 
    console.log('Connection :: ready'); 
c.exec('OmneBabble dd_servicesc', function(err, stream) { 
    if (err) throw err; 
    stream.on('data', function(data, extended) { 
     console.log((extended === 'stderr' ? 'STDERR: ' : 'STDOUT: ') 
        + data); 
    }); 
    stream.on('end', function() { 
     console.log('Stream :: EOF'); 
    }); 
    stream.on('close', function() { 
     console.log('Stream :: close'); 
    }); 
    stream.on('exit', function(code, signal) { 
     console.log('Stream :: exit :: code: ' + code + ', signal: ' + signal); 
     c.end(); 
    }); 
    }); 
c.exec('0 1 om_get_user_info 31003 1 MACLEAN1-11365', function(err, stream) { 
    if (err) throw err; 
    stream.on('data', function(data, extended) { 
     console.log((extended === 'stderr' ? 'STDERR: ' : 'STDOUT: ') 
        + data); 
    }); 
    stream.on('end', function() { 
     console.log('Stream :: EOF'); 
    }); 
    stream.on('close', function() { 
     console.log('Stream :: close'); 
    }); 
    stream.on('exit', function(code, signal) { 
     console.log('Stream :: exit :: code: ' + code + ', signal: ' + signal); 
     c.end(); 
    }); 
    }); 
}); 

c.on('error', function(err) { 
    console.log('Connection :: error :: ' + err); 
}); 
c.on('end', function() { 
    console.log('Connection :: end'); 
}); 
c.on('close', function(had_error) { 
    console.log('Connection :: close'); 
}); 
c.connect({ 
    host: '192.168.20.204', 
    port: 22, 
    username: 'oaa', 
    password: 'marigold' 
}); 
} 
exports.ssh = ssh; 

更新:這裏OmneBabble dd_services這使得在插座即> dd_services的連接。

之後,我們將發佈一個請求,使用0 1 om_get_user_info 31003 1 MACLEAN1-11365

插座,然後會再發布請求向其所有客戶端進程插座。最後,接受請求的客戶端進程將響應輸出。所以我不能使用子進程將父進程的輸出映射到子進程。

回答

0

不知道你到底如何想連接的過程,但如果程序本身是通過node開始,你可以改爲與child_process.spawn,你在哪裏得到一個對象返回啓動它們,可以設置stdoutstderrstdin ,並向該過程發送信號。

編輯:

看你的連接代碼,它看起來像你想通過標準輸入發送你的第二個命令的過程,而不是執行另一個命令。您也許能管你的第二個命令到主進程作爲初始EXEC:

c.exec('echo "0 1 om_get_user_info 31003 1 MACLEAN1-11365" | OmneBabble dd_servicesc', function... 
+0

HI,我添加的代碼我的問題,你能告訴我怎麼在這裏添加子進程spwan。 - –

+0

我已更新我的答案以反映新代碼。我相信你的問題是'OmneBabble dd_servicesc'(我沒有事先知道這個命令)提供了一個類似REPL的環境,在這個環境中你的第二個命令就是這樣。除非'ssh2'提供了一個交互式鍵盤接口,否則你將不得不弄清楚如何運行你的兩個命令,而不需要輸入'OmneBabble'的CLI(也許通過管道,或者通過stdin發送輸入?)。 –

+0

嗨,dd_Services是一個套接字,在你的回答中,你正在將dd_servies的輸出連接到0 1 om_get_user_info,這是對套接字的請求。這根本不符合邏輯。 –

0

我已經能夠使用SSH2

c.shell(function(err, stream) { 
if (err) throw err; 
stream.on('data', function(data, extended) { 


    console.log((extended === 'stderr' ? 'STDERR: ' : 'STDOUT: ') 
      + data); 
}); 

// below code to connect stdin to the remote shell 

process.stdin.resume(); 
process.stdin.on('data', function (data) { 
allowed = false; 
stream.write(data); 

運行交互式殼後嘗試插入標準輸入重定向你exec聲明。

我學會了如何從STDIN這個封閉的問題重定向: https://github.com/mscdex/ssh2/issues/94