web-dev-qa-db-ja.com

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

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

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

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

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

81
user251948

スクリプト内にSudoを含めることはめったにありません。代わりに、スクリプトからSudoを削除し、Sudoを使用してスクリプト自体を実行します。

Sudo myscript.sh

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

Sudo -u username command 

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

102
terdon

sudoersファイルを変更することもできます。

Sudo visudoを実行します。

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

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

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

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

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

Sudo ./myscript
19
Jibbers

この回答は、terdonの answer に似ています。メインスクリプトをSudoで実行することもお勧めしますので、ユーザーにパスワードを要求せずにコマンドを実行できます。

ただし、rootユーザーまたは特定のシステムユーザーとしてではなく、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 run with root would be invoked
# with: Sudo -u $real_user
# So they will be ran 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
9
Dan

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

スクリプトを開始するときにパラメータとして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

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

3
csworenx
#!/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
3
Sanyam Jain

スクリプトを実行するユーザーを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
0
evinhas