bashスクリプトの一部を別のユーザーとして実行する


回答:


42

スクリプトでsudoコマンドを使用します。

フォーム内:

sudo -u username command

sudoコマンドの実行にはコマンドのユーザーとしてユーザー名

スクリプトがルートとして実行されている場合、パスワードの入力を求められるとは思わない。それ以外の場合、この記事では1つのコマンドラインでパスワード付きのsudoを使用する方法について説明しますか?、この記事ではパスワードなしでsudoを使用する方法について説明していますか?


5
これは便利で簡単ですが、一度に1つではなく、コマンドのグループに対してこれを行う方法はありますか?
アンドリュー

bashスクリプトを作成し、実行可能にしてchmod +x script.shから、ちょうどsudo -u username script.sh
NiCU 14年

@アンドリュー私はこれを自分で疑問に思っていましたが、次のことが私のために働いていました:sudo -u ic sh -c 'cmd1 && cmd2'
Karussell

iユーザーの環境を取得したい場合はオプションも含めてください
-neoDev

6

この答えは良いですが、serverfaultアドバイスは少し危険です-だれでもルートとして何でも実行できるようになります!コメントをフォーマットできないため、ここに投稿しています。

visudoを使用して、必要な権限をできるだけ正確に付与することをお勧めします。次のvisudoような行を入力して追加します。

username hostname = NOPASSWD: /full/path/to/command1, full/path/to/command2

この同じことを多くのホストで実行する必要がある場合は、次の方法で開くことができます。

username ALL = NOPASSWD: /full/path/to/command1, full/path/to/command2

しかし、私はどちらも使用しません**:

username ALL=(ALL) NOPASSWD: ALL

またはユーザー名hostname = ALL

sudoerのmanページには、血みどろの詳細の多くを持っています


特定のユーザーのみが使用できるコマンドで機能しますか?
マニッシュマタイ

特定のユーザーのみがコマンドを実行できるように指定できます(上記の例ではusername、コマンドを実行できるユーザー名に置き換えます)。実行する実行可能ファイルが特定の1人のユーザーのみが実行できる場合も、それで問題ありませんsudo -u username commandline。そのユーザー名をスクリプトの行に渡すだけです。
ジェームズポーリー

@マニッシュ。はい。sudoersファイルの内容は、「このホスト上のこのユーザー名がパスワードを入力せずにcommand1を実行できるようにすることです。
DaveParillo

6

#I = like:

#test if running bash as a different user works
sudo -u nobody bash -c : && RUNAS="sudo -u nobody"

echo 1: $USER

#Runs bash with commands between '_' as nobody if possible
$RUNAS bash<<_
echo 2: \$USER
_

echo 3: $USER

#./run

1: root
2: nobody
3: root

10
説明文を追加していただけますか?
カザーク

4

sonarqubeの場合:

sudo -u sonar /usr/bin/sonar start

ここでsonar、コマンドの実行に使用されるユーザーの名前/usr/bin/sonar start


2

確かではありませんが、そのスクリプトの最後だけを別のユーザーとして実行したい場合su someuserは、スクリプトの最後の前に追加できます。

何か不足していますか?

お役に立てば幸いです

よろしく


1
これは最も適切な答えだと思います。他のすべての答えはsudoを示唆しており、いくつかの最小限のLinuxインストールではデフォルトでインストールされないことがよくあります。
ティム

1

この方法では、スクリプトの終わりは別のユーザー(ルート)によって実行されます。$[LINENO+2]exit $?呼び出しに注意してください。これらは、スクリプトの終了を1回だけ実行し、sudo呼び出しの終了コードを保持するために必要です。

#!/bin/bash                                                                                                                                                                                                                                  
echo $USER                                                                                                                                                                                                                                      

# pipe the rest of this script via a sudo call                                                                                                                                                                                                                                         
tail -n +$[LINENO+2] $0 | exec sudo bash                                                                                                                                                                                                     
exit $?                                                                                                                                                                                                                                     
echo $USER
exit 1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.