C デーモンの 1 つを介して sudo コマンドの 1 つを実行したいと思います。
system(echo MYPASSWORD | sudo -v -S);
C コードでコマンドを使用します。
デーモンを実行すると正常に動作します。ただし、ターミナルを終了すると、戻り値 256 で失敗します。
プロセスがバックエンドで実行されているときにパスワードを渡す別の方法を提案してください。
一部の 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()
。
もう 1 つのオプションは、パスワードなしで sudo コマンドを実行することです。/etc/sudoers
これを行うには、お気に入りのエディターでファイルを開き、この行を最後に追加します。yourname をユーザー名に変更することを忘れないでください。
yourname ALL = (ALL) NOPASSWD: ALL