Chạy một lệnh yêu cầu sudo sau khi thời gian đã trôi qua


30

tôi thường làm

sleep 4h; command

để thực hiện lệnh sau 4h. Tuy nhiên, nếu lệnh đó yêu cầu sudo, nó sẽ không hoạt động.

Có thể cấp sudophép tại thời điểm tôi đang chạy sleeplệnh không?



Trong trường hợp cụ thể tôi nghĩ bạn chỉ có thể sử dụng shutdown. lệnh với sudo và các đối số thích hợp để lên lịch ngủ vào một thời điểm cụ thể.
oarfish


Nhiệm vụ bạn cần làm là gì, và tại sao ngủ chính xác 4 giờ?
Thorbjørn Ravn Andersen

Câu trả lời:


46

Sử dụng sudođể bắt đầu một shell root nơi bạn chạy các lệnh:

sudo bash -c 'sleep 4h; command'

Mỗi lệnh chạy trong shell root đều chạy với quyền root, điều sleepnày không gây hại. Nếu bạn cần chạy một lệnh có quyền người dùng trong đó, hãy sử dụng sudo -u USERNAME COMMAND, ví dụ:

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

Một cách tiếp cận khác là sử dụng sudo visudođể cho phép thực thi lệnh mà không cần truy cập root, xem: Làm thế nào để cho phép thực thi mà không cần nhắc mật khẩu bằng sudo?
Lưu ý rằng tùy thuộc vào lệnh này, điều này có thể tạo ra một lỗ hổng bảo mật.


21

Giả sử bạn chỉ muốn chạy quy trình một lần (không, ví dụ cứ sau 4 giờ) thì bạn có thể sử dụng atd

  1. Đảm bảo rằng atd đang chạy (trong Ubuntu /etc/init.d/atd statusvẫn còn hoặc tốt hơn systemctl status atd)
  2. Tại một thiết bị đầu cuối như root chạy lệnh của bạn như sau:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
    
  3. Nếu bạn muốn chạy nó cứ sau 4 giờ, bạn cũng có thể sử dụng cron (với quyền root) với cấu hình sau trong crontab của bạn

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

2
Có, atlà công cụ phù hợp cho công việc này, vì nó cũng đảm nhiệm việc chuyển hướng I / O, không chặn cửa sổ shell và hoạt động ngay cả khi người dùng đã đăng xuất hoặc máy đã được khởi động lại kể từ đó.
Simon Richter

4
@SimonRichter: sudo bash -c 'sleep 4h && command' &đặt sudo dưới nền là cách dễ dàng hơn để không chặn cửa sổ / tab shell. Nếu bạn muốn đầu ra bật lên không đồng bộ như một lời nhắc nhở rằng nó đã xảy ra, điều đó dễ dàng hơn. Nó không hoạt động trên các lần khởi động lại, nhưng tùy thuộc vào nohupcài đặt của bạn, nó có thể vẫn chạy sau khi thoát / đăng xuất khỏi trình bao.
Peter Cordes

4
Lưu ý rằng atchạy lệnh ngay khi có thể khi hệ thống bị treo tại thời điểm được chỉ định, xem tại đây trên U & L - tùy thuộc vào (các) lệnh để chạy, đây có thể không phải là điều bạn muốn.
tráng miệng

2
Chỉ cần một gợi ý, bạn cũng có thể sử dụng systemctl để kiểm tra trạng thái dịch vụ thay vì gọi trực tiếp tập lệnh init.d đó. Mặc dù cả hai dường như có cùng một kết quả, tôi nghĩ rằng cách tương tác hiện đại với các dịch vụ systemd nên được ưu tiên:systemctl status atd
Chỉ huy Byte

15

Một cách là chạy qua shellscript với sudoquyền (và cung cấp mật khẩu, khi bạn khởi động shellscript), nếu shellscript nằm trong thư mục hiện tại,

sudo ./delayer 4h

nơi delayercó thể là một shellscript với nội dung

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

Làm cho nó thực thi được với

chmod +x delayer

và sao chép hoặc di chuyển nó vào một thư mục PATHnếu bạn muốn.


Nếu bạn muốn một shellscript linh hoạt hơn, nơi bạn có thể chọn lệnh [line] để trì hoãn bằng cách nhập (các) tham số, bạn có thể thử

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

Ví dụ demo (độ trễ ngắn, 5s, cho mục đích 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

3
Chà, nếu đó là /bin/shcú pháp thì sẽ ổn thôi. Nhưng nếu bạn có ý định sử dụng các tính năng dành riêng cho bash, thì shebang là cần thiết. Tôi và thép đã thảo luận về điều đó ở đâu đó. Aaand Videonauth đã xóa bình luận của mình trước khi tôi có thể trả lời đúng. Oh well
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyy, Bạn nói đúng. Vì vậy, trong trường hợp này, shebang có mặt để làm cho shellscript mạnh mẽ trong trường hợp các tính năng được thêm vào trong đó cú pháp có thể khác nhau.
sudodus

@SergiyKolodyazhnyy Vâng, đó chỉ là một gợi ý nên tôi nghĩ để lại bình luận là không cần thiết và sẽ chỉ thêm vào sự lộn xộn. Hãy thoải mái đánh tôi trong trò chuyện và chỉ ra quan điểm của bạn :)
Videonauth

2

Một cách khác là bắt đầu phiên tương tác sudo với sudo -s(không thay đổi thư mục) hoặc sudo -i(thay đổi thư mục hiện tại thành thư mục gốc) và sau đó nhập lệnh của bạn (không có sudo)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.