c言語shellスクリプトの実行
2467 ワード
System(「スクリプトパス」)でshellスクリプトを実行
1、system(shellコマンド実行)
そうかんかんすう
fork,execve,waitpid,popen
ヘッダファイル
#include
関数の定義
int system(const char * string);
関数の説明
System()はfork()を呼び出してサブプロセスを生成し、サブプロセスによって/bin/sh-cを呼び出す
stringは、パラメータstring文字列で表されるコマンドを実行します.このコマンドが実行されると、
元の呼び出しのプロセスを返します.システム()の呼び出し中にSIGCHLD信号が一時的に
放置するとSIGINTとSIGQUIT信号は無視されます.
戻り値system()が/bin/shの呼び出しに失敗した場合は127、その他の失敗原因が返されます.
1.パラメータstringが空のポインタ(NULL)の場合、ゼロ以外の値が返されます.
システム()の場合
成功するとshellコマンドを実行した後の戻り値が最後に返されますが、この戻り値もあります.
システム()呼び出し/bin/sh失敗で返される127である可能性があるので、再チェックできることが望ましい
errnoは実行に成功したことを確認します.
追加の説明
SUID/SGID権限を持つプログラムを作成するときはシステム()を使用しないでください.システム()
環境変数を継承すると、環境変数によってシステムのセキュリティに問題が発生する可能性があります.
例:
2、popen(配管I/Oの確立)
そうかんかんすう
pipe,mkfifo,pclose,fork,system,fopen
ヘッダファイル
#include
関数の定義
FILE * popen( const char * command,const char * type);
関数の説明
popen()はfork()を呼び出してサブプロセスを生成し、サブプロセスから/bin/sh-cを呼び出します.
に表示されます.パラメータtypeは「r」を使用して読み取りを表すことができ、「w」
書き込みを表します.このtype値に基づいてpopen()は、サブプロセスへのパイプ接続の標準出力を確立します.
デバイスまたは標準入力デバイスを出て、ファイルポインタを返します.その後のプロセスは利益を得ることができます
このファイルポインタでサブプロセスの出力デバイスを読み込むか、サブプロセスに書き込まれた標準出力
デバイスに入力します.また、ファイルポインタ(FILE*)操作を使用するすべての関数で
用、fclose()以外は.
戻り値
成功したらファイルポインタを返し、そうでなければNULLを返し、エラーの原因はerrnoに保存されます.
エラーコードEINVALパラメータtypeが不正です.
注意事項
SUID/SGID権限のあるプログラムを作成する場合は、popen()、popen()の使用は避けてください.
環境変数が継承され、環境変数によってシステムのセキュリティに問題が発生する可能性があります.
例:
実行root:x:0:root:/root:/bin/bash
3、vfork()を使用してサブプロセスを新規作成し、exec関数ファミリーを呼び出す
1、system(shellコマンド実行)
そうかんかんすう
fork,execve,waitpid,popen
ヘッダファイル
#include
関数の定義
int system(const char * string);
関数の説明
System()はfork()を呼び出してサブプロセスを生成し、サブプロセスによって/bin/sh-cを呼び出す
stringは、パラメータstring文字列で表されるコマンドを実行します.このコマンドが実行されると、
元の呼び出しのプロセスを返します.システム()の呼び出し中にSIGCHLD信号が一時的に
放置するとSIGINTとSIGQUIT信号は無視されます.
戻り値system()が/bin/shの呼び出しに失敗した場合は127、その他の失敗原因が返されます.
1.パラメータstringが空のポインタ(NULL)の場合、ゼロ以外の値が返されます.
システム()の場合
成功するとshellコマンドを実行した後の戻り値が最後に返されますが、この戻り値もあります.
システム()呼び出し/bin/sh失敗で返される127である可能性があるので、再チェックできることが望ましい
errnoは実行に成功したことを確認します.
追加の説明
SUID/SGID権限を持つプログラムを作成するときはシステム()を使用しないでください.システム()
環境変数を継承すると、環境変数によってシステムのセキュリティに問題が発生する可能性があります.
例:
#include
main(){
system(“ls -al /etc/passwd /etc/shadow”);
}
2、popen(配管I/Oの確立)
そうかんかんすう
pipe,mkfifo,pclose,fork,system,fopen
ヘッダファイル
#include
関数の定義
FILE * popen( const char * command,const char * type);
関数の説明
popen()はfork()を呼び出してサブプロセスを生成し、サブプロセスから/bin/sh-cを呼び出します.
に表示されます.パラメータtypeは「r」を使用して読み取りを表すことができ、「w」
書き込みを表します.このtype値に基づいてpopen()は、サブプロセスへのパイプ接続の標準出力を確立します.
デバイスまたは標準入力デバイスを出て、ファイルポインタを返します.その後のプロセスは利益を得ることができます
このファイルポインタでサブプロセスの出力デバイスを読み込むか、サブプロセスに書き込まれた標準出力
デバイスに入力します.また、ファイルポインタ(FILE*)操作を使用するすべての関数で
用、fclose()以外は.
戻り値
成功したらファイルポインタを返し、そうでなければNULLを返し、エラーの原因はerrnoに保存されます.
エラーコードEINVALパラメータtypeが不正です.
注意事項
SUID/SGID権限のあるプログラムを作成する場合は、popen()、popen()の使用は避けてください.
環境変数が継承され、環境変数によってシステムのセキュリティに問題が発生する可能性があります.
例:
#include
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:root:/root:/bin/bash
3、vfork()を使用してサブプロセスを新規作成し、exec関数ファミリーを呼び出す
#include
main()
{
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) };
if(vfork() = =0)
{
execv(“/bin/ls”,argv);
}else{
printf(“This is the parent process
”);
}
}