Linuxスクリプトで別のユーザーとしてコマンドを実行する方法
公開: 2022-07-13
当然のことながら、コマンドまたはスクリプトを実行すると、システムはそれをユーザーが起動したプロセスとして実行します。 ただし、別のユーザーとしてコマンドとスクリプトを実行できます。
プロセスには所有者がいます
プログラムまたはスクリプトが実行されると、Linuxはプロセスを作成します。 そのプロセスには所有者がいます。 所有者は、別のプロセスであるか、ユーザーが起動した場合はユーザーアカウントの名前です。
プロセスの所有権は、プロセスの機能と環境の一部を定義します。 プロセスの起動方法に応じて、親プロセスまたはユーザーの特定の属性を継承します。 または、より厳密には、通常はシェルであるプログラムを起動するためにユーザーが使用したプロセス。
プロセスによって作成されたファイルの所有権は適切なユーザーに属するため、コマンドまたはスクリプトを別のユーザーとして実行すると便利です。
sudoを使用するたびに、別のユーザーとしてコマンドを実行しています。 sudoが使用するデフォルトのユーザーアカウントは、rootまたは「スーパー」ユーザーです。 そのため、 sudoはスーパーユーザーdoの略であると誤解されることがよくあります。 しかし、それはただの専門用語です。 それは実際には代理ユーザーdoの略です。
sudoを使用すると、rootとしてだけでなく、他のユーザーと同じようにコマンドを実行できます。 皮肉なことに、これを行うにはroot権限が必要です。 ただし、別のユーザーが所有するプログラムまたはスクリプトを起動することは、そのプロセスを他のユーザーとして実行することと同じではありません。 引き続きrootとして実行します。
ここでは、実際に別のユーザーとしてプロセスを実行する方法と、別のユーザーによって実行されたかのようにスクリプト内からコマンドを実行する方法を示します。
別のユーザーとしてスクリプトを実行する
複数のユーザーが構成されているコンピューターを使用しています。 1つはユーザー名maryqのMaryで、もう1つはユーザー名daveのDaveです。
メアリーのホームディレクトリには、「other-user.sh」というスクリプトがあります。 これはスクリプトのテキストです。
#!/ bin / bash echo "スクリプト名:" $ 0 echo "作業ディレクトリ:" $(pwd) echo "ユーザーとして実行されているスクリプト:" $(whoami)
$0環境変数に保持されているスクリプト名を出力します。 次に、 pwdを使用して作業ディレクトリを印刷します。 最後に、 whoamiコマンドを使用して、スクリプトを起動したユーザーの名前を出力します。 または、誰がスクリプトを起動したと思いますか。
スクリプトからエディタにテキストをコピーし、別のユーザーアカウントのホームディレクトリに「other-user.sh」として保存します。
スクリプトを実行可能にする必要があります。 chmodコマンドを使用し、 +x (実行)オプションと-u (ユーザー)オプションを使用して、所有者のみの実行フラグを設定します。 つまり、メアリーだけがスクリプトを実行できます。 lsを使用してファイルのアクセス許可を確認します。
chmod u + x other-user.sh
ls

左から右に、権限は次のようになります。
- 所有者は、ファイルの読み取り、書き込み、および実行を行うことができます。
- グループメンバーはファイルの読み取りと書き込みを行うことができます。
- 他の人はファイルを読むことしかできません。
したがって、スクリプトを実行できるユーザーは、Maryとrootだけです。 これは、メアリーがスクリプトを実行したときに起こることです。
./other-user.sh

スクリプトの現在の作業ディレクトリはMaryのホームディレクトリであり、スクリプトの所有者はユーザーアカウントmaryqであると言われています。
予想どおり、Daveはスクリプトを実行できません。
/home/maryq/other-user.sh

Daveがrootユーザー権限を持っている場合、 sudoを使用してrootとしてスクリプトを実行しようとすることができます。
sudo /home/maryq/other-user.sh

これは部分的な成功です。 スクリプトは実行されますが、スクリプトの所有者はmaryqではなくrootです。

採用する必要のあるトリックは、 sudo -u (ユーザー)オプションです。 これにより、コマンドを実行するユーザーを指定できます。 -uオプションを使用しない場合、 sudoはデフォルトでrootを使用します。 コマンドをMaryとして実行する場合は、ユーザーアカウントの名前をsudoコマンドに渡す必要があります。
sudo -u maryq /home/maryq/other-user.sh

今回、スクリプトはプロセス所有者がmaryqであることを報告します。
「other-user.sh」スクリプトに行を追加してみましょう。 テキストをechoして、出力を「mary.txt」というファイルにリダイレクトします。
#!/ bin / bash echo "スクリプト名:" $ 0 echo "作業ディレクトリ:" $(pwd) echo "ユーザーとして実行されているスクリプト:" $(whoami) echo"これは/home/maryq/のファイルに入ります">/home/maryq/mary.txt
Maryのホームディレクトリに新しいファイルを作成しています。 スクリプトをMaryとして実行しているため、これはまったく問題ありません。
./other-user.sh

Maryのホームディレクトリをチェックインすると、ファイルが作成されており、ファイルの所有権はmaryqユーザーアカウントに属していることがわかります。
ls -hl mary.txt

これは、メアリーが実際にスクリプトを自分で起動した場合に見られる動作と同じです。
関連: Linuxでchmodコマンドを使用する方法
runuserコマンド
これまでスクリプト内で使用してきたsudo -u -uコマンドを使用できますが、スクリプト内とは異なるユーザーとしてプロセスを実行するように設計された別のコマンドrunuserがあります。 起動されたプロセスからの戻りコードの処理が向上し、 sudoよりもオーバーヘッドが少なくなります。
runuserコマンドはrootで実行する必要がありますが、これはスクリプト全体をrootとして実行することで実現されます。 スクリプト内でsudoを使用する必要はありません。 runuserコマンドはコマンドラインでも使用できるため、スクリプトの使用に制限されませんが、スクリプトに推奨される方法です。
Daveは、Maryのホームディレクトリにあり、アクセス権がないため、「mary.txt」ファイルを一覧表示できません。
猫/home/maryq/mary.txt

ただし、 runuserを使用してファイル内を覗くことができます。 - (login)オプションは、Maryが実際にログインした場合のシェル環境に非常に近い環境で新しいシェルを起動します。 -c (command)オプションの後に、実行するコマンドが続きます。
sudo runuser --maryq -c'cat mary.txt'

コマンドはファイルへのフルパスを必要としないことに注意してください。 メアリーがホームディレクトリに対して行うのと同じ方法でファイルを参照できます。
ユーザーDaveとして、次のテキストを含む「run-maryq.sh」というスクリプトを作成します。
#!/ bin / bash runuser -l maryq -c'cat mary.txt'
実行可能にします。
chmod + x run-maryq.sh

実行しようとするとどうなるか見てみましょう。
./run-maryq.sh

runuserコマンドは、通常のユーザーによって実行されているため、文句を言います。 sudoでもう一度実行してみましょう。
sudo ./run-maryq.sh

それは私たちが望むように機能し、まるでメアリーが自分でスクリプトを起動したかのように機能します。
どちらを使用しますか?
コマンドラインでは、それらの間で選択することは多くありません。 ただし、とにかくrunuserでsudoを使用する必要があるため、 sudoを単独で使用することもできます。
ただし、スクリプトでは、 runuserが優先コマンドです。
関連:初心者向けの10の基本的なLinuxコマンド

