0

execve() を介して複数のコマンドを (または単純な出力リダイレクトを使用して) 実行しようとしています。

これを配置すると (もちろん、この文字列を関数に渡す前に、スペースに分割し、それぞれを char* [] に分けます):

"bash -c ' /usr/bin/cat /root/script.sh > /root/script1.sh ' "

execve() 関数に、エラーが発生しました:

/usr/bin/cat: -c: 行 0: 一致する「」を探しているときに予期しない EOF が発生しました

/usr/bin/cat: -c: 1 行目: 構文エラー: 予期しないファイルの終わり

これは、正確にexecve() 関数を使用して複数の Linux コマンド (PATH にあるアプリケーション) を実行するという私の提案です(セキュリティ上の理由から)。

しかし、このソリューションは期待どおりに機能しません。

私のソリューションを修正するアイデアはありますか? それ以外の場合は execve() を使用できるかもしれませんが、方法がわかりません..

編集:簡略化されたソースコードを追加しました(申し訳ありませんが、会社の制限により、元の形式で貼り付けることはできません)ソースコード:

int foo(const char *cmdline)
{
    char d[] = "bash -c ' /usr/bin/cat /root/script.sh > /root/script1.sh ' ";

    args = strtok(d, " ");
    counter = 0;
    while (args != NULL)
    {
        cmdline_args[counter++] = args;
        args = strtok(NULL, " ");
    }
    cmdline_args[counter] = '\0';

    switch (pid = fork()) {
    case -1:
        ret = -1;
    case 0: // for execve
        status = execve(cmdline_args[0], cmdline_args, env);
        exit(status);
    default: // for parent pid
        if (waitpid(pid, &status, 0) < 0) {
            // in case when waitpid failed
        }
    }
    return ret;
}
4

2 に答える 2

0

このようにすればうまくいきます:

cmdline_args[0] = "bash";
cmdline_args[1] = "-c";
cmdline_args[2] = "/usr/bin/cat /root/script.sh > /root/script1.sh";
cmdline_args[3] = NULL;

したがって、問題は、コマンド ライン文字列全体を .ini で処理していることですstrtok。そのため、bash複数のパラメーターを取得します (想定されている 1 つだけではなく、コマンド文字列全体)。bashおそらく最初のコマンドパラメーターのみを解釈しているため、コマンドを実行することになります'...

おそらくそれを行うより良い方法がありますが...

于 2015-11-23T11:53:06.260 に答える