2016-10-10 8 views
-1

私はUNIXには新しく、何か助けが必要です。cのargvをUNIXのコマンドに構文解析します。

私は、別のユーザコールuserbにあるsuidプログラムであるprojectcという別のプログラムコールを持っています。 userbには、その所有者(userb)に対する書き込みと読み取りのアクセス許可を持つディレクトリパスがあります。

printfを使用して、argv引数でコマンドprintf(system("cat /home/userb/pass"))を実行しようとしています。
私はCコードprintf(system("cat /home/userb/pass"))で直接実行できますが、argv引数で実行していますが、できません)。
argv[1]パラメータをコマンドに解析する方法はありますか?

これは私がUNIXで動作させようとしている私のCプログラムです。

int main(int argc, char **argv){ 

    printf(argv[1]); 
    return 0; 
} 
+1

手動で解析しない限り、文字列からC関数を呼び出すことはできません。私は驚いて 'printf(システム(..)あなたのために何かをしました - その戻り値は有効な文字列ではないので、' printf'がクラッシュする可能性があります。 – usr2564301

答えて

3
printf(system("cat /home/userb/pass")) 

サブプロセスは、画面上に印刷されたので、これは動作するように見えた理由があります。 printfは不必要であっただけでなく、実際にはバグでした。 printfの最初のパラメータは文字列(char*)ですが、systemのretrnの値はintです。

正しい呼び出しは次のようになります。あなたが実行したいコマンドがある

int success = system("cat /home/userb/pass"); 

argv[1]場合は、あなただけ呼び出すことができます。

int status = system(argv[1]); 

あなたは、このようなあなたのプログラムを実行することができます:

myprogram "cat /home/userb/pass" 

二重引用符に注意してください。コマンド全体が確実に1つのものとして渡されますeパラメータ。引用符がなければ、2つのパラメータに分割されます。

コンパイラの警告レベルを上げてください。 printf(system("cat /home/userb/pass"))は、コンパイル時に大きな警告/エラーを表示するはずです。