Jalankan perintah yang memerlukan sudo setelah waktu berlalu

30

Biasanya saya lakukan

sleep 4h; command

untuk mengeksekusi perintah setelah 4 jam. Namun, jika perintah itu mengharuskan sudo, itu tidak akan berhasil.

Apakah mungkin untuk memberikan sudoizin pada saat saya menjalankan sleepperintah?

Guerlando OCs
sumber
Dalam hal tertentu saya pikir Anda bisa menggunakan shutdown. perintah dengan sudo dan argumen yang sesuai untuk menjadwalkan tidur pada waktu tertentu.
oarfish
Terkait:  Pra-otorisasi sudo? (Sehingga bisa dijalankan nanti)  dan  sudo dalam skrip non-interaktif .
G-Man Mengatakan 'Reinstate Monica'
Apa tugas yang perlu Anda lakukan, dan mengapa tepatnya 4 jam tidur?
Thorbjørn Ravn Andersen

Jawaban:

46

Gunakan sudountuk memulai shell root tempat Anda menjalankan perintah:

sudo bash -c 'sleep 4h; command'

Setiap perintah yang berjalan di shell root dijalankan dengan izin root, yang untuk sleeptidak ada salahnya. Jika Anda perlu menjalankan perintah dengan izin pengguna di dalamnya, gunakan sudo -u USERNAME COMMAND, misalnya:

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

Pendekatan lain akan digunakan sudo visudountuk memungkinkan eksekusi perintah tanpa akses root, lihat: Bagaimana mengizinkan eksekusi tanpa meminta kata sandi menggunakan sudo?
Perhatikan bahwa tergantung pada perintah ini dapat membuat cacat keamanan.

pencuci mulut
sumber
21

Dengan asumsi Anda hanya ingin menjalankan proses satu kali (tidak, misalnya setiap 4 jam) maka Anda dapat menggunakannya atd

  1. Pastikan atd sedang berjalan (di ubuntu itu /etc/init.d/atd statusatau masih lebih baik systemctl status atd)
  2. Di terminal sebagai root jalankan perintah Anda sebagai berikut:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
  3. Jika Anda ingin menjalankannya setiap 4 jam Anda juga bisa menggunakan cron (sebagai root) dengan konfigurasi berikut di crontab Anda

    0 */4 * * * sh -c $'/path/to/command'
Ama Aje My Fren
sumber
2
Ya, atadalah alat yang tepat untuk pekerjaan ini, karena itu juga menangani pengalihan I / O, tidak memblokir jendela shell, dan bekerja bahkan ketika pengguna telah logout atau mesin telah reboot sejak itu.
Simon Richter
4
@SimonRichter: sudo bash -c 'sleep 4h && command' &untuk menempatkan sudo di latar belakang adalah cara yang lebih mudah untuk tidak memblokir jendela / tab shell. Jika Anda ingin output muncul secara tidak sinkron sebagai pengingat bahwa itu terjadi, itu lebih mudah. Ini tidak berfungsi di seluruh reboot, tetapi tergantung pada nohuppengaturan Anda mungkin tetap berjalan setelah keluar / keluar dari shell.
Peter Cordes
4
Catatan yang atmenjalankan perintah segera setelah itu dapat ketika sistem ditangguhkan pada waktu yang ditentukan, lihat di sini di U&L - tergantung pada perintah untuk menjalankan ini mungkin bukan yang Anda inginkan.
hidangan penutup
2
Sekedar saran, Anda juga dapat menggunakan systemctl untuk memeriksa status layanan alih-alih secara langsung memanggil skrip init.d tersebut. Walaupun keduanya tampaknya memiliki hasil yang sama, saya pikir cara modern untuk berinteraksi dengan layanan systemd harus lebih disukai:systemctl status atd
Byte Commander
15

Salah satu caranya adalah berjalan melalui shellscript dengan sudoizin (dan berikan kata sandi, ketika Anda memulai shellscript), jika shellscript ada di direktori saat ini,

sudo ./delayer 4h

di mana delayerbisa menjadi shellscript dengan kontennya

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

Jadikan itu dapat dieksekusi dengan

chmod +x delayer

dan salin atau pindahkan ke direktori PATHjika Anda mau.


Jika Anda menginginkan shellscript yang lebih fleksibel, di mana Anda dapat memilih perintah [baris] untuk ditunda dengan memasukkan parameter, Anda dapat mencoba

#!/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
"$@"

Contoh demo (penundaan pendek, 5 detik, untuk tujuan demo),

$ ./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
sudodus
sumber
3
Nah, jika itu /bin/shsintaks akan baik-baik saja. Tetapi jika Anda berniat menggunakan fitur spesifik bash, maka shebang diperlukan. Saya dan steeldriver berdiskusi tentang hal itu di suatu tempat. Aaand Videonauth menghapus komentarnya sebelum saya bisa merespons dengan benar. Oh well
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy, Anda benar. Jadi dalam hal ini shebang ada untuk membuat shellscript kuat dalam hal fitur tambahan di mana sintaksis mungkin berbeda.
sudodus
@SergiyKolodyazhnyy Yah itu hanya saran jadi saya pikir meninggalkan komentar di sana tidak perlu dan hanya akan menambah kekacauan. Jangan ragu untuk
menghubungi
2

Cara lain adalah dengan memulai sesi interaktif sudo dengan sudo -s(tidak mengubah direktori) atau sudo -i(mengubah direktori saat ini untuk me-root direktori home) dan kemudian masukkan perintah Anda (tanpa sudo)

Ludwik
sumber