スクリプト内で「sudo」コマンドを実行するにはどうすればよいですか?


84

手動でパッチを適用するには、このコマンドを入力する必要があります

sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  

09の直前にスペースがあります。

sudo ./playback_delete_data_patch.sh [space] 09_delete_old_data_p.sql

スクリプト内でこれを実行するにはどうすればよいですか?

他にもいくつかのコマンドがありますが、これは問題を引き起こしています。


2
それをスクリプトに入れるだけで、問題は何ですか?
ライライアン14

6
@LieRyan- sudo パスワード -誰かがそこに入力しないと、スクリプトは完全に実行できません。
ウィルフ14

私のシステムは、プロンプトなしでそれらを正常に実行します。2017年10月のUbuntu 16.04 sudoers。セットアップが台無しになりました。大きな問題ではない。修正が必要です。
–SDsolar

1
@SDsolar お使いのシステムは台無しになっています。パスワードの入力を求めないことは軽度のセキュリティ脆弱性です(ユーザーをある種のソーシャルエンジニアリング攻撃に対してより脆弱にします)。
wizzwizz4

回答:


107

sudo内部スクリプトを持つことはめったにありません。代わりに、sudoスクリプトからを削除し、スクリプト自体を実行しますsudo

sudo myscript.sh

そうすれば、スクリプト内のすべてのコマンドはルート権限で実行され、スクリプトを起動するときにパスワードを一度与えるだけで済みます。スクリプト内で特定のコマンドをsudo特権なしで実行する必要がある場合は、通常のユーザーとして実行できます(Lie Ryanに感謝します)。

sudo -u username command 

スペースは無関係であり、何にも影響を与えるべきではありません。コマンドとその引数の間には常にスペースがあります。


30
あなたはsudoの-uユーザー名を使用することにより、これらのコマンドのために一時的にroot権限をドロップすることができ、root権限を必要としないスクリプトのコマンドがあるかもしれません
ライアンうそ

48
私が書いた多くのスクリプトは、ユーザーとのやり取りやエラーチェックのすべてを行います。次に、最後に1つのコマンド(rsyncなど)をrootとして実行する必要があります。1つまたはいくつかのコマンドのみがアクセスを必要とする場合、特にデバッグ中に、重大なエラーまたはルートアクセスの脆弱性を含む可能性のある多くのコード行に対して全体を昇格させて実行したいのはなぜですか?
ジョー

2
@Joe公平です。「決して良い考えではない」を「まれに」に変更しました。
テルドン

10
@Joeはここで本当に良い点を持っています。1が言うときもそれをしないその文脈が、私はそれを行うべきではないこと、または少なくとも、であり、そして、なぜ、なぜ、正確に知っていいだろう
arainone

10
@terdonあなたは聞いていません。スクリプトをrootとして実行すると、sudoのプロンプトが表示されないことを知っています。スクリプトをルートとして実行せず、代わりにスクリプトに明示的なsudo呼び出しを行うことと比較してます。ルートを必要とする少数の狭いアクションしかない場合、スクリプト全体をルートに上げることはひどい考えかもしれません。その文脈で、私はあなたのコメントに具体的に応答していました。「これは、尋ねるたびにパスワードを入力する必要があるため、スクリプトを自動的に実行できないことを意味するためです」
BeeOnRope

41

おそらくsudoersファイルを変更できます。

を実行しますsudo visudo

ユーザー名のエントリと、パスワードを求められずに実行するスクリプトを追加します。

username ALL=(ALL) NOPASSWD: /path/to/script

2
私には役に立たなかったが、これが存在することを知ってくれてありがとう。おそらく構文が間違っていたのでしょう。
クリスK

5
誰もそれを言及したかどうかはわかりませんが、sudoersファイルを編集した後、そのユーザーのすべてのログインセッションを終了する必要があります。
escape-llc

1
ここで明確にするために、sudoersファイルで指定する必要がある「sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql」行を含むスクリプトではなく、playback_delete_data_patch.shスクリプトまたはそのユーザーおよび/またはそのユーザーに必要なその他のコマンドパスワードを指定せずにsudoを実行できるようにするスクリプト。
-MttJocy

19

次のようなものを試すことができます:

echo "PASSWORD" | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

プレーンテキストでsudoerパスワードを書いているので、これは最も安全なことではありません。これをもう少し安全にするために、変数を作成し、sudoパスワードを変数に読み込んでから、次のようにコマンドを実行できます。

echo $PASSWORD | sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

また、rootとして実行されるすべてのコマンドを気にしない場合sudoは、以前に提案したように、を使用してスクリプトを簡単に実行できます。

sudo ./myscript

パスワードを変数に安全にread -s PASSWORD
読み込む

10

この答えは、terdonの答えに似ています。またsudo、実行中にユーザーのパスワードを要求することなくスクリプトを実行できるように、メインスクリプトを実行することをお勧めします。

ただし、一部のコマンドにルート権限をドロップし、でコマンドを呼び出した実際のユーザーとして実行するsudo場合は、$SUDO_USER変数を確認して元のユーザーを特定できます。

これは、それを実現する方法のスクリプト例です。

#!/bin/bash

# ref: https://askubuntu.com/a/30157/8698
if ! [ $(id -u) = 0 ]; then
   echo "The script need to be run as root." >&2
   exit 1
fi

if [ $SUDO_USER ]; then
    real_user=$SUDO_USER
else
    real_user=$(whoami)
fi

# Commands that you don't want running as root would be invoked
# with: sudo -u $real_user
# So they will be run as the user who invoked the sudo command
# Keep in mind if the user is using a root shell (they're logged in as root),
# then $real_user is actually root
# sudo -u $real_user non-root-command

# Commands that need to be ran with root would be invoked without sudo
# root-command

4

実際には、これを行うはるかに簡単な方法があります。移植性のために、これは私の実装ですが、ニーズに合わせて自由に操作できます。

スクリプトの起動時にパラメータとしてsudoパスワードを入力し、キャプチャし、sudoパスワードの入力を求める各コマンドでエコーします。

#!/bin/bash

PW=$1
echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  
./command_wo_sudo.sh <param>
echo $PW | ./other_command_requires_sudo.sh <param>

次のように、スクリプトを開始した後にプロンプ​​トを追加してキャプチャできます。

echo "enter the sudo password, please"
read PW

しかし、他の誰かがノードで実行されているものを監視する場合、作成されたログにアクセスできます。または、テストを実行するときにランダムに自分の肩越しを見ているだけで、セキュリティが損なわれる可能性があります。

これは、続行するにはyesが必要なコマンド/スクリプトの実行でも機能します。

echo $PW | yes | ./install.sh

エコーはプロンプトへの応答であるため、進行のプロンプトがある他のスクリプトを順番に実行している場合は、必要なものを何でも使用できます。ただし、その順序を知っているか、悪いことが起こる可能性があることを確認してください。


それははるかにエレガントでシンプルです、私はずっとスクロールダウンしてうれしいです!編集:待って、これは私の端末の履歴にパスワードを追加します
ジョブ

1
ユーザー名/パスワードを要求する方法readryanstutorials.net/bash-scripting-tutorial/bash-input.phpこの問題を回避する必要があります
ジョブ

3
#!/bin/bash
# this declares that current user is a sudoer
sudo tee /etc/sudoers.d/$USER <<END
END

# write the content of your script here
sudo npm install hexo-cli -g
mkdir Untitled
sudo apt-get install python

# then to remove the sudo access from the current user
sudo /bin/rm /etc/sudoers.d/$USER
sudo -k

0

スクリプトを実行するユーザーをsudoersファイルに追加してみてください。

#give permissions to the file
sudo chmod 700 /etc/sudoers.d/useradm

sudo visudo /etc/sudoers.d/useradm

#add the following text, changing "user" but your desired user
user ALL=(ALL)NOPASSWD:ALL

#return the right permissions to the file
sudo chmod 440 /etc/sudoers.d/useradm

一般的に、これは貧弱な方法です。あなたは、特に自動化を実行するアカウントの、NOPASSWDはsudoルールを追加しようとしている場合は、最低でも(ALLとしない)に実行される正確なコマンドにそれらを制限する必要がある
クリストファー・ハンター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.