Linuxスクリプトで別のユーザーとしてコマンドを実行する方法

公開: 2022-07-13
青い背景の上のラップトップ上のLinux端末。
fatmawati achmad zaenuri / Shutterstock.com

当然のことながら、コマンドまたはスクリプトを実行すると、システムはそれをユーザーが起動したプロセスとして実行します。 ただし、別のユーザーとしてコマンドとスクリプトを実行できます。

プロセスには所有者がいます

プログラムまたはスクリプトが実行されると、Linuxはプロセスを作成します。 そのプロセスには所有者がいます。 所有者は、別のプロセスであるか、ユーザーが起動した場合はユーザーアカウントの名前です。

プロセスの所有権は、プロセスの機能と環境の一部を定義します。 プロセスの起動方法に応じて、親プロセスまたはユーザーの特定の属性を継承します。 または、より厳密には、通常はシェルであるプログラムを起動するためにユーザーが使用したプロセス。

Linuxターミナルからプロセスを管理する方法:知っておくべき10のコマンド
Linuxターミナルからプロセスを管理する関連方法:知っておくべき10のコマンド

プロセスによって作成されたファイルの所有権は適切なユーザーに属するため、コマンドまたはスクリプトを別のユーザーとして実行すると便利です。

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のみがスクリプトを実行できるようにスクリプトの実行権限を設定する

左から右に、権限は次のようになります。

  • 所有者は、ファイルの読み取り、書き込み、および実行を行うことができます。
  • グループメンバーはファイルの読み取りと書き込みを行うことができます。
  • 他の人はファイルを読むことしかできません。

したがって、スクリプトを実行できるユーザーは、Maryとrootだけです。 これは、メアリーがスクリプトを実行したときに起こることです。

 ./other-user.sh 

メアリーがスクリプトを実行したときの出力

スクリプトの現在の作業ディレクトリはMaryのホームディレクトリであり、スクリプトの所有者はユーザーアカウントmaryqであると言われています。

予想どおり、Daveはスクリプトを実行できません。

 /home/maryq/other-user.sh 

ユーザーDaveはスクリプトを実行できず、権限が拒否されました

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

 sudo /home/maryq/other-user.sh 

スクリプトがrootによって実行されたときの出力

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

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

sudo -u maryq /home/maryq/other-user.sh

rootで-uuserオプションを使用して、ユーザーMaryとしてスクリプトを実行します

今回、スクリプトはプロセス所有者が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 

ユーザーDaveはMaryのファイルを読み取ることができず、許可が拒否されました

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

 sudo runuser --maryq -c'cat mary.txt' 

runuserコマンドを使用してMaryのファイルを読み取る

コマンドはファイルへのフルパスを必要としないことに注意してください。 メアリーがホームディレクトリに対して行うのと同じ方法でファイルを参照できます。

ユーザーDaveとして、次のテキストを含む「run-maryq.sh」というスクリプトを作成します。

 #!/ bin / bash

runuser -l maryq -c'cat mary.txt'

実行可能にします。

 chmod + x run-maryq.sh 

chmodを使用してスクリプトを実行可能にする

実行しようとするとどうなるか見てみましょう。

 ./run-maryq.sh 

通常のユーザーとして、runuserを内部に使用してスクリプトを実行する

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

 sudo ./run-maryq.sh 

ルートとしてrunuserを内部に使用してスクリプトを実行する

それは私たちが望むように機能し、まるでメアリーが自分でスクリプトを起動したかのように機能します。

どちらを使用しますか?

コマンドラインでは、それらの間で選択することは多くありません。 ただし、とにかくrunusersudoを使用する必要があるため、 sudoを単独で使用することもできます。

ただし、スクリプトでは、 runuserが優先コマンドです。

関連:初心者向けの10の基本的なLinuxコマンド