時間が経過した後にsudoを必要とするコマンドを実行する


30

私は通常やる

sleep 4h; command

4時間後にコマンドを実行します。ただし、そのコマンドにが必要な場合sudo、機能しません。

コマンドをsudo実行しているときに許可を与えることは可能sleepですか?



その特定のケースでは、私はあなたがちょうど使用できると思いますshutdown。特定の時間にスリープをスケジュールするためのsudoおよび適切な引数を指定したコマンド。
oarfish


あなたがする必要があるタスクは何ですか、そして正確な4時間の睡眠はなぜですか?
ソルビョーン・ラヴン・アンデルセン

回答:


46

sudoコマンドを実行するルートシェルを起動するために使用します。

sudo bash -c 'sleep 4h; command'

rootシェルで実行されるすべてのコマンドはroot権限で実行されますが、これsleepは害にはなりません。ユーザー権限を使用してコマンドを実行する必要がある場合はsudo -u USERNAME COMMAND、たとえば、を使用します。

$ sudo bash -c 'sleep 4h; sudo -u dessert whoami; whoami'
dessert  # whoami run as user dessert
root     # whoami run as root

別のアプローチはsudo visudo、rootアクセスなしでコマンドの実行を許可するために使用することです。sudoを使用してパスワードを要求せずに実行を許可する方法を参照してください
コマンドによっては、セキュリティ上の欠陥が生じる可能性があることに注意してください。


21

プロセスを一度だけ(たとえば4時間ごとに)実行したくない場合は、次を使用できます。 atd

  1. atdが実行されていることを確認します(ubuntuでそれ/etc/init.d/atd status以上systemctl status atd
  2. ターミナルでrootとして次のようにコマンドを実行します。

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
    
  3. 4時間ごとに実行したい場合は、cronタブで次の設定でcronを(ルートとして)使用することもできます

    0 */4 * * * sh -c $'/path/to/command'

2
はい、atこのジョブに適したツールです。I/ Oリダイレクトも処理し、シェルウィンドウをブロックせず、ユーザーがログアウトした後やマシンが再起動された場合でも機能するためです。
サイモンリヒター

4
@SimonRichter:sudo bash -c 'sleep 4h && command' &バックグラウンドでsudoを配置することは、シェルウィンドウ/タブをブロックしない簡単な方法です。出力が発生したことを思い出させるために、非同期でポップアップ表示したい場合は、簡単です。再起動後は動作しませんが、nohup設定によっては、シェルを終了/ログアウトした後も動作し続ける場合があります。
ピーターコーデス

4
at指定された時間にシステムが中断されたときにできる限りすぐにコマンドを実行することに注意してください。U&Lのこちらを参照してください。
デザート

2
提案として、init.dスクリプトを直接呼び出す代わりに、systemctlを使用してサービスの状態を確認することもできます。:両方が一見同じ結果を持っているが、私はsystemdにサービスとの相互作用の近代的な方法が好まれるべきだと思うsystemctl status atd
バイト司令

15

1つの方法はsudo、シェルスクリプトが現在のディレクトリにある場合、許可付きのシェルスクリプトを介して実行することです(シェルスクリプトの起動時にパスワードを指定します)。

sudo ./delayer 4h

ここdelayerで、コンテンツを含むシェルスクリプトにすることができます

#!/bin/bash
sleep "$1"
command

実行可能にする

chmod +x delayer

PATH必要に応じて、ディレクトリにコピーまたは移動します。


パラメーターを入力して遅延させるコマンド[行]を選択できる、より柔軟なシェルスクリプトが必要な場合は、試してみてください。

#!/bin/bash

if [ $# -lt 2 ] || [ "$(whoami)" != "root" ]
then
 echo "Delay start of command, that needs 'sudo'
Usage:    sudo $0 <delay> <command line>
Example:  sudo $0 4h parted -ls"
 exit
fi

sleep "$1"
shift
"$@"

デモの例(短い遅延、5秒、デモ用)、

$ ./delayer
Delay start of command, that needs 'sudo'
Usage:    sudo ./delayer <delay> <command line>
Example:  sudo ./delayer 4h parted -ls

$ sudo ./delayer 5s parted /dev/sdc p
[sudo] password for sudodus: 
Model: Kanguru SS3 (scsi)
Disk /dev/sdc: 15,9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 2      1049kB  2097kB  1049kB               primary  bios_grub
 3      2097kB  258MB   256MB   fat32        primary  boot, esp
 4      258MB   2274MB  2016MB               primary
 5      2274MB  12,5GB  10,2GB  ext2         primary
 1      12,5GB  15,9GB  3394MB  ntfs         primary  msftdata

3
まあ、それが/bin/sh構文であればそれは問題ないでしょう。ただし、bash固有の機能を使用する場合は、shebangが必要です。私とスチールドライバーはどこかでそれについて議論しました。Aaand Videonauthは、適切に対応する前にコメントを削除しました。まあ
セルギー・コロディアズニー

@SergiyKolodyazhnyy、あなたは正しい。そのため、この場合、構文が異なる可能性のある追加機能の場合にシェルスクリプトを堅牢にするためにシェバンがあります。
sudodus

@SergiyKolodyazhnyyまあそれは単なる提案だったので、コメントをそこに残すことは必要ではなく、混乱を招くだけだと思いました。気軽にチャットで
意見を聞い

2

別の方法は、sudo -s(ディレクトリを変更しない)またはsudo -i(現在のディレクトリをルートホームディレクトリに変更する)でsudoインタラクティブセッションを開始し、コマンドを入力することです(sudoなし)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.