我想通过我的 C 恶魔之一执行我的 sudo 命令之一。
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()
。
另一种选择是在没有密码的情况下执行 sudo 命令。为此,您可以/etc/sudoers
使用您喜欢的编辑器打开文件并在末尾添加这一行。请记住将 yourname 更改为用户名。
yourname ALL = (ALL) NOPASSWD: ALL