Problema ao executar um script na inicialização como root?

Problema ao executar um script na inicialização como root?

A questão principal:

Existe uma maneira de executar 'completamente' um dos meus scripts quando a área de trabalho do Ubuntu aparecer, não importa se root , administrador, usuário da área de trabalho ou um usuário sem privilégios estiver conectado?

O que o roteiro faz?

O script monta uma partição, procura um arquivo naquela partição e finalmente com base nesse arquivo é tomada a 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 corretamente?

O script funciona perfeitamente quando eu o executo no terminal

sudo ./my_copying_script

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

Quando o script NÃO funciona bem?

Quero executar o script na inicialização. Eu configurei um programa de inicialização usando oAplicativos de inicializaçãoutilitário do Ubuntu. O script foi executado na inicialização, mas saiu no comando dd retornando o seguinte erro:

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

SobreEdksugestão de definir o proprietário de my_copying_script como root e definir o SUID. Agora as permissões de my_copying_script são (-rwsr-sr-x).EdkO ponto de vista de é que, depois de definir o suid, o programa de inicialização será executado com as permissões de seu proprietário. Eu fiz isso, mas o mesmo erro de permissão negada /dev/sda2 apareceu.

Em seguida, prefixei o dd com sudo conforme mencionado abaixo

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

mas isso retornou o seguinte erro:

sudo: no tty present and no askpass program specified

Responder1

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

Uma maneira mais fácil

Faça 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 na inicialização do seu gerenciador de desktop, só isso. Apenas esteja avisado que não é a melhor maneira e precisa de um pouco de codificação C. Basicamente você precisa fazer um código como este exemplo:

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

Esteja ciente de que isso é um hack, não uma solução, na verdade. E certifique-se de usar os direitos root:allowed_group e 4750 embináriose você não precisa que seja administrado por todos. Lembre-se de adicionar todos os usuários que podem iniciar isso em Allow_group (escolha seu nome).

Uma boa maneira

Outra maneira muito melhor é criar uma espécie de daemon, gerado na inicialização do sistema (digamos, a partir de scripts de inicialização), mas não tenho certeza de como exatamente você detectará quando uma nova sessão X for iniciada, não gostei disso tópico ainda, não posso dar nenhumclaroconselhos aqui.

Responder2

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

Responder3

sudo só executará um programa como um usuário diferente se uma destas três condições for atendida (no que diz respeito às senhas):

  1. a opção NOPASSWD é especificada
  2. o usuário digitou a senha de destino correta
  3. o usuário digitou a senha de origem correta

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

Citado de:Aqui

Responder4

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

# Remova o comentário para permitir que membros do grupo sudo não precisem de senha
# (Observe que as entradas posteriores substituem isso, então você pode precisar mover
# mais abaixo)
#%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.

EDITAR:Se você estiver 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.

informação relacionada