system() の IFS 変数は無視されます。

system() の IFS 変数は無視されます。

私は大学コースの権限昇格に努めています。私は単にlsビットの出力をコピーして設定する簡単なコードを持っていますSUID

int main(void){
  system("/bin/ls");
  return 0;
}

また、シェルとして機能するスクリプトをホームディレクトリに追加しました。

#!/bin/bash
/bin/sh

また、最初の変数である.変数を追加しました。$PATHしたがって、Cでコードを実行するたびにbinホームディレクトリのスクリプトを呼び出す必要がありますが、変数が代わりにIFS実行されるため、変数は完全に無視されます。なぜですか?/bin/lsbin ls

答え1

プログラムは実行されません」binscript"をホームディレクトリに保存します。を実行します"/bin/ls"。システムコールはシェルを使用しますが、絶対パス名も使用します(実際にはPOSIX実行方法は実装によって定義されます。)シェルの選択にPATH影響を与える方法はありません。ls

POSIX行動について次のようにIFS言います。

実装が無視できる値IFS環境にあってもなくてもIFS環境でシェルを呼び出すとき、シェルは以下を設定する必要があります。IFS<space> <tab> <newline>呼び出されるまで。

実装について問い合わせる場合いいえこのように振る舞うと(POSIXはこれらの慣行が目立つほど頻繁に発生することを示唆しているため)、特定の実装が関連しているはずです。

答え2

systemコマンドを実行するために呼び出されたシェルが環境の値を尊重して/bin/lsも、そのコマンドラインの解析には影響しません。IFS

  1. IFSシェルコマンドの解析には使用されません。コマンドは、行の表示方法を正確に指定するシェル構文を使用して単語に分割されます。 (メタ文字はタグを終了します。一部のメタ文字もタグです。)

  2. トークン化、尊重は引用されてIFSいない入力でのみ行われます。どんな形でも置換を経験します。したがって、コマンドがあり、$cmd変数値がcmdある場合は、/bin/ls代替IFSテキストをトークン化するために使用されます。しかし:

  3. /bin/ls単語分割にinを使用した/結果IFSは次のとおりです。サム性格。最初は空です。空の単語はコマンドとして使用できないため、実行しようとする代わりに何らかのエラーが発生しますbin

関連情報