【问题标题】:Unable to execute nodejs simple-ssh module's .exec() method无法执行 nodejs simple-ssh 模块的 .exec() 方法
【发布时间】:2021-06-28 00:07:35
【问题描述】:

我正在使用 npm 的 simple-ssh 模块以 root 用户身份连接到远程主机。
我还有一个超级用户帐户serviceUser。我需要对这个用户做一个su 并执行几个命令。但是su serviceUser(注意:su serviceUser 是无密码的)没有被执行。
代码如下:

var ssh = new SSH({
            host: hostserver,
            user: 'root',
            timeout: 1500000,
            key: require('fs').readFileSync("D:/Keys_pair_prvt_pub/rsa_key"),
            agent: process.env.SSH_AUTH_SOCK,
            agentForward: true
            });
ssh
    .exec('whoami',{
        out: function(stdout) {
            logs += stdout;
            console.log(stdout);
        }
    })
    .exec('su serviceUser',{
        out: function(stdout) {
            logs += stdout;
            console.log(stdout);
        }
    })
    .exec('sh myScript.sh',{
        out: function(stdout) {
            logs += stdout;
            console.log(stdout);
        }
    })
    .exec('echo "exiting shell"',{
        out: function(){
            try{
                ssh.end();
                console.log("exiting");
                defer.resolve(obj);
            } catch(err){
                defer.reject(err);
            }
        }
    }).start();

.exec('whoami',{ 块正在执行,但 .exec('su serviceUser',{ 块没有。
在输出控制台中,由于whoami,我将root 作为输出,但之后没有任何反应。
请帮忙。

【问题讨论】:

  • 当你运行 'su' 时,它会以特定用户的身份执行一个 shell(如 /bin/bash)。所以命令阻塞的原因可能是因为它已经启动了 bash 并且现在正在等待通过标准输入的命令。你到底想做什么?
  • @brm,我正在尝试以serviceUser 帐户运行一些命令.. 假设sh myScript.sh 需要以serviceUser 运行。为此,我需要使用su serviceUser,但它不起作用。
  • 你需要启动第二个脚本还是第一个程序也需要向它发送命令?
  • @brm,我需要以root 用户身份启动主程序。然后我需要将命令sh myScript.sh 执行为serviceUser。所以基本上我需要做类似的事情:su serviceUser "sh myScript.sh".
  • 除了使用su,您还可以使用process.setuid 和process.setgid 删除您的root 权限

标签: javascript node.js npm


【解决方案1】:

所以我有一个类似但不同的问题。很难说四年前你的情况是什么,但如果有人再次来到这里,这里是我用来捕捉我类似但不同的错误的代码,其中只是“什么都没发生”。 (我不确定为什么这是他们最后提到的事情之一,因为几乎每个人都想使用它。)

来自the docs,假设在连接或 ssh 进程本身中抛出错误,这应该捕获它并吐出堆栈跟踪。:

ssh.on('error', function(err) {
    console.log('Oops, something went wrong.');
    console.log(err);
    ssh.end();
});

此外,除了 stdout 处理程序 out:'s,要为每个 exec 命令获取错误,最好在处理程序中添加一些 err:'s,如下所示:

{
    out: function (stdout) {
        console.log(stdout);
    },
    err: function (stderr) {
        console.error('! ERROR !', stderr);
    },
}

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多