Execute um comando que exija sudo após um tempo.

30

Eu costumo fazer

sleep 4h; command

para executar um comando após 4h. No entanto, se esse comando exigir sudo, não funcionará.

É possível dar sudopermissão no momento em que estou executando o sleepcomando?

OCs Guerlando
fonte
Nesse caso em particular, acho que você pode simplesmente usar o shutdown. comando com sudo e os argumentos apropriados para agendar a suspensão em um horário específico.
oarfish
Qual é a tarefa que você precisa executar e por que exatamente 4 horas dormem?
Thorbjørn Ravn Andersen

Respostas:

46

Use sudopara iniciar um shell raiz onde você executa os comandos:

sudo bash -c 'sleep 4h; command'

Todo comando em execução no shell raiz é executado com permissões de root, o que sleepnão prejudica. Se você precisar executar um comando com permissões de usuário, use sudo -u USERNAME COMMAND, por exemplo:

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

Outra abordagem seria usar sudo visudopara permitir a execução do comando sem acesso root, consulte: Como permitir a execução sem solicitar a senha usando o sudo?
Observe que, dependendo do comando, isso pode criar uma falha de segurança.

sobremesa
fonte
21

Supondo que você queira executar o processo apenas uma vez (não, por exemplo, a cada 4 horas), poderá usar atd

  1. Verifique se o atd está em execução (no ubuntu que é /etc/init.d/atd statusou melhor ainda systemctl status atd)
  2. Em um terminal como root, execute seu comando da seguinte maneira:

    # at now + 4 hours
    warning: commands will be executed using /bin/sh
    at> command
    at> CTRL-D
    
  3. Se você deseja executá-lo a cada 4 horas, você também pode usar o cron (como root) com a seguinte configuração no seu crontab

    0 */4 * * * sh -c $'/path/to/command'
Ama Aje My Fren
fonte
2
Sim, até a ferramenta certa para este trabalho, porque também cuida do redirecionamento de E / S, não bloqueia uma janela do shell e funciona mesmo quando o usuário se desconecta ou a máquina foi reiniciada desde então.
Simon Richter
4
@ SimonRichter: sudo bash -c 'sleep 4h && command' &colocar o sudo em segundo plano é uma maneira mais fácil de não bloquear uma janela / guia do shell. Se você deseja que a saída apareça de forma assíncrona como um lembrete de que aconteceu, isso é mais fácil. Ele não funciona durante as reinicializações, mas, dependendo das nohupconfigurações, ele pode continuar em execução após sair / sair do shell.
Peter Cordes
4
Observe que ato comando é executado assim que é possível quando o sistema é suspenso no horário especificado, veja aqui em U&L - dependendo do (s) comando (s) para executar, pode não ser o que você deseja.
dessert
2
Apenas uma sugestão, você também pode usar o systemctl para verificar o status do serviço em vez de chamar diretamente esse script init.d. Embora ambos aparentemente tenham o mesmo resultado, acho que a maneira moderna de interagir com os serviços systemd deve ser a preferida:systemctl status atd
Byte Commander
15

Uma maneira é executar através de um shellscript com sudopermissões (e forneça a senha, quando você iniciar o shellscript), se o shellscript estiver no diretório atual,

sudo ./delayer 4h

onde delayerpode haver um shellscript com o conteúdo

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

Torne executável com

chmod +x delayer

e copie ou mova-o para um diretório, PATHse desejar.


Se você deseja um shellscript mais flexível, onde você pode selecionar a [linha] de comando para atrasar digitando o (s) parâmetro (s), pode tentar

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

Exemplo de demonstração (pequeno atraso, 5s, para fins de demonstração),

$ ./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
fonte
3
Bem, se for uma /bin/shsintaxe, tudo ficará bem. Mas se você pretende usar recursos específicos do bash, o shebang é necessário. Eu e a Steeldriver discutimos sobre isso em algum lugar. Aaand Videonauth excluiu seu comentário antes que eu pudesse responder corretamente. Oh bem
Sergiy Kolodyazhnyy 18/02
@SergiyKolodyazhnyy, Você está certo. Portanto, neste caso, o shebang está lá para tornar o shellscript robusto no caso de recursos adicionais em que a sintaxe possa ser diferente.
sudodus 18/02
@SergiyKolodyazhnyy Bem, foi apenas uma sugestão, então pensei que deixar o comentário não era necessário e só aumentaria a confusão. Sinta-se à vontade para entrar em contato comigo no chat e mostrar sua opinião :)
Videonauth
2

Outra maneira seria iniciar a sessão interativa sudo com sudo -s(não altera o diretório) ou sudo -i(altera o diretório atual para o diretório inicial raiz) e, em seguida, insira seus comandos (sem o sudo)

Ludwik
fonte