เรียกใช้คำสั่งที่ต้องใช้ sudo หลังจากเวลาผ่านไป


30

ฉันมักจะทำ

sleep 4h; command

เพื่อรันคำสั่งหลังจาก 4 ชม. อย่างไรก็ตามหากคำสั่งนั้นต้องการsudoมันจะไม่ทำงาน

เป็นไปได้หรือไม่ที่จะsudoอนุญาตในขณะที่ฉันใช้sleepคำสั่ง?


สิ่งนี้เช่นunix.stackexchange.com/questions/391796/…
MatsK

shutdownในกรณีที่ว่าโดยเฉพาะอย่างยิ่งผมคิดว่าคุณก็สามารถใช้ คำสั่งด้วย sudo และอาร์กิวเมนต์ที่เหมาะสมเพื่อกำหนดเวลาสลีปในเวลาที่กำหนด
oarfish


งานที่คุณต้องทำคืออะไรและทำไมการนอนหลับ 4 ชั่วโมงแน่นอน
Thorbjørn Ravn Andersen

คำตอบ:


46

ใช้sudoเพื่อเริ่มรูทเชลล์ที่คุณรันคำสั่ง:

sudo bash -c 'sleep 4h; command'

ทุกคำสั่งที่รันในเชลล์รูทจะทำงานโดยใช้สิทธิ์รูทซึ่ง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เพื่ออนุญาตการเรียกใช้คำสั่งโดยไม่มีการเข้าถึงรูทโปรดดู: จะอนุญาตให้มีการดำเนินการอย่างไรโดยไม่ต้องให้รหัสผ่านโดยใช้ sudo?
โปรดทราบว่าขึ้นอยู่กับคำสั่งนี้อาจสร้างข้อบกพร่องด้านความปลอดภัย


21

สมมติว่าคุณต้องการเรียกใช้กระบวนการเพียงครั้งเดียว (ไม่ใช่เช่นทุก ๆ 4 ชั่วโมง) จากนั้นคุณสามารถใช้งานได้ atd

  1. ตรวจสอบให้แน่ใจว่า atd กำลังทำงาน (ใน Ubuntu ที่/etc/init.d/atd statusดีขึ้นหรือยังsystemctl status atd)
  2. ที่เทอร์มินัลในฐานะรูทให้รันคำสั่งของคุณดังนี้:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
  3. หากคุณต้องการเรียกใช้ทุก 4 ชั่วโมงคุณสามารถใช้ cron (เป็น root) ด้วยการกำหนดค่าต่อไปนี้ใน crontab ของคุณ

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

2
ใช่atเป็นเครื่องมือที่เหมาะสมสำหรับงานนี้เนื่องจากดูแลการเปลี่ยนเส้นทาง I / O ไม่บล็อกหน้าต่างเชลล์และทำงานได้แม้ในขณะที่ผู้ใช้ออกจากระบบหรือรีบูตเครื่องตั้งแต่
Simon Richter

4
@SimonRichter: sudo bash -c 'sleep 4h && command' &การใส่ sudo ในพื้นหลังเป็นวิธีที่ง่ายกว่าในการไม่บล็อกหน้าต่าง / แท็บเชลล์ หากคุณต้องการให้ผลลัพธ์ปรากฏขึ้นแบบอะซิงโครนัสเพื่อเตือนความจำว่ามันเกิดขึ้นได้ง่ายขึ้น มันไม่ทำงานในการรีบูต แต่ขึ้นอยู่กับnohupการตั้งค่าของคุณมันอาจยังคงทำงานหลังจากออกจาก / ออกจากเปลือก
Peter Cordes

4
โปรดทราบว่าatเรียกใช้คำสั่งทันทีที่ระบบสามารถถูกระงับได้ตามเวลาที่กำหนดดูที่นี่ใน U&L - ขึ้นอยู่กับคำสั่งเพื่อเรียกใช้สิ่งนี้อาจไม่ใช่สิ่งที่คุณต้องการ
ของหวาน

2
เพียงแค่ข้อเสนอแนะคุณสามารถใช้ systemctl เพื่อตรวจสอบสถานะบริการแทนการเรียกสคริปต์ init.d นั้นโดยตรง ในขณะที่ทั้งคู่ดูเหมือนจะมีผลลัพธ์เดียวกันฉันคิดว่าวิธีที่ทันสมัยในการโต้ตอบกับบริการ systemd ควรเป็นที่ต้องการ:systemctl status atd
ผู้บัญชาการ Byte

15

วิธีหนึ่งคือการเรียกใช้ผ่าน shellscript ด้วยsudoสิทธิ์ (และให้รหัสผ่านเมื่อคุณเริ่ม shellscript) หาก shellscript อยู่ในไดเรกทอรีปัจจุบัน

sudo ./delayer 4h

โดยที่delayerสามารถเป็น shellscript พร้อมเนื้อหา

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

ทำให้สามารถเรียกใช้งานได้ด้วย

chmod +x delayer

และคัดลอกหรือย้ายไปยังไดเรกทอรีในPATHถ้าคุณต้องการ


หากคุณต้องการ shellscript ที่ยืดหยุ่นมากขึ้นซึ่งคุณสามารถเลือกคำสั่ง [บรรทัด] เพื่อหน่วงเวลาโดยการป้อนพารามิเตอร์คุณสามารถลอง

#!/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 ลบความคิดเห็นของเขาก่อนที่ฉันจะตอบได้อย่างถูกต้อง โอ้ดี
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy คุณพูดถูก ดังนั้นในกรณีนี้ Shebang จะทำให้ shellscript มีความทนทานในกรณีที่มีคุณสมบัติเพิ่มเติมซึ่งอาจแตกต่างจากรูปแบบไวยากรณ์
sudodus

@SergiyKolodyazhnyy มันเป็นเพียงข้อเสนอแนะดังนั้นฉันคิดว่าการออกความคิดเห็นนั้นไม่จำเป็นและจะเพิ่มความยุ่งเหยิงเท่านั้น รู้สึกอิสระที่จะตีฉันในการแชทและชี้ให้เห็นมุมมองของคุณ :)
Videonauth

2

อีกวิธีหนึ่งคือการเริ่มเซสชันการโต้ตอบ sudo ด้วยsudo -s(ไม่เปลี่ยนไดเรกทอรี) หรือsudo -i(เปลี่ยนไดเรกทอรีปัจจุบันเป็นรูทโฮมไดเรกทอรี) จากนั้นป้อนคำสั่งของคุณ (โดยไม่ต้อง sudo)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.