C++ 在C/C+中使用执行sudo命令+;节目

C++ 在C/C+中使用执行sudo命令+;节目,c++,c,linux,C++,C,Linux,我想通过我的一个C恶魔执行我的一个sudo命令 我使用命令系统(echo MYPASSWORD | sudo-v-S)在我的C代码中 当我执行demon时,它运行良好,但当我退出终端时,它失败,返回值为256 当进程在后端运行时,请建议我使用其他方法传递密码。另一个选项是在没有密码的情况下执行sudo命令。为此,您可以使用您喜爱的编辑器打开文件/etc/sudoers,并在末尾添加这一行。记住用用户名更改yourname yourname ALL=(ALL)NOPASSWD:ALL另一个选项是在

我想通过我的一个C恶魔执行我的一个sudo命令

我使用命令系统(echo MYPASSWORD | sudo-v-S)在我的C代码中

当我执行demon时,它运行良好,但当我退出终端时,它失败,返回值为256


当进程在后端运行时,请建议我使用其他方法传递密码。

另一个选项是在没有密码的情况下执行sudo命令。为此,您可以使用您喜爱的编辑器打开文件
/etc/sudoers
,并在末尾添加这一行。记住用用户名更改yourname


yourname ALL=(ALL)NOPASSWD:ALL

另一个选项是在没有密码的情况下执行sudo命令。为此,您可以使用您喜爱的编辑器打开文件
/etc/sudoers
,并在末尾添加这一行。记住用用户名更改yourname


yourname ALL=(ALL)NOPASSWD:ALL

一些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版本使用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()之前调用。

也许您应该看看PolicyKit?哦,还有,如果你在代码中这样写密码,有人很有可能通过在shell中运行
strings你的程序
来获得密码。“如果你每次都需要root权限,最好是以root身份启动你的程序,并使用setuid和setgid删除它们(在子进程中)。”,也许你应该看看PolicyKit?哦,还有,如果你在代码中这样写密码,很有可能有人可以通过在shell中运行
字符串来获取密码。“如果你每次都需要root权限,最好是以root身份启动程序,并使用setuid和setgid将其删除(在子进程中)”,实际上sudo不是我的主要问题,主要的问题是,即使我的终端关闭,也要从stdin获取输入。只要想想这个代码:`system(“echo PASSWORD | passwd USERNAME--stdin”)`也许您需要一个shell脚本来完成这项工作,并将密码作为参数。因此,C程序调用
系统(sh script.sh PASSWORD)
,脚本包含上面的代码。实际上sudo不是我的主要问题,主要问题是即使我的终端关闭,也从stdin获取输入。只要想想这个代码:`system(“echo PASSWORD | passwd USERNAME--stdin”)`也许您需要一个shell脚本来完成这项工作,并将密码作为参数。因此,C程序调用
系统(sh script.sh PASSWORD)
,脚本包含上面的代码。