【发布时间】:2014-06-01 04:17:47
【问题描述】:
我想连接到远程机器并在该机器上执行一个 shell 命令。我可以上传文件并成功执行命令。但我只能做一次。我希望能够多次这样做。
下面是我使用 SSH2 模块的 JS 文件。
var Connection = require('ssh2');
var fs = require('fs');
c = new Connection();
c.on('ready', function() {
console.log('Connection :: ready');
c.sftp(
function (err, sftp) {
if ( err ) {
console.log( "Error, problem starting SFTP: %s", err );
//process.exit( 2 );
}
console.log( "- SFTP started" );
sftp.unlink( "testfile.py", function(err){
if ( err ) {
console.log( "Error, problem starting SFTP: %s", err );
//process.exit( 2 );
}
else
{
console.log( "file unlinked" );
}
});
// upload file
var readStream = fs.createReadStream( "testfile.py" );
var writeStream = sftp.createWriteStream( "testfile.py" );
writeStream.on('end', function () {
console.log( "sftp connection closed" );
});
// what to do when transfer finishes
writeStream.on(
'close',
function () {
console.log( "- file transferred" );
sftp.chmod( "testfile.py", 777, function(err){
if ( err ) {
console.log( "Error, problem starting SFTP: %s", err );
//process.exit( 2 );
}
else
{
console.log( "Mode changed" );
}
});
//execute the program
c.exec('python testfile.py', 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');
// close the ftp connection
sftp.end();
// fs.end();
//process.exit( 0 );
});
stream.on('exit', function(code, signal) {
console.log('Stream :: exit :: code: ' + code + ', signal: ' + signal);
//c.end();
});
});
}
);
// initiate transfer of file
readStream.pipe( writeStream );
}
);
});
c.on('keyboard-interactive', function(name, instructions, instructionsLang, prompts, finish) {
console.log('Connection :: keyboard-interactive');
finish(['pwd']);
});
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: 'host',
port: 22,
username: 'uname',
password: 'pwd',
tryKeyboard: true
});
【问题讨论】:
-
您是在谈论生成子进程吗? nodejs.org/api/child_process.html
-
其实没有。我想再次运行相同的脚本。但是,连接没有再次进入“就绪”状态。我每次都在创建新的连接,所以我看不到可能是什么问题。
-
你能把它全部包装在一个函数中,你可以在“关闭”时再次调用它,并在你想要运行它的次数之外实现一个计数器吗?
-
感谢您指引我正确的方向。我实际上已经在不同的文件中编写了这个脚本,并从另一个文件中调用“require('./ssh2.js')”。这就是它没有再次被执行的原因。现在我已将整个脚本封装在一个函数中,我只是调用该函数。
标签: javascript node.js express ssh sftp