我想通過我的一個C惡魔執行我的一個sudo命令。在C/C++程序中執行sudo命令
我使用命令system(echo MYPASSWORD | sudo -v -S);在我的C代碼。
它運行正常,當我執行的惡魔,但是,當我從終端退出它失敗的256
返回值,請給我建議一些替代的方式來傳遞時,該過程在後臺運行的密碼。
我想通過我的一個C惡魔執行我的一個sudo命令。在C/C++程序中執行sudo命令
我使用命令system(echo MYPASSWORD | sudo -v -S);在我的C代碼。
它運行正常,當我執行的惡魔,但是,當我從終端退出它失敗的256
返回值,請給我建議一些替代的方式來傳遞時,該過程在後臺運行的密碼。
一些SUDO版本使用open( 「的/ dev/tty的」),以確保密碼不能被這種方式發送。你可以執行以下操作來避免這種情況:
int pid=fork();
int ptm=open("/dev/ptmx"....);
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將從僞終端讀取密碼。
另一種選擇是不使用密碼執行sudo命令。要做到這一點,你可以用你最喜歡的編輯器打開文件/etc/sudoers
,並在最後添加這一行。請記住使用用戶名更改您的名稱。
yourname ALL = (ALL) NOPASSWD: ALL
其實sudo不是我的主要問題,主要問題是從stdin獲取輸入,即使我的終端已關閉。想想這個代碼:'system(「echo PASSWORD | passwd USERNAME --stdin」); ' –
也許你需要有一個shell腳本來完成這項工作,並將密碼作爲參數。因此,C程序調用'system(sh script.sh PASSWORD)',腳本包含上面的代碼。 –
也許你應該看看PolicyKit? http://www.freedesktop.org/wiki/Software/polkit/ –
哦,而且,如果你在你的代碼中這樣寫你的密碼,那麼有人可以通過在你的代碼中運行'strings YourProgram'來獲得它。貝殼。 –
「如果您每次都需要root權限,最好的辦法是以root身份啓動程序,並使用setuid和setgid」[如何以編程方式獲得root權限?](http:// stackoverflow。 com/questions/2483755/how-to-program-gain-root-privileges) – cpp