시간이 지난 후 sudo가 필요한 명령을 실행하십시오.


30

나는 보통

sleep 4h; command

4 시간 후에 명령을 실행합니다. 그러나 해당 명령이 필요 sudo하면 작동하지 않습니다.

명령을 sudo실행하는 순간에 권한 을 부여 할 수 sleep있습니까?



이 특별한 경우에는을 사용할 수 있다고 생각합니다 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가 실행 중인지 확인하십시오 (우분투에서 /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 시간마다 실행하려면 crontab에서 다음 구성과 함께 cron (루트로)을 사용할 수도 있습니다.

    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
제안 사항으로, init.d 스크립트를 직접 호출하는 대신 systemctl을 사용하여 서비스 상태를 확인할 수도 있습니다. 둘 다 같은 결과를 낳는 것처럼 보이지만 현대적인 시스템 서비스와 상호 작용하는 방법이 선호되어야한다고 생각합니다.systemctl status atd
바이트 사령관

15

한 가지 방법은 sudo셸 스크립트가 현재 디렉토리에있는 경우 권한이 있는 셸 스크립트를 통해 실행하고 셸 스크립트 를 시작할 때 비밀번호를 제공하는 것입니다.

sudo ./delayer 4h

delayer내용이있는 쉘 스크립트가 될 수있는 곳

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

로 실행 가능하게 만드십시오

chmod +x delayer

PATH원하는 경우 디렉토리로 복사하거나 이동하십시오 .


매개 변수를 입력하여 지연시킬 명령 [line]을 선택할 수있는보다 유연한 쉘 스크립트를 원하는 경우 시도해 볼 수 있습니다

#!/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, 당신이 맞아요. 따라서이 경우 구문이 다를 수있는 추가 기능의 경우 쉘 스크립트를 강력하게 만들 수 있습니다.
sudodus

@SergiyKolodyazhnyy 글쎄 그것은 단지 제안 일 뿐이므로 의견을 남기지 않아도되고 혼란에 추가 할 것이라고 생각했습니다. 채팅에 나를 치고 당신의 견해를 지적하십시오 :)
Videonauth

2

또 다른 방법은 sudo -s(디렉토리를 변경하지 않음) 또는 sudo -i(현재 디렉토리를 루트 홈 디렉토리로 변경 )으로 sudo 대화식 세션을 시작한 다음 명령없이 sudo없이 입력하는 것입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.