2013-08-31 92 views
-1

我想通過我的一個C惡魔執行我的一個sudo命令。在C/C++程序中執行sudo命令

我使用命令system(echo MYPASSWORD | sudo -v -S);在我的C代碼。

它運行正常,當我執行的惡魔,但是,當我從終端退出它失敗的256

返回值,請給我建議一些替代的方式來傳遞時,該過程在後臺運行的密碼。

+0

也許你應該看看PolicyKit? http://www.freedesktop.org/wiki/Software/polkit/ –

+4

哦,而且,如果你在你的代碼中這樣寫你的密碼,那麼有人可以通過在你的代碼中運行'strings YourProgram'來獲得它。貝殼。 –

+6

「如果您每次都需要root權限,最好的辦法是以root身份啓動程序,並使用setuid和setgid」[如何以編程方式獲得root權限?](http:// stackoverflow。 com/questions/2483755/how-to-program-gain-root-privileges) – cpp

回答

0

一些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將從僞終端讀取密碼。

0

另一種選擇是不使用密碼執行sudo命令。要做到這一點,你可以用你最喜歡的編輯器打開文件/etc/sudoers,並在最後添加這一行。請記住使用用戶名更改您的名稱。

yourname ALL = (ALL) NOPASSWD: ALL

+0

其實sudo不是我的主要問題,主要問題是從stdin獲取輸入,即使我的終端已關閉。想想這個代碼:'system(「echo PASSWORD | passwd USERNAME --stdin」); ' –

+0

也許你需要有一個shell腳本來完成這項工作,並將密碼作爲參數。因此,C程序調用'system(sh script.sh PASSWORD)',腳本包含上面的代碼。 –