2

C デーモンの 1 つを介して sudo コマンドの 1 つを実行したいと思います。

system(echo MYPASSWORD | sudo -v -S);C コードでコマンドを使用します。

デーモンを実行すると正常に動作します。ただし、ターミナルを終了すると、戻り値 256 で失敗します。

プロセスがバックエンドで実行されているときにパスワードを渡す別の方法を提案してください。

4

2 に答える 2

2

一部の SUDO バージョンでは、open("/dev/tty") を使用して、パスワードがこの方法で送信されないようにしています。これを回避するには、次のようにします。

int ptm=open("/dev/ptmx"....);
int pid=fork();
if(!pid)
{
    close(0);
    close(1);
    close(2);
    setsid();
    unlockpt(...); grantpt(...);
    pts=open(ptsname...);
    execl(getenv("SHELL"),"sh","-c","sudo any_command",NULL);
    exit(1);
}
// now the ptm file handle is used to send data
// to the process and to receive output from the process
waitpid(...);

すべての tty が閉じられると、setsid() が呼び出され、新しい tty (ここでは /dev/ptsn) が開かれ、新しい tty がプロセスの /dev/tty になります。これは、sudo が疑似端末からパスワードを読み取ることを意味します。

編集

例のバグを修正しました: のopen("/dev/ptmx" ...)前に呼び出す必要がありますfork()

于 2013-08-31T14:37:03.820 に答える
0

もう 1 つのオプションは、パスワードなしで sudo コマンドを実行することです。/etc/sudoersこれを行うには、お気に入りのエディターでファイルを開き、この行を最後に追加します。yourname をユーザー名に変更することを忘れないでください。

yourname ALL = (ALL) NOPASSWD: ALL

于 2013-08-31T14:24:01.127 に答える