1

SCP送信をテストするためのコードを書きました。これがコードです。

var async = require('async'),
    nexpect = require('nexpect'),
    arg = {
    'host' : '192.168.0.3',
    'username' : 'root',
    'password' : 'rootpwd',
    'path' : '~'
    },
    file_list = ['a.txt', 'b.txt', 'c.txt'];

function scpFileTransfer(arg, callback) {
    nexpect.spawn('scp ' + arg.file + ' ' + arg.username + '@' + arg.host + ':' + arg.path, { stream: 'stderr' })
        .wait(/password/)
        .sendline(arg.password)
        .run(function (err) {
            if(err) console.log(err);
            else console.log('from ' + arg.file + ' to ' + arg.username + '@' + arg.host + ':' + arg.path + ' success!');
            callback();
        }
    );
}

async.eachSeries(file_list, function(item, callback) {
    arg.file = item;
    scpFileTransfer(arg, function () {
        callback();
    });
}, function (err) {
    if(err) console.trace(err);
    else console.log('success');
});

このような出力を期待していましたが、

from a.txt to root@192.168.0.3:~ success!
from b.txt to root@192.168.0.3:~ success!
from c.txt to root@192.168.0.3:~ success! 

しかし、出力は私の期待とは異なりました。node.js モジュールがコマンド ライン入力を待機していました。コマンド ライン入力なしでコードを実行するにはどうすればよいですか?

4

1 に答える 1

0

私はこの問題を自分で解決しました。

node.js で scp で送信するには、stdout ストリームに関するリダイレクトが必要です。

というわけで、fs.readSync関数を使って/dev/stdoutについてリダイレクトしてみました。

しかし、私のプログラムは「不明なエラー」で終了しました。

このコードは、「expect」プログラムを使用した新しい scpFileTransfer 関数であり、nexpect モジュールもリダイレクトも使用しません。

function scpFileTransfer(arg, callback) {
    var buf = new Buffer(256),
        len = 0,
        scp;
    len += buf.write(   'set timeout -1\n' +
                        'spawn scp ' + arg.file + ' ' + arg.username + '@' + arg.host + ':' + arg.path + '\n' +
                        'expect -exact "password: "\n' +
                        'send -- "' + arg.password + '\r"\n' +
                        'expect {\$\s*} { interact }\n');
    fs.writeFileSync('./.scp_login.exp', buf.toString('utf8', 0, len));

    scp = spawn('expect', ['-f', '.scp_login.exp']);
    scp.stdout.on('data', function (data) {
        console.log(data.toString('utf8', 0, len));
    });
    scp.stderr.on('data', function (data) {
        console.log('stderr: ' + data);
    });
    scp.on('exit', function (code) {
        fs.unlink('./.scp_login.exp', function (err) {
            if(err) throw err;
        });
        callback();
    });
}

このコードを自分の環境で実行する場合は、'expect' プログラムがインストールされているかどうかを確認する必要があります。

そうでない場合は、次のコマンドでインストールできます。


Ubuntu - sudo apt-get install 期待

CentOS - yum インストールの期待

Mac OS X - (既に OS にインストールされています。)


ありがとう。

于 2014-07-16T05:19:55.767 に答える