❶ linux下 利用C或C++ 語言調用需要root許可權的命令時候,怎麼處理。
試試以下這種方式:
1. root用戶下將目標程序設置為root:root所有權;
2. 將目標程序設置為所有人可訪問chmod 777 APPNAME;或者將目標用戶加入root組等方式,使用戶可執行該程序;
3. root用戶下為目標程序設置UID,chmod u+s APPNAME
4. 執行該程序時自動具備root許可權
sudo調用時需要用戶口令的情況可通過管道解決,形式如下:
echo "PASSWORD" | sudo -S sh -c " CMD1; CMD2;..."
❷ 如何在C語言編程中調用linux系統終端下的命令
根據調用需求,可以分為兩種:
一、僅執行系統命令,不需要該命令的列印結果。
這種情況可以用system函數。形式為
system(cmd);
其中cmd為char*類型的字元串,包含要執行的命令,命令的執行結果會輸出到標准輸出。
比如
system("mkdirtest");
這個執行,會在當前文件夾下創建test文件夾。
二、需要命令執行的列印。
雖然同樣可以使用system並重定向到文件,然後打開文件讀取,最終刪除文件。但這樣做比較繁瑣,更好的做法是使用popen。
FILE *fp = popen(cmd);
執行cmd中的命令,然後可以以C文件操作方式,讀取命令的輸出結果。比如:
if((fp=popen("pwd","r"))==NULL)//執行獲取當前目錄的系統命令pwd。
{
printf("執行失敗 ");//fp為NULL表示命令執行失敗。
}
else
{
chars[100];
while(fgets(s,100,fp))//獲取文件內容。
printf("%s",s);//輸出結果。
pclose(fp);//關閉。
}
❸ C語言關機代碼
可以通過C語言調用系統命令實現關機。
1、C語言可以通過system函數實現調用系統命令(shell 命令)。
system函數聲明於stdlib.h, 形式為
int system(const char *cmd);
功能為執行cmd中的shell指令。
2、在windows中,關機命令為shutdown. 具體說明如圖:
#include<stdlib.h>
intmain()
{
system("shutdown/s");//調用關機命令。
while(1);
}
5、注意事項:
該命令僅用於windows,如果要移植到其它操作系統,則需要適配目標系統的關機命令,如Linux的halt或shutdown -h。
❹ 如何在C語言中調用shell命令
1、system(執行shell 命令)
相關函數 fork,execve,waitpid,popen
表頭文件 #include<stdlib.h>
定義函數 int system(const char * string);
函數說明 system()會調用fork()產生子進程,由子進程來調用/bin/sh-c
string來執行參數string字元串所代表的命令,此命令執行完後隨
即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時
擱置,SIGINT和SIGQUIT 信號則會被忽略。
返回值 如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-
1。若參數string為空指針(NULL),則返回非零值。如果system()調
用成功則最後會返回執行shell命令後的返回值,但是此返回值也有
可能為system()調用/bin/sh失敗所返回的127,因此最好能再檢查
errno 來確認執行成功。
附加說明 在編寫具有SUID/SGID許可權的程序時請勿使用system(),system()會
繼承環境變數,通過環境變數可能會造成系統安全的問題。
範例:
#include<stdlib.h>
main()
{
system(「ls -al /etc/passwd /etc/shadow」);
}
2、popen(建立管道I/O)
相關函數 pipe,mkfifo,pclose,fork,system,fopen
表頭文件 #include<stdio.h>
定義函數 FILE * popen( const char * command,const char * type);
函數說明 popen()會調用fork()產生子進程,然後從子進程中調用/bin/sh -c
來執行參數command的指令。參數type可使用「r」代表讀取,「w」
代表寫入。依照此type值,popen()會建立管道連到子進程的標准輸
出設備或標准輸入設備,然後返回一個文件指針。隨後進程便可利
用此文件指針來讀取子進程的輸出設備或是寫入到子進程的標准輸
入設備中。此外,所有使用文件指針(FILE*)操作的函數也都可以使
用,除了fclose()以外。
返回值 若成功則返迴文件指針,否則返回NULL,錯誤原因存於errno中。
錯誤代碼 EINVAL參數type不合法。
注意事項 在編寫具SUID/SGID許可權的程序時請盡量避免使用popen(),popen()
會繼承環境變數,通過環境變數可能會造成系統安全的問題。
範例:
#include<stdio.h>
main()
{
FILE * fp;
char buffer[80];
fp=popen(「cat /etc/passwd」,」r」);
fgets(buffer,sizeof(buffer),fp);
printf(「%s」,buffer);
pclose(fp);
}
執行 root :x:0 0: root: /root: /bin/bash
3、使用vfork()新建子進程,然後調用exec函數族
#include<unistd.h>
main()
{
char * argv[ ]={「ls」,」-al」,」/etc/passwd」,(char*) };
if(vfork() = =0)
{
execv(「/bin/ls」,argv);
}else{
printf(「This is the parent process\n」);
}
}
❺ linux下怎樣用c語言調用shell命令
C程序調用shell腳本共同擁有三種法子 :system()、popen()、exec系列數call_exec1.c ,
system() 不用你自己去產生進程。它已經封裝了,直接增加自己的命令
exec 須要你自己 fork 進程,然後exec 自己的命令
popen() 也能夠實現運行你的命令,比system 開銷小
方法一、system()的使用。我直接上代碼吧
int system(const char *command);
我在/home/book/shell新建一個test.sh文件例如以下:
<span style="font-size:18px;"><span style="font-size:18px;">#!bin/bash
echo $HOME
echo "the is test!"</span></span>
test.c文件例如以下:
<span style="font-size:18px;"><span style="font-size:18px;">#include<stdlib.h>
int main()
{
system("bash /home/book/shell/test.sh"); /* chmod +x test.sh ,路徑前面要加上bash */
return 0;
}</span></span>
運行例如以下命令來編譯:
<span style="font-size:18px;">gcc test.c -o test
</span>
測試命令:
<span style="font-size:18px;">./test</span>
結果例如以下:
<span style="font-size:18px;">/root
the is test!</span>
方法二:popen() 會調用fork()產生 子歷程,然後從子歷程中調用/bin/sh -c來履行 參數command的指令。參數type可應用 「r」代表讀取。「w」代表寫入。遵循此type值。popen()會建立 管道連到子歷程的標准 輸出設備 或標准 輸入設備 ,然後返回一個文件指針。
隨後歷程便可利用 此文件指針來讀取子歷程的輸出設備 或是寫入到子歷程的標准 輸入設備 中。此外,全部應用 文 件指針(FILE*)操作的函數也都能夠應用 ,除了fclose()以外。
返回值:若成功 則返迴文件指針,否則返回NULL,差錯 原因存於errno中。注意:在編寫具SUID/SGID許可權的程序時請盡量避免應用 popen()。popen()會繼承環境變數。通過環境變數可能會造成系統安全的問題
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
其它不用改變我們直接改動test.c文件:
#include<stdio.h>
int main()
{
char buffer[80];
FILE *fp=popen("bash /home/book/shell/test.sh","r");
fgets(buffer,sizeof(buffer),fp);
printf("%s",buffer);
pclose(fp);
return 0;
}
方法三:exec函數簇 (我不太懂,別人的。也沒有驗證。習慣方法一)
須要注意的是exec並非1個函數, 事實上它僅僅是一組函數的統稱, 它包含以下6個函數:
#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[];
能夠見到這6個函數名字不同, 並且他們用於接受的參數也不同.
實際上他們的功能都是幾乎相同的, 由於要用於接受不同的參數所以要用不同的名字區分它們, 畢竟c語言沒有函數重載的功能嘛..
可是實際上它們的命名是有規律的:
exec[l or v][p][e]
exec函數里的參數能夠分成3個部分, 運行文件部分, 命令參數部分, 環境變數部分.
比如我要運行1個命令 ls -l /home/gateman
運行文件部分就是 "/usr/bin/ls"
命令參賽部分就是 "ls","-l","/home/gateman",NULL 見到是以ls開頭 每1個空格都必須分開成2個部分, 並且以NULL結尾的啊.
環境變數部分, 這是1個數組,最後的元素必須是NULL 比如 char * env[] = {"PATH=/home/gateman", "USER=lei", "STATUS=testing", NULL};
好了說下命名規則:
e興許, 參數必須帶環境變數部分, 環境變零部分參數會成為運行exec函數期間的環境變數, 比較少用
l 興許, 命令參數部分必須以"," 相隔, 最後1個命令參數必須是NULL
v 興許, 命令參數部分必須是1個以NULL結尾的字元串指針數組的頭部指針. 比如char * pstr就是1個字元串的指針, char * pstr[] 就是數組了, 分別指向各個字元串.
關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html
p興許, 運行文件部分能夠不帶路徑, exec函數會在$PATH中找
還有1個注意的是, exec函數會代替運行它的進程, 也就是說, 一旦exec函數運行成功, 它就不會返回了, 進程結束. 可是假設exec函數運行失敗, 它會返回失敗的信息, 並且進程繼續運行後面的代碼!
通常exec會放在fork() 函數的子進程部分, 來替代子進程運行啦, 運行成功後子程序就會消失, 可是運行失敗的話, 必須用exit()函數來讓子進程退出!
❻ c語言如何調用命令行並且是以管理員身份運行的命令行
這里要看具體情況,你最好能貼出具體的運行代碼。
一般來說,如果你本身是一個控制台程序,那麼zhuhuaizhong所說是一個合理的辦法。
但如果本身是一個windows窗口程序,通過拋出方式運行一個命令行,那麼應該採用如下幾個辦法之一:
1.
使用cmd的runas命令:runas
/user:user_name
program.exe
2.
創建外部命令行函數提權,要使用以下幾個函數之一(其它如winexec等方式無法實現),它們都有runas類似功能:
CreateProcess
CreateProcessAsUser
CreateProcessWithLogonW
CreateProcessWithTokenW
如果是在win7下,CreateProcessWithLogonW是推薦使用的方式,具體代碼請根據函數名搜索,不在這里粘貼了。