手動でパッチを適用するには、このコマンドを入力する必要があります
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
スクリプト内でこれを実行するにはどうすればよいですか?
他にもいくつかのコマンドがありますが、これは問題を引き起こしています。
スクリプト内にSudo
を含めることはめったにありません。代わりに、スクリプトからSudo
を削除し、Sudo
を使用してスクリプト自体を実行します。
Sudo myscript.sh
そうすれば、スクリプト内のすべてのコマンドがルート権限で実行され、スクリプトを起動するときにパスワードを一度与えるだけで済みます。スクリプト内で特定のコマンドをSudo
特権なしで実行する必要がある場合、通常のユーザーとして(thanks Lie Ryan )で実行できます。
Sudo -u username command
スペースは無関係であり、何にも影響を与えるべきではありません。コマンドと引数の間にはalwaysスペースがあります。
sudoers
ファイルを変更することもできます。
Sudo visudo
を実行します。
ユーザー名のエントリと、パスワードを求められずに実行するスクリプトを追加します。
username ALL=(ALL) NOPASSWD: /path/to/script
次のようなものを試すことができます:
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
この回答は、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
実際には、これを行うはるかに簡単な方法があります。移植性のために、これは私の実装ですが、ニーズに合わせて自由に操作できます。
スクリプトを開始するときにパラメータとして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
エコーはプロンプトへの応答であるため、進行状況のプロンプトがある他のスクリプトを順番に実行している場合、必要なものは何でも使用できます。ただし、その順序を知っているか、悪いことが起こる可能性があることを確認してください。
#!/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
スクリプトを実行するユーザーを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