- ベストアンサー
popen() について。
Cのプログラムでpopen()を使って別のプログラムを実行したいのですが、popen("ABC","r")の"ABC"をプログラム実行者側で指定できるようにしたいのですが、可能でしょうか?? (例えば、実行時に引数をlsと指定すると、”ABC”がlsになってlsが実行される、のような) popen("Argv[1]","r")のようにしても上手くいきません。。 どなたかご教授お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Perlじゃないんだからそういう書き方しても interpolationしてくれませんから。 ということで、 char cmd[64]; //サイズは適当に調整してください snprintf(cmd, sizeof cmd, "%s", argv[1]); とか strlcpy(cmd, argv[1], sizeof cmd); して popen(cmd, "r"); と実行。 それから、ユーザーから入力をもらって それをノーチェックで実行するのは *とっても危険*ですので、ちゃんとチェックしましょう。
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
> 後学のために聞きたいんですが、どうしてチェックしないと「とっても危険」なのでしょうか?? たとえばの話 rm -rf / とか渡されたらどうします?(笑) これはファイルやディレクトリのパーミッションで 助かるかもしれませんが、いずれにしろ ナニが入ってくるかわからないわけですから、 きちんとチェックしましょうね、ということです。 ってまあどういうチェックをどこまでやるとの言うのは 結構面倒な問題だったりするのですが。 あと、渡されるコマンドの出力をどうしたいのかが わからなかったので#1の回答では popenをそのまま使いましたが、 単にコマンドが実行できれば良いということなら、 #2のzwiさんの書かれたとおりで、systemなり 何なりを使った方が良いです。
お礼
解答していただいた皆さん、本当にありがとうございました。 とっても参考になりました。 なぜpopenなのかなんですが、、自分の見たサイトではsystemよりpopenの方がよいと書いてあったからです。(私の解釈ミスかもしれませんが) systemで出来ました。確かにこっちの方が良さそうですね。 危険性などについての解答もありがとうございました。 また機会があればよろしくお願いいたします。
- php504
- ベストアンサー率42% (926/2160)
>後学のために聞きたいんですが、どうしてチェックしないと「とっても危険」なのでしょうか?? 自分のコンピュータに自分で入力するのなら直接コマンド入力するのと変わりないでそれほど問題にはなりにくいです。でも使用できるコマンドに制限をつけるとかチェックは入れておいたほうが良いでしょう。 問題なのはその入力が他人からされる可能性のあるもので、悪意のあるコマンドでファイルの内容を読まれたりファイルを書き換えられたり削除されたりする危険性が有ります。 インターネットの初期ではこういう脆弱性のあるCGIが結構ありました。
- zwi
- ベストアンサー率56% (730/1282)
popen(Argv[1],"r")で実行できると思います。 しかしなぜpopenなのでしょうか?パイプを使いますか? ただ起動したいだけならsystem(Argv[1])だと思うのですが。 ちなみにWindowsだと"ShellExecute"とかを使います。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpshell/html/_win32_shellexecute.asp
お礼
ちゃんと動作できました。ありがとうございます! 後学のために聞きたいんですが、どうしてチェックしないと「とっても危険」なのでしょうか??