gpt4 book ai didi

javascript - 在 Nodejs 中使用 ssh2 传输整个目录

转载 作者:搜寻专家 更新时间:2023-11-01 00:24:57 26 4
gpt4 key购买 nike

我只是想知道是否可以使用 node.js 中的 ssh2 模块将目录从 unix 服务器传输到我的本地计算机。我已经连接到远程主机并且可以读取目录以及传输单个文件,但是目录中有 28 个文件夹,每个文件夹包含文件和子目录。我想做的是将主目录的精确副本从服务器复制到我的本地计算机。

我对单个文件使用 fastGet,但传输目录时出现:Error: EISDIR, open __dirname/../localdirectory/ 我认为这意味着我无法使用 fastGet 获取整个文件目录。我也尝试过使用 exec 命令尝试和 scp 它,但我无法计算出本地目录的语法:

// c is an active connection
c.exec('scp filethatexists.extension /../filepath/newname.extension', function(err, stream) {
if (err) {
console.log("error: " + err);
stream.end;
};
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();
});
});

这只会导致 EOF 调用。这段代码只是我在测试是否可以传输单个文件。

任何人都可以为我提供任何帮助吗?提前谢谢你。

最佳答案

几个解决方案:

  1. 您可以使用 sftp 方法递归遍历目录(根据需要创建目录和传输文件)

  2. 将目录压缩(如果需要也可以压缩)到标准输出(例如 tar cf - mydir),然后使用 tar 处理传入的标准输出 data模块(如果您最终压缩目录,则首先内置 zlib 模块)。

    // Requires:
    // * `npm install tar-fs`
    // * `ssh2` v0.5.x or newer
    var tar = require('tar-fs');
    var zlib = require('zlib');

    function transferDir(conn, remotePath, localPath, compression, cb) {
    var cmd = 'tar cf - "' + remotePath + '" 2>/dev/null';

    if (typeof compression === 'function')
    cb = compression;
    else if (compression === true)
    compression = 6;

    if (typeof compression === 'number'
    && compression >= 1
    && compression <= 9)
    cmd += ' | gzip -' + compression + 'c 2>/dev/null';
    else
    compression = undefined;

    conn.exec(cmd, function(err, stream) {
    if (err)
    return cb(err);

    var exitErr;

    var tarStream = tar.extract(localPath);
    tarStream.on('finish', function() {
    cb(exitErr);
    });

    stream.on('exit', function(code, signal) {
    if (typeof code === 'number' && code !== 0) {
    exitErr = new Error('Remote process exited with code '
    + code);
    } else if (signal) {
    exitErr = new Error('Remote process killed with signal '
    + signal);
    }
    }).stderr.resume();

    if (compression)
    stream = stream.pipe(zlib.createGunzip());

    stream.pipe(tarStream);
    });
    }

    // USAGE ===============================================================
    var ssh = require('ssh2');

    var conn = new ssh();
    conn.on('ready', function() {
    transferDir(conn,
    '/home/foo',
    __dirname + '/download',
    true, // uses compression with default level of 6
    function(err) {
    if (err) throw err;
    console.log('Done transferring');
    conn.end();
    });
    }).connect({
    host: '192.168.100.10',
    port: 22,
    username: 'foo',
    password: 'bar'
    });

关于javascript - 在 Nodejs 中使用 ssh2 传输整个目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23935283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com