node.js - nodejs运行系统命令时遇到(Y or N)必须要输入Y或者N才能继续向下运行的解决办法是什么?
大家讲道理
大家讲道理 2017-04-17 14:43:56
0
2
801

假设当前nodejs要运行命令rm -rf 123.txt,那么代码就是

process.exec('rm -rf 123.txx',function (error, stdout, stderr) {
    if (error !== null) {
        console.log('exec error: ' + error);
    }else {
        console.log(stdout)
    }
});

OK,这里确实删除了。但是如果加上sudo呢?比如sudo rm -rf 123.txt,需要输入密码才能删除。下面是我尝试的办法,但是无法删除:

process.exec('sudo rm -rf 123',function (error, stdout, stderr) {
    if (error !== null) {
        console.log('exec error: ' + error);
    }else {
        process.exec('密码',function (error, stdout, stderr) {
            if (error !== null) {
                console.log('exec error: ' + error);
            }else {
                console.log(stdout)
            }
        });
        console.log(stdout)
    }
});

这是我尝试嵌套process.exec来解决,但是发现无法解决。

上面是个例子,实际项目中我需要使用nodejs来调用python或者其他脚本。
比如xxx.py,在实际终端下他是这样的:

test@test:~/$ python xxx.py
info:xxxxxxx
请问是否继续么?(Y or N):Y
sys_info:xxxxx
请问是否退出?(Y or N):N
log_info:xxxxx
test@test:~/$ 

如果nodejs调用的话,该怎么办,怎么让提示信息为请问是否继续么?(Y or N):时自动输入Y,并回车继续向下执行。当提示信息为请问是否退出?(Y or N):时,自动输入N,然后回车运行。

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全員に返信(2)
小葫芦

sudo コマンドには -S オプションがあり、パスワードの入力が必要な場合にパスワードを読み取るために使用されます。

パスワードが 111111 であるとすると、完全なコマンドは次のようになります。

エコー "111111" | sudo -S rm -rf ./123.txt

同様に、ノードコードは次のようになります。

var child_process = require('child_process');
child_process.exec('echo "111111" | sudo -S rm -rf ./123.txt', function(error, stdout, stderr){
    if(エラー){
        エラーをスローします。
    }それ以外{
        console.log(標準出力);
    }
});
いいねを押す +0
PHPzhong

スタックオーバーフロー

私は一日中これに取り組んでいました。

問題は、生成されたプロセスの STDOUT がその出力バッファをフラッシュする必要があることです。そうしないと、バッファがいっぱいになるまでそこに留まり、その場合、コードは再度実行されなくなります。

p.stdin.end() はプロセスを終了するだけであり、その性質上、OS はすべてのバッファをクリアできます。

これは出力バッファの所有者ではないため、ノードからこれを行うことはできません。

面倒ですが、スクリプトを制御できる限り、スクリプトを変更できます。自動フラッシュを設定するコマンド ライン オプションを使用できるようにすることもできます。

これが何らかのお役に立てば幸いです。

パスワードを要求する sudo の出力ではバッファがフラッシュされず、ノードのデータがトリガーされないため、次のコードは機能しません。

子プロセスがバッファのフラッシュを呼び出す場合 (Python sys.stdin.flash など)、理論上はこのセクションと同様のコードが機能します。

const childProcess = require("child_process");

const exec = childProcess.spawn("sudo", ["rm", "123.tx"], {
  標準音声:「パイプ」
});

exec.stdout.on("データ", (データ) => {
  console.log("stdout", data.toString());
  exec.stdin.write("123456\n");
});

exec.stderr.on("データ", (データ) => {
  console.log("stderr", data.toString());
  exec.stdin.write("123456\n");
});

exec.on("閉じる", (コード) => {
  console.log(`exit ${code}`);
});
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート