私が書いたコードスニペットは次のようなものです:
#include <stdlib.h>
int main()
{
system("/bin/bash ls");
}
バイナリをコンパイルして実行すると、次の結果が得られました: /bin/ls: /bin/ls: バイナリ ファイルを実行できません
ここで欠けているものは何ですか?
私が書いたコードスニペットは次のようなものです:
#include <stdlib.h>
int main()
{
system("/bin/bash ls");
}
バイナリをコンパイルして実行すると、次の結果が得られました: /bin/ls: /bin/ls: バイナリ ファイルを実行できません
ここで欠けているものは何ですか?
ls
実際のシステム バイナリです。組み込みのシェル コマンドではありません。必要なのはsystem("ls")
. ls
現在、バイナリ ファイルの内容をスクリプトとして bash に渡そうとしています。
system()
一部の環境変数の奇妙な値がシステムの整合性を破壊するために使用される可能性があるため、プログラムから使用しないでください。代わりに関数ファミリーを使用してくださいexec(3)
。ただし、execlp(3) または execvp(3) は使用しないでください。実際、 system() は、 のシステムで set-user-ID または set-group-ID 権限を持つプログラムからは正しく機能しません。これ/bin/sh is bash version 2
は、bash 2 が での権限を削除するためstartup
です。(Debian は、sh として呼び出されたときにこれを行わない、変更された bash を使用します。)
あなたの場合、ls
シェルのコマンドに組み込まれていないため、機能しsystem()
ていません。
type <cmd_name>
コマンドを使用して、cmd_name
組み込みかどうかを確認できます。
より多くの人のために system()
オプションが指定されていない場合、/bin/bash への引数は、実行するシェル コマンドを含むファイルの名前です。
コマンド ラインで指定されたコマンドを実行するには、次の-c
オプションを使用します/bin/bash -c ls
。
他の人が指摘しているように、これを行う際にはセキュリティ上の考慮事項があるため、代替手段を探す必要があります。