【问题标题】:Plink still prints keyboard interactive prompts with -batch optionPlink 仍然使用 -batch 选项打印键盘交互提示
【发布时间】:2020-11-02 16:36:23
【问题描述】:

我正在 node.js 'child_process' 之上构建一个抽象层,以使系统能够使用相同的包装器在本地或远程调用 CLI 工具,以便我可以使用相同的代码调用 CLI 工具,不管我在哪台机器上。

我过去使用 Java + JSch 做过类似的事情,现在我尝试对 JavaScript + node.js 做同样的事情。

对于 Windows 主机,我使用 PLink 来调用远程 CLI 命令。我正在做的事情如下:

spawn(args)
{
    const mode = this._mode;
    const config = this._config;

    var actualCommand;
    var actualArgs;
    if (mode == MODE_LOCAL)
    {
        // just use plain child_process.spawn...
        actualCommand = args[0];
        actualArgs = args.slice(1);
    }
    else if (mode == MODE_REMOTE)
    {
        if (process.platform == "win32")
        {
            // for Windows machines, use PLink
            // ./win/plink -batch -ssh <USER>@<HOST> -pw <PASSWORD> <COMMAND...>
            const sep = require("path").sep;
            actualCommand = __dirname + sep + "win" + sep + "plink";
            actualArgs = [ "-batch", "-ssh", config.username + "@" + config.host, "-pw", config.password ].concat(args);
        }
        else
        {
            // TODO use ssh for Linux and Mac
            throw "Not supported yet";
        }
    }
    return child_process.spawn(actualCommand, actualArgs);
}

我不想使用 SSH 节点模块,这就是我选择 PLink 的原因。我必须在不使用外部库的情况下执行此操作,因为这样做需要我获得该库的内部许可,这会危及我们的项目进度。

一旦生成进程,我会执行以下操作:

const spawner = new Spawner().remote({ host: "...", username: "...", password: "..." });
const ls = spawner.spawn( [ 'ls', '-ll' ] );

ls.stdout.on( 'data', data => {
    console.log( `stdout: ${data}` );
} );

ls.stderr.on( 'data', data => {
    console.log( `stderr: ${data}` );
} );

ls.on( 'close', code => {
    console.log( `child process exited with code ${code}` );
} );

即使我将“-batch”参数添加到 PLink,它仍然会打印到与服务器交互相关的 STDERR 信息:

stderr: Keyboard-interactive authentication prompts from server:
stderr: End of keyboard-interactive prompts from server

由于我在批处理模式下使用 PLink,它不应该做交互式提示。 'batch' 选项可以防止 PLink 在 CLI 中使用交互式提示阻塞,但我仍然会向 STDERR 获取与交互相关的信息。有没有办法在使用 PLink 时完全摆脱键盘交互打印?

【问题讨论】:

  • 我必须解析进程的 CLI 输出,包括 STDOUT 和 STDERR。 PLink 在 STDERR 中打印某些内容的事实意味着我必须:1)过滤掉高级代码中的 PLink 输出(不必关心进程是在本地运行还是远程运行。2)过滤掉 PLink在低级代码中输出,这意味着我必须将其包装在我的类中。无论如何,如果我可以阻止 PLink 打印其交互式提示,则不需要这样做。

标签: node.js ssh putty child-process plink


【解决方案1】:

您不能阻止 Plink 打印提示。

没有人声称-batch 开关可以做到这一点。该开关仅阻止 Plink 要求用户回答提示。

另外,肯定还有其他 Plink 可以打印的“stderr”输出。

如果您想完全控制输出,则必须使用 SSH 库,而不是运行外部 SSH 客户端。

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2019-10-23
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多