Configurando um trabalho Cron que executa um chmod / chown

9

Eu gostaria de configurar um trabalho cron que de forma recusativa execute um chmod / chown em um diretório (o diretório dropbox).

Isso funciona quando executo os comandos manualmente, como:

sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox

Eu tentei convertê-lo em um trabalho cron como este:

10      *       *       *       *       sudo chown -R $USER ~/Dropbox

Mas parece não fazer o trabalho.

Como fazer isso?

tvgemert
fonte
incron+ inotifySeria soluções mais limpas :)
franzlorenzon

Respostas:

9

Você deseja que seu script cron raiz (edite executando sudo crontab -e) seja:

 55 * * * * /bin/chown -R somename /home/somename/Dropbox && /bin/chmod u+rw /home/somename/Dropbox

Supondo que o usuário seja nomeado somenamee esse /home/somename/Dropboxseja o caminho completo do diretório do Dropbox. Como usuário root, ~ acessa /root.

dr jimbob
fonte
1
Obrigado pela resposta clara! Acho que isso me mostra alguns dos links ausentes que eu estava procurando. Vou testá-lo primeira coisa amanhã :)
tvgemert
Testei, e está funcionando!
Tvfevert 17/02
2
Ótimo; feliz por estar trabalhando. As lições são (a) não esperam variáveis ambientais como $PATHa definir equivalentes às de um usuário conectado em um cron (por exemplo, no meu linuxbox $ HOME está definido, mas $ PATH está definido para /usr/bine /binde crontab e US $ USUÁRIO não está definido; portanto, nesse caso, você não precisou especificar /binantes do chmod / chown), (b) evitar sudonos scripts (executar a tarefa cron como rootusuário), (c) como o usuário root $HOMEfará referência a / root e não ao usuário normal , (d) ~deve ser evitado nos scripts cron (por padrão, execute como #!/bin/sh.
dr jimbob 17/02/2012
Eu também recomendaria escrever um script de acordo com o conselho de David, se você fizer algo mais complicado do que isso; um script parece um exagero para uma combinação de chmod / chown. No entanto, se você começar a se inscrever nos Dropboxes ou em outros diretórios de outros usuários ou decidir executar apenas em arquivos alterados recentemente (por exemplo, resultado de find), etc., faça sentido colocar um script.
dr jimbob
16

sudoquase nunca deve ser usado em tarefas agendadas. Ele espera poder conversar com um terminal e requer sinalizadores específicos para evitar tentar fazê-lo.

Crie seu trabalho cron como root (em /etc/crontab- Observe que o formato deste arquivo é um pouco diferente :). Isso também tem o benefício de trabalhar em sistemas onde não está instalado.minute hour mday month wdayusercommand
sudo

voretaq7
fonte
Obrigado! Eu criei isso, mas ainda não tenho certeza. Não 55 * * * * root chown -R somename ~/Dropbox
obtive
3
somenamepoderia estar em qualquer lugar; é um caminho relativo. Em segundo lugar, ~é entendido apenas pelo shell; use $HOME. Use um comando como este: chown -R /some/path/somename $HOME/Dropbox(este usará rooto diretório inicial do ...)
Mei
@ David: somenamenão é um caminho, mas o nome de utilizador (e também deve conter o nome do grupo: somename:somegroup);)
knittl
5
@tvgemert O que David disse acima (e em sua resposta) sobre caminhos / caminhos relativos / caminhos simbólicos ( ~) é CRITICAMENTE IMPORTANTE - Por favor, dedique algum tempo às páginas do cron e do crontab e verifique se você entende o que está acontecendo (em caso de dúvida) , criar um trabalho cron que faz echo "what you want to do" > /tmp/what-i-would-rune olhar para os resultados para ter certeza que eles estão sãos -. muita chance menor de destruir o universo)
voretaq7
Obrigado pelas dicas úteis, já me deu mais informações!
Tvgertert
6

Duas questões:

1) Os caminhos normalmente não são configurados no cron da mesma maneira que quando você faz login. Tente / usr / bin / sudo / bin / chown ... (ou quaisquer que sejam os caminhos corretos para esses programas em seu sistema).

2) sudo normalmente pede sua senha ou pode não ser feliz executando de forma não interativa. Eu sugiro que você coloque os comandos no crontab do root sem o sudo, e os comandos serão executados como root.

pjc50
fonte
5

Existem vários problemas com o seu crontab:

10 * * * sudo chown -R $USER ~/Dropbox

As questões:

  • sudonão deve ser usado aqui; requer entrada terminal
  • chowndeve ser totalmente especificado (ou seja, /bin/chown)
  • USERcomo uma variável real pode não existir; alguns sistemas usamLOGNAME
  • ~(til) será reconhecido apenas por uma concha - um nu chownnão a entenderá
  • especificar HOME no crontab do root vai para a casa do root

Eu acho que eu realmente scriptá-lo:

#!/bin/bash

# FILE: /usr/local/bin/myscript

USER=$1
eval chown -R $1 ~$1/Dropbox
eval chmod -R u+rw ~$1/Dropbox

( evalÉ necessário converter ~$1para ~user depois para /home/user).

Execute este script a partir do crontab do root:

# root's crontab
10 * * * /usr/local/bin/myscript someuser
Mei
fonte
0

Como alternativa, você poderá ativar o suporte à ACL e usar o setfacl para obter o mesmo resultado / similar.

Ryan D
fonte