アプリ版:「スタンプのみでお礼する」機能のリリースについて

Cのプログラムでpopen()を使って別のプログラムを実行したいのですが、popen("ABC","r")の"ABC"をプログラム実行者側で指定できるようにしたいのですが、可能でしょうか??
(例えば、実行時に引数をlsと指定すると、”ABC”がlsになってlsが実行される、のような)

popen("Argv[1]","r")のようにしても上手くいきません。。

どなたかご教授お願いします。

A 回答 (4件)

Perlじゃないんだからそういう書き方しても


interpolationしてくれませんから。

ということで、
char cmd[64]; //サイズは適当に調整してください

snprintf(cmd, sizeof cmd, "%s", argv[1]);
とか
strlcpy(cmd, argv[1], sizeof cmd);
して

popen(cmd, "r");

と実行。

それから、ユーザーから入力をもらって
それをノーチェックで実行するのは
*とっても危険*ですので、ちゃんとチェックしましょう。
    • good
    • 0
この回答へのお礼

ちゃんと動作できました。ありがとうございます!

後学のために聞きたいんですが、どうしてチェックしないと「とっても危険」なのでしょうか??

お礼日時:2007/08/02 13:26

> 後学のために聞きたいんですが、どうしてチェックしないと「とっても危険」なのでしょうか??



たとえばの話 rm -rf / とか渡されたらどうします?(笑)

これはファイルやディレクトリのパーミッションで
助かるかもしれませんが、いずれにしろ
ナニが入ってくるかわからないわけですから、
きちんとチェックしましょうね、ということです。

ってまあどういうチェックをどこまでやるとの言うのは
結構面倒な問題だったりするのですが。

あと、渡されるコマンドの出力をどうしたいのかが
わからなかったので#1の回答では popenをそのまま使いましたが、

単にコマンドが実行できれば良いということなら、
#2のzwiさんの書かれたとおりで、systemなり
何なりを使った方が良いです。
    • good
    • 0
この回答へのお礼

解答していただいた皆さん、本当にありがとうございました。
とっても参考になりました。

なぜpopenなのかなんですが、、自分の見たサイトではsystemよりpopenの方がよいと書いてあったからです。(私の解釈ミスかもしれませんが)

systemで出来ました。確かにこっちの方が良さそうですね。

危険性などについての解答もありがとうございました。

また機会があればよろしくお願いいたします。

お礼日時:2007/08/02 14:32

>後学のために聞きたいんですが、どうしてチェックしないと「とっても危険」なのでしょうか??


自分のコンピュータに自分で入力するのなら直接コマンド入力するのと変わりないでそれほど問題にはなりにくいです。でも使用できるコマンドに制限をつけるとかチェックは入れておいたほうが良いでしょう。
問題なのはその入力が他人からされる可能性のあるもので、悪意のあるコマンドでファイルの内容を読まれたりファイルを書き換えられたり削除されたりする危険性が有ります。
インターネットの初期ではこういう脆弱性のあるCGIが結構ありました。
    • good
    • 0

popen(Argv[1],"r")で実行できると思います。


しかしなぜpopenなのでしょうか?パイプを使いますか?
ただ起動したいだけならsystem(Argv[1])だと思うのですが。

ちなみにWindowsだと"ShellExecute"とかを使います。
http://msdn.microsoft.com/library/ja/default.asp …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!