非対話モードでsudoコマンドを使用する
1. 概要
Linuxでは、 sudo コマンドを使用すると、スーパーユーザーとしてコマンドまたはスクリプトを実行できます。 ただし、デフォルトでは、sudoコマンドはインタラクティブモードで機能します。
このチュートリアルでは、 sudo に非対話型モードで動作するように指示する方法を見ていきます。たとえば、パスワードをパラメーターとして渡します。
さらに、パスワードを要求せずにスーパーユーザーとしてコマンドを実行する他のアプローチについても説明します。
2. パスワードをパラメータとして渡す
まず、sudoコマンドのデフォルトの動作を確認しましょう。
kent$ sudo cp /root/.vimrc root_vimrc
[sudo] password for kent:
kent$ ls -l root_vimrc
-rw------- 1 root root 19768 Oct 23 23:24 root_vimrc
上記の例では、sudoコマンドを通常のユーザーkentとして実行しました。 rootのVim構成ファイルを現在のディレクトリにコピーします。
出力が示すように、 sudo はパスワードの入力を求め、ユーザーkentのパスワードが提供されるのを待って続行しました。 正しいパスワードを入力すると、.vimrcが現在のディレクトリにコピーされます。
sudo コマンドを非対話型モードで実行したい場合があります。たとえば、このsudoコマンドをスクリプトでラップする必要がある場合です。
次に、パスワードをパラメーターとしてsudo。に渡す方法を見てみましょう。
2.1. -Sオプションの使用
sudo コマンドは、端末デバイスを使用する代わりに、標準入力(stdin)からパスワードを読み取る-Sオプションを提供します。
同じコマンドを使用してこのオプションをテストしてみましょう。
kent$ echo "My Pass" | sudo -S cp /root/.vimrc root_vimrc2
[sudo] password for kent:
kent$ ls -l root_vimrc2
-rw------- 1 root root 19768 Oct 23 23:34 root_vimrc2
ご覧のとおり、パスワードをstdinにパイプしました。 sudoコマンドはまだプロンプトを表示していましたが、今回は入力を待たずに、cpコマンドを実行し続けました。
2.2. プロンプトの抑制
-Sオプションを使用すると、sudoはプロンプトを標準出力( stdout )ではなく標準エラー(stderr)に書き込みます。
必要に応じて、リダイレクトを使用してパスワードプロンプトをすばやく抑制できます。
kent$ echo "My Password" | sudo -S cp /root/.vimrc root_vimrc3 2>/dev/null
kent$ ls -l root_vimrc3
-rw------- 1 root root 19768 Oct 23 23:44 root_vimrc3
2.3. セキュリティリスク
これまでのところ、sudoを非対話型モードで正常に動作させることができました。 ただし、コマンドを再検討すると、sudoコマンドにパスワードをクリアテキストとして渡したことがわかります。
これらのコマンドを端末で実行すると、コマンド履歴にパスワードが保存される場合があります。 また、コマンドをシェルスクリプトでラップすると、スクリプトファイルにパスワードが保持されます。
つまり、このアプローチはセキュリティリスクを生み出す可能性があります。 特に、公開サーバーに適用した場合、無意識のうちにパスワードが漏洩する可能性があります。
次に、パスワードを指定せずにsudoコマンドを使用してコマンドを実行する別の方法を見てみましょう。
3. パスワードを要求せずにスーパーユーザーとしてコマンドを実行する
3.1. スクリプトの例
まず、説明を簡単にするための簡単なシェルスクリプトを作成しましょう。
kent$ cat cpvimrc.sh
#!/bin/bash
echo "Copy root's .vimrc as root_vimrc"
cp /root/.vimrc root_vimrc
echo "File copied:"
ls -l root_vimrc
基本的に、このスクリプトは、rootの.vimrcファイルとlsコマンドをコピーするコマンドをラップします。
当然のことながら、このスクリプトを kent ユーザーとして直接実行すると、ユーザーrootのみが/root/.vimrcファイルにアクセスできるため、失敗します。 。
また、 sudo で実行すると、パスワードの入力を求められます。
次に、パスワードを要求せずに sudo コマンドを使用して、スーパーユーザーとしてこのスクリプトを実行する方法について説明します。
3.2. sudoコマンドの構成を変更する
sudo コマンドを構成して、すべてのユーザーまたは指定されたユーザーがパスワードを要求せずに特定のプログラムにアクセスできるようにすることができます。
sudo コマンドの構成を編集するには、 visudoコマンドを実行するか、ファイル/ etc /sudoersを編集します。 どちらも、変更を保存するためにroot権限が必要です。
それでは、例に戻りましょう。 私たちの目標は、kentユーザーが「sudo./cpvimrc.sh」コマンドを非対話型モードで実行できるようにすることです。
これを実現するために、sudoコマンドの構成に1行追加できます。
kent ALL=(root) NOPASSWD: /tmp/test/cpvimrc.sh
この行は、 sudo に次のように伝えます。ユーザーkentがsudoを使用してスクリプト/tmp/test/cpvimrc.shを実行すると、sudoコマンドはパスワードを要求せずにrootとしてスクリプトを実行します。
次に、変更を保存して、期待どおりに機能するかどうかをテストします。
kent$ sudo ./cpvimrc.sh
Copy root's .vimrc as root_vimrc.
File copied:
-rw------- 1 root root 19768 Oct 24 22:59 root_vimrc
出力で見たように、今回は、 sudo はパスワードの入力を求めず、ファイルを直接コピーしました。 さらに、パスワードはどこにも漏洩していません。
ただし、この特権はユーザーkentにのみ割り当てられます。 したがって、別の通常のユーザーと同じスクリプトを実行する場合は、正しいパスワードを入力する必要があります。
guest$ sudo ./cpvimrc.sh
[sudo] password for guest:
Copy root's .vimrc as root_vimrc.
File copied:
-rw------- 1 root root 19768 Oct 24 23:05 root_vimrc
上記の例は、ユーザー guest としてログインし、 sudo でスクリプトを開始するときに、パスワードを入力する必要があることを示しています。
3.3. すべてのユーザーがパスワードを要求せずにrootとしてプログラムを実行できるようにする
場合によっては、sudo権限を持つすべてのユーザーが、パスワードを要求せずにrootとしてプログラムを実行できるようにしたいことがあります。
これを実現するために、sudoコマンドの構成に非常によく似た行を追加できます。
ALL ALL=(root) NOPASSWD: /tmp/test/cpvimrc.sh
これで、 sudo権限を持つすべてのユーザーは、パスワードを指定せずにスーパーユーザーとしてスクリプト/tmp/test/cpvimrc.shを実行できます。
次に、変更を保存してテストを行います。
kent$ sudo ./cpvimrc.sh
Copy root's .vimrc as root_vimrc.
File copied:
-rw------- 1 root root 19768 Oct 24 23:18 root_vimrc
guest$ sudo ./cpvimrc.sh
Copy root's .vimrc as root_vimrc.
File copied:
-rw------- 1 root root 19768 Oct 24 23:19 root_vimrc
上記の出力は、guestとkentの両方がパスワードの入力を求められることなくrootとしてスクリプトを実行できることを示しています。
4. 結論
デフォルトでは、 sudo コマンドを使用してプログラムを起動すると、現在のユーザーのパスワードを要求されます。 ただし、sudoを使用して非対話モードでいくつかのコマンドを実行したい場合があります。
この記事では、最初に、-Sオプションを指定してsudoコマンドにパラメーターとしてパスワードを渡す方法を示しました。 簡単に機能しますが、セキュリティ上の懸念が生じる可能性があります。
次に、 sudo コマンドの構成を編集して、ユーザーがパスワードを要求せずに特定のプログラムにアクセスできるようにすることで、これを実現する方法について説明しました。