Bir süre geçtikten sonra sudo gerektiren bir komutu çalıştırın.


30

genellikle yaparım

sleep 4h; command

4 saat sonra bir komutu çalıştırmak için. Ancak, bu komut gerektiriyorsa sudo, çalışmaz.

Komutu sudoçalıştırdığım anda izin vermek mümkün mü sleep?



Bu özel durumda, sadece kullanabileceğini düşünüyorum shutdown. belirli bir zamanda uykuyu programlamak için sudo komutunu ve uygun argümanları kullanın.
oarfish


Yapmanız gereken görev nedir ve neden tam 4 saatlik uyku?
Thorbjørn Ravn Andersen

Yanıtlar:


46

Kullanım sudoKomutları çalıştırmak bir kök kabuğu başlatmak için:

sudo bash -c 'sleep 4h; command'

Kök kabuğunda çalışan her komut, sleepzarar vermeyen kök izinleriyle çalışır . İçinde kullanıcı izinleri olan bir komutu çalıştırmanız gerekirse sudo -u USERNAME COMMAND, örneğin:

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

Başka bir yaklaşım sudo visudo, komutun root erişimi olmadan çalıştırılmasına izin vermek için kullanmak olacaktır , bakınız: sudo kullanarak parola sormadan çalıştırmaya nasıl izin verilir?
Komuta bağlı olarak bunun bir güvenlik açığı oluşturabileceğini unutmayın.


21

Süreci sadece bir kez çalıştırmak istediğinizi varsayalım (örneğin, her 4 saatte bir) atd

  1. Atd'nin çalıştığından emin olun (ubuntu'da /etc/init.d/atd statusveya hala daha iyi systemctl status atd)
  2. Root olarak bir terminalde emrinizi aşağıdaki gibi çalıştırın:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
  3. Her 4 saatte bir çalıştırmak istiyorsanız, cron'unuzda aşağıdaki yapılandırma ile cron (root olarak) da kullanabilirsiniz.

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

2
Evet, atbu iş için doğru araçtır, çünkü G / Ç yönlendirmesine de dikkat eder, bir kabuk penceresini engellemez ve kullanıcı oturumu kapattığında veya makine o zamandan beri yeniden başlatıldığında bile çalışır.
Simon Richter

4
@SimonRichter: sudo bash -c 'sleep 4h && command' &arka plana sudo koymak, bir kabuk penceresi / sekmesini engellememek için daha kolay bir yoldur. Eğer varsa istediğiniz çıktı bu gerçekleşti hatırlatmak için zaman uyumsuz açılır, o kolay. Yeniden başlatmalar arasında çalışmaz, ancak nohupayarlarınıza bağlı olarak bir kabuktan çıktıktan / oturumu kapattıktan sonra çalışmaya devam edebilir.
Peter Cordes

4
atKomutu, sistemin belirtilen zamanda askıya alındığı anda mümkün kılan en kısa sürede çalıştığını unutmayın, burada U&L’ye bakın - bu komutları çalıştırmak istediğinize göre olmayabilir.
tatlı

2
Sadece bir öneri, servis durumunu kontrol etmek için doğrudan init.d betiğini çağırmak yerine systemctl komutunu da kullanabilirsiniz. Her ikisi de aynı şekilde görünmekle birlikte, sistemd hizmetleriyle etkileşimin modern yolunun tercih edilmesi gerektiğini düşünüyorum:systemctl status atd
Byte Commander

15

Bir yol sudo, eğer kabuk komut dosyası geçerli dizindeyse, izinleri olan bir kabuk komut dosyası aracılığıyla çalıştırmak (ve kabuk komut dosyasını başlattığınızda şifreyi vermektir),

sudo ./delayer 4h

burada delayeriçerikli bir shellscript olabilir

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

Çalıştırılabilir yap

chmod +x delayer

ve PATHisterseniz bir dizine kopyalayın veya taşıyın .


Daha esnek bir shellscript istiyorsanız, parametre (ler) i girerek geciktirmek için [line] komutunu seçebileceğiniz, deneyebilirsiniz.

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

Demo örneği (kısa gecikme, 5 saniye, demo amaçlı),

$ ./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
Eğer /bin/shsentaks ise, iyi olacak. Ancak, bash'a özgü özellikleri kullanmayı düşünüyorsanız, o zaman shebang gereklidir. Ben ve Steeldriver bunun hakkında bir yerde tartışma yaptık. Aaand Videonauth, doğru şekilde yanıt veremeden önce yorumunu sildi. Oh iyi
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy, Haklısın. Bu yüzden, bu durumda shebang, sözdiziminin farklılık gösterebileceği ilave özellikler durumunda shellscript'i sağlamlaştırmak için oradadır.
sudodus

@SergiyKolodyazhnyy Peki, sadece bir öneriydi, bu yüzden yorum bırakmadan gerekli olmadığını düşündüm ve sadece karışıklığa ekleyecektim. Bana sohbette vurmaktan çekinmeyin ve görüşünüzü işaret edin :)
Videonauth

2

Başka bir yol, sudo etkileşimli oturumunu sudo -s(dizini değiştirmez) veya sudo -i(geçerli dizini kök ana dizine değiştirir) başlatmak ve ardından komutlarınızı (sudo olmadan) girmektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.