毎日のバックアップを実行するbashスクリプトを書いています。このスクリプトは、最終的に毎朝自動的に実行されます(cronまたはsystemd)。
私が達成したいのは
私が作成したbashスクリプトは次のようになります。
# Stop myservice
systemctl stop myservice.service
# Do all the backing up here...
# Start myservice
systemctl start myservice.service
私が抱えている問題は、このスクリプトを実行すると、systemctlのstop/start呼び出し中にパスワードが必要になることです。これを自動的に実行する場合、明らかに毎回パスワードを要求することはできません。このパスワードを要求せずにこのスクリプトを自動的に実行するにはどうすればよいですか?
Ubuntu 18.04
ありがとう!
ニーズと好みに応じて、複数の可能性があります。
…スクリプトをroot
のroot
に追加することにより(Sudo crontab -e
を使用して)ユーザーcrontab
としてスクリプト全体を実行します。 systemctl stop/start myservice.service
の実行時にパスワードは必要ありません。欠点は、別のユーザー(たとえばnoslenkwah
)としてバックアップタスクを実行し、バックアップのためにその別のユーザーに切り替える必要がある場合があることです。例:
# Stop myservice
systemctl stop myservice.service
# Do all the backing up here...
# ... and run the backup_command as user "otheruser":
Sudo -u noslenkwah /path/to/backup_command --with --some --options
# Start myservice
systemctl start myservice.service
…systemctl
コマンドを/etc/sudoers.d
ディレクトリ内のファイルに追加して、特定のユーザーがパスワードを入力せずにコマンドを実行できるようにします。
issue Sudo visudo -f /etc/sudoers.d/noslenkwah
(ファイル名、noslenkwah
は関係ありません。ファイルの設定によって影響を受ける「メイン」ユーザーにちなんでファイルに名前を付けるのは私の個人的な習慣です。ディレクトリ/etc/sudoers.d
。)
次の行を追加して、ファイルを保存します。
Cmnd_Alias MYSERVICE = \
/bin/systemctl stop myservice.service, \
/bin/systemctl start myservice.service
noslenkwah ALL = (root) NOPASSWD: MYSERVICE
これにより、ユーザーnoslenkwah
はパスワードなしでSudo systemctl stop myservice.service
およびSudo systemctl start myservice.service
を実行できます。 MYSERVICE
という名前のいわゆるcommand alias(コマンドのコレクション)を定義し、
noslenkwah
ALL
コンピューターroot
としてMYSERVICE
で定義されたコマンドを実行するnoslenkwah
とmyservice
を実際のユーザー名とサービス名に置き換えます。これが機能するためには、本当にSudo systemctl start myservice.service
を発行する必要があることに注意してください(Sudo systemctl start myservice
ではなく(たとえば、.service
なし)。
"on ALL
computers"の部分は気にしないでください。これは、まったく同じsudoers
ファイルを複数のコンピューターに配布する場合にのみ関係します。
次に、バックアップスクリプトを次のように変更します。
# Stop myservice
Sudo systemctl stop myservice.service
# Do all the backing up here...
/path/to/backup_command --with --some --options
# Start myservice
Sudo systemctl start myservice.service
ユーザーnoslenkwah
として実行します。
このシェルスクリプトをルートとして実行します。
たとえば、ルートcrontabに配置します:Sudo crontab -e