「echo」では/etc/shadowに書き込めないが、「nano」では書き込める

「echo」では/etc/shadowに書き込めないが、「nano」では書き込める

私の目標は、/etc/passwd に書き込んで権限を root に昇格することです。

新しい root ユーザーのパスワード「test1」を生成しました。openssl passwd test1 そして echo を使用して /etc/passwd ファイルに新しいエントリを追加します。sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd

しかし、この最後のコマンドを実行すると、これを行う権限がないことが示されます。bash: /etc/passwd: Permission denied

しかし、コマンドを使用してファイルの末尾にsudo nano /etc/passwdコピーすると機能します。root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash

コマンドの問題は何ですかecho?

答え1

すでにコメントで回答しましたが、もう少し詳しく説明します。

sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd

次のように翻訳されます。

  1. bash(昇格されていない)に、書き込み用にファイル/etc/passwdを開くように指示します。
  2. bash(まだ昇格されていない)にいくつかの引数を指定してコマンドを実行するように指示しsudo、手順1のファイル記述子をstdoutとして使用します。
    1. sudo(setuid root)echoにいくつかの引数を付けて コマンドを実行するよう指示する
      1. echo (root として実行し、通常はシェルの組み込みを呼び出すのに対し、これは /usr/bin/echo のようなものになる可能性が高いことに注意してくださいecho) に指示し、sudo から stdout を継承して、stdout にテキストを出力します。
      2. 任務完了、エコーは退場
    2. 仕事が終わると、sudoは終了し、rootとして何も実行されなくなります。
  3. Bash (まだ昇格されていません) は /etc/passwd へのファイル記述子を閉じます (書き込みキューをフラッシュします)
  4. Bashは次のコマンドを待ちます

ただし、もちろん、ステップ 1 は失敗します。Bash は昇格されていないため、書き込み用に /etc/passwd を開くことができません。したがって、bash: /etc/passwd: Permission deniedステップ 2 のサブステップを含め、ステップ 2 または 3 のどの部分も実行されません。

sudo nano /etc/passwd昇格されたプロセス (sudo からルート権限を継承する nano) が書き込み用にファイルを開くため、問題なく動作します。

ここで echo を使用する場合は、bash 自体を昇格させる必要があります。これは、sudo 内で bash (または他のシェル) を明示的に呼び出し、次に何を実行するかを指示することで実行できます。
sudo bash -c 'echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd'
または、3 つの個別のコマンドとして実行することもできます (最後の 2 つは bash の昇格されたインスタンスに渡されます)。
sudo bash echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd exit

関連情報