Problema com a execução de um script na inicialização como root?

2

A questão principal:

Existe uma maneira que eu possa executar 'completamente' um dos meus scripts quando o desktop do Ubuntu aparecer, não importa se root, administrador, usuário de desktop ou um usuário não privilegiado estiver logado?

O que o script faz?

O script monta uma partição, procura por um arquivo nessa partição e, finalmente, com base nesse arquivo, é tomada uma decisão de copiar uma partição para outra partição. Essa cópia é feita via

dd if=/dev/sda2 of=/dev/sda5

Quando o script é executado com precisão?

O script é executado sem problemas quando eu o executo no terminal

sudo ./my_copying_script

Este comando me pede a senha do usuário logado atualmente. Eu digitei a senha e o script começou a funcionar.

Quando o script NÃO é executado corretamente?

Eu quero executar o script na inicialização. Eu configurei um programa de inicialização usando o utilitário Startup Applications do Ubuntu. O script foi executado na inicialização, mas foi encerrado no comando dd, após o seguinte erro:

dd: opening '/dev/sda2': Permission denied 

Na sugestão do edk , defino o proprietário do my_copying_script como root e defino o SUID. Agora as permissões de my_copying_script são (-rwsr-sr-x). O ponto de vista do edk foi que uma vez que eu configurei o suid, o programa de inicialização será executado com as permissões de seu dono. Eu fiz isso, mas o mesmo erro de permissão / dev / sda2 negado surgiu.

Eu prefixei o dd com sudo como mencionado abaixo

 sudo dd if=/dev/sda2 of=/dev/sda5

mas isso retornou após erro:

sudo: no tty present and no askpass program specified
    
por Undefined 14.04.2010 / 11:17

5 respostas

2

Usman, acho que você tem pelo menos duas opções que eu já mencionei.

A maneira mais fácil

Crie um binário set-UID que (verifique quem o iniciou e permita o uso se o proprietário do processo pai puder executá-lo) execute o script preparado e saia. Coloque em inicialização no seu gerenciador de desktop, isso é tudo. Basta ser avisado que não é o melhor caminho e precisa de um pouco de codificação C. Basicamente, você precisa criar um código como este exemplo:

int main(){
    setuid(0);
    system("/bin/sh /root/bin/mounts.sh");
}

Esteja ciente de que isso é um truque, não uma solução, na verdade. E não se esqueça de usar direitos root: allowed_group e 4750 em binary se você não precisar que ele seja executado por todos. Lembre-se de adicionar todos os usuários que podem iniciar isto em allowed_group (escolha seu nome).

Uma boa maneira

Outra maneira, muito melhor, é fazer um tipo de daemon, gerado @ boot do sistema (digamos, de init-scripts), mas não tenho certeza exatamente como você vai detectar quando uma nova sessão X for iniciada, Neste tópico ainda, eu não posso dar nenhum aviso claro aqui.

    
por 15.04.2010 / 13:41
1

Defina as permissões corretas no caminho da unidade montada e pronto.

    
por 14.04.2010 / 13:24
0

O sudo só executará um programa como um usuário diferente se uma dessas três condições tiver sido atendida (no que diz respeito a senhas):

  1. a opção NOPASSWD é especificada
  2. o usuário digitou o alvo correto senha
  3. o usuário digitou a fonte correta senha

Como as opções 2 e 3 exigem um TTY (o sudo não lê um pipe) ele não será executado se não for possível encontrar um. Verifique seu script se, a qualquer momento, você estiver executando um script remotamente usando o ssh, pois é possível que ele não aloque um TTY para um comando remoto não interativo.

Citado de: Aqui

    
por 14.04.2010 / 11:24
0

Adicione a entrada para / etc / fstab, use chown e chmod para modificar as permissões para apenas dar acesso root à partição montada.

sudo chown -R root:root /mnt
sudo chmod -R 770 /mnt
    
por 14.04.2010 / 14:13
0

Uma possível solução será adicionar seu usuário e o comando que ele está tentando invocar para / etc / sudoers com o parâmetro NOPASSWD. Cortar de / etc / sudoers:

# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
# %sudo ALL=NOPASSWD: ALL

Então talvez você precise de algo como:

myuser ALL=NOPASSWD: mount

Não tenho muita certeza sobre a sintaxe exata, é melhor pesquisar no Google.

EDIT: Se você está tentando montar uma unidade de rede, adicionar um registro ao / etc / fstab provavelmente não funcionará, porque os serviços de rede não são carregados no momento em que o fstab é executado.

    
por 15.04.2010 / 13:50