一連のコマンドを自動化するシェルスクリプトを作成したいと思います。問題は、一部のコマンドをスーパーユーザーとして実行する必要があり、一部のコマンドをスーパーユーザーとして実行してはならないことです。これまでに行ったことは、次のようなものです。
#!/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?"
ユーザーが最初に一度だけパスワードを入力し、その後立ち去ることができるようにするにはどうすればよいですか?
更新:
回答ありがとうございます。 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
ファイル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で書きましたが、OS Xとはいくつかの違いがあります
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.
スクリプト全体をスーパーユーザーとして実行する必要があります。一部のコマンドを非スーパーユーザーとして実行する場合は、Sudoの「-u」オプションを使用します。
#!/bin/bash
Sudo -u username command1
command2
Sudo -u username command3
command4
Rootとして実行する場合、Sudoはパスワードを要求しません。
これを使用する場合は、man Sudo
も確認してください。
#!/bin/bash
Sudo echo "Hi, I'm root"
Sudo -u nobody echo "I'm nobody"
Sudo -u 1000 touch /test_user
さて、いくつかのオプションがあります。
パスワードを要求しないようにSudoを構成できます。セキュリティ上のリスクがあるため、これは推奨されません。
パスワードを読み取り、必要に応じてパスワードをSudoに提供する期待スクリプトを作成できますが、それは不格好で壊れやすいものです。
Rootとして実行し、不要な場合は特権を削除するようにスクリプトを設計することをお勧めします。 rootを必要としないコマンドの場合は、単にSudo -u someotheruser command
にしてください。
(スクリプトを呼び出すユーザーとして明確に実行する必要がある場合は、スクリプトにuidを保存させ、引数としてidを指定してSudoを介して2番目のスクリプトを呼び出すようにすることができます。