58

一連のコマンドを自動化するシェルスクリプトを書きたい。問題は、一部のコマンドをスーパーユーザーとして実行する必要があり、一部のコマンドをスーパーユーザーとして実行してはならないことです。私がこれまでに行ったことは、次のようなものです。

#!/bin/bash

command1
sudo command2
command3
sudo command4

問題は、これは、誰かがcommand1が終了するまで待ってからパスワードの入力を求められることを意味します。その後、command3に十分な時間がかかる場合は、command3が終了するのを待つ必要があります。その人が起き上がって立ち去り、1時間後に戻って終わってくれたらいいのにと思います。たとえば、次のスクリプトにはこの問題があります。

#!/bin/bash

sleep 310
sudo echo "Hi, I'm root"
sleep 310
sudo echo "I'm still root?"

ユーザーが最初にパスワードを1回入力するだけで、すぐに離れることができるようにするにはどうすればよいですか?

アップデート:

回答ありがとうございます。Mac OS X Lionで実行していて、Stephen Pのスクリプトを実行すると、さまざまな結果が得られました:( $ HOMEも追加しました)

pair@abbey scratch$ ./test2.sh
uid is 501
user is pair
username is 
home directory is /Users/pair
pair@abbey scratch$ sudo ./test2.sh 
Password:
uid is 0
user is root
username is root
home directory is /Users/pair
4

4 に答える 4

52

ファイルsutest

#!/bin/bash
echo "uid is ${UID}"
echo "user is ${USER}"
echo "username is ${USERNAME}"

それを実行します:`./sutest'は私に与えます

uid is 500
user is stephenp
username is stephenp

しかし、sudoを使用するsudo ./sutestと:

uid is 0
user is root
username is stephenp

したがって、sudoとして実行する場合は、元のユーザー名を$USERNAMEに保持します。これは、他の人が投稿したものと同様の解決策につながります。

#!/bin/bash
sudo -u ${USERNAME} normal_command_1
root_command_1
root_command_2
sudo -u ${USERNAME} normal_command_2
# etc.

そもそもスクリプトを呼び出すためにsudoを実行するだけで、パスワードの入力を1回求められます。


私はもともとLinuxでこの答えを書きましたが、OSXとはいくつかの違いがあります

OS X(Mountain Lion 10.8.3でこれをテストしています)には、SUDO_USER sudoを実行しているときに環境変数があります。これは、上記の代わりに使用できますUSERNAME。または、よりクロスプラットフォームにするために、スクリプトでSUDO_USERかどうかを確認できます。が設定されている場合はそれを使用し、設定されている場合はUSERNAMEを使用します。

OS Xの元のスクリプトを変更すると、次のようになります...

#!/bin/bash
sudo -u ${SUDO_USER} normal_command_1
root_command_1
root_command_2
sudo -u ${SUDO_USER} normal_command_2
# etc.

クロスプラットフォームにするための最初の刺し傷は...

#!/bin/bash
#
# set "THE_USER" to SUDO_USER if that's set,
#  else set it to USERNAME if THAT is set,
#   else set it to the string "unknown"
# should probably then test to see if it's "unknown"
#
THE_USER=${SUDO_USER:-${USERNAME:-unknown}}

sudo -u ${THE_USER} normal_command_1
root_command_1
root_command_2
sudo -u ${THE_USER} normal_command_2
# etc.
于 2012-04-19T00:53:25.097 に答える
10

スクリプト全体をスーパーユーザーとして実行する必要があります。スーパーユーザー以外でコマンドを実行する場合は、sudoの「-u」オプションを使用します。

#!/bin/bash

sudo -u username command1
command2
sudo -u username command3
command4

rootとして実行している場合、sudoはパスワードを要求しません。

于 2012-04-19T00:35:49.460 に答える
3

これを使用する場合は、man sudo以下も確認してください。

#!/bin/bash

sudo echo "Hi, I'm root"

sudo -u nobody echo "I'm nobody"

sudo -u 1000 touch /test_user
于 2012-04-19T00:37:51.287 に答える
3

さて、あなたにはいくつかの選択肢があります。

パスワードの入力を求めないようにsudoを設定できます。セキュリティ上のリスクがあるため、これはお勧めしません。

パスワードを読み取り、必要に応じてsudoに提供するexpectスクリプトを作成することもできますが、それは不格好で壊れやすいものです。

rootとして実行し、必要のないときはいつでもその特権を削除するようにスクリプトを設計することをお勧めします。sudo -u someotheruser commandルートを必要としないコマンドのためにそれを持っているだけです。

(スクリプトを呼び出すユーザーとして特別に実行する必要がある場合は、スクリプトにuidを保存させ、引数としてidを指定してsudoを介して2番目のスクリプトを呼び出すことができるため、誰に訴えるかがわかります。)

于 2012-04-19T00:40:09.830 に答える