Executar script como root no login (sem usuário do sudoer, sessão de shell)


8

Muito parecido /etc/profilee ~/.profilemas correu pela raiz em vez do usuário está fazendo login. /etc/rc.localé executado após a inicialização, mas eu preciso executar o script antes do login. O usuário não é do sudoer.

Obrigado!


Pode haver uma maneira de fazer isso, mas não seria assim /etc/profileou ~/.profileporque a execução de código nesses scripts é feita pelo shell do usuário e está sujeita ao controle do usuário, enquanto que, se você não deseja que o usuário tenha o poder executar programas como rooteles mesmos, isso terá que ser feito por algum serviço em execução externo aos processos do usuário. ... Pode ajudar se você puder nos dizer o objetivo do script que deseja executar.
Eliah Kagan

Preciso executar uma montagem (--bind) específica para um usuário específico. Eu tentei o fstab com as opções de proprietário e usuário, mas ele não funciona. O /etc/rc.local é uma opção, mas sempre executa a montagem, independentemente de o usuário efetuar login ou não. No momento, concedi privilégios de sudoer para 'mount' ao usuário, mas essa é uma solução alternativa e não gosto de conceder privilégios a usuários padrão. Acho que vou usar o rc.local. Obrigado!
Antonio Sánchez

Você pode criar um script raiz com apenas esse mountcomando específico e conceder ao usuário o privilégio de executar apenas esse script (configurando /etc/sudoers). Um comando com determinadas opções pode ser definido diretamente no sudoers.
enzotib

Eu já tentei dessa maneira. O fato é que, quando chega a hora de executar 'mount' dentro do script, novamente 'sudo' é obrigatório, porque o script é executado por 'user' e não por 'root'; portanto, no final do dia, 'mount' deve ser concedido também para 'usuário' e, em vez de apenas uma regra de sudoers, agora eu tenho duas. Esta é a minha experiência; portanto, lembre-se de que não sou especialista e talvez tenha feito algo errado. Obrigado!
Antonio Sánchez

Respostas:


3

Só para voltar ao método sudoers, acho que você estava quase lá antes de desistir. Analisando seus comentários mais recentes, gostaria de abordar algo que provavelmente corrigirá as coisas para você:

Se você executa um script como root, não precisa chamar o sudo de dentro dele.

Eu tenho um script como este:

#! /bin/bash

echo $USER
whoami

Se eu correr sudo ./myscript, vejo rootretornado para os dois. A sessão em que o script está sendo executado é um shell raiz.

Em resumo, isso significa que tudo o que você faz no seu script já tem permissões de root. Você não precisa ligar sudo(não que isso doa - rootgeralmente tem sudopermissões).

Portanto, escreva seu script, e chownpara ele (para que apenas o root possa executá-lo, ler ou editá-lo) e, em seguida, permita que seus usuários os executem através de sudoers. Isso deve funcionar.rootchmod700

Se não estiver funcionando, provavelmente é um problema maior com o script, não com a estrutura de permissões. Sugiro que você dê sudoacesso total ao usuário (adicionar ao grupo de administradores é a maneira mais fácil) e depois executar seu script.


2

Etapa 1. crie um script com o comando bind usando qualquer editor. Por exemplo:

sudo emacs bind_user_directories.sh

conteúdo:

#!/bin/bash

#NOTE: this file would be placed in /usr/local/sbin/ folder as bind_user_directories.sh
#alternatively it could be placed in /etc/init.d/ ... (I guess)

### BEGIN INIT INFO
# Provides:          bind_user_directories
# Required-Start:    
# Required-Stop:     
# Should-Start:      $named
# Default-Start:     0 2 3 4 5 6 (I guess...)
# Default-Stop:      1
# Short-Description: mount --bind for a user
# Description:       runs mount --bind command for certain pre-defined directories for a specific user
### END INIT INFO

# What is this?
DESC="bind_user_directories"

# See how we were called.
case "$1" in

    start)
        log_progress_msg "bind directories for user..."
        sudo mount --bind /source/path /target/path
        log_progress_msg "done: bind directories for user"
        ;;

    stop)
        log_progress_msg "umount --bind directories for user..."
        sudo umount /target/path
        log_progress_msg "done: unbind directories for user"
        ;;

    restart)
        $0 stop
        sleep 1
        $0 start
        ;;

    *)
        #log_success_msg "Usage: bind_user_directories {start|stop|restart}"
        log_success_msg "Usage: service bind_user_directories <start|stop|restart>"
        exit 1
        ;;
esac

exit 0

Etapa 2. salve bind_user_directories.sh e torne-o executável:

chmod a+x bind_user_directories.sh

Etapa 3. vincule-o a um local adequado, como / usr / local / sbin:

sudo ln -s bind_user_directories.sh /usr/local/sbin/bind_user_directories.sh

Etapa 4. crie o script inicial:

sudo emacs /etc/init/bind_user_directories.conf

conteúdo:

description "runs mount --bind command for certain pre-defined directories for a specific user"

start on filesystem and net-device-up IFACE!=lo

stop on runlevel [!023456]
console output
respawn
respawn limit 10 5

exec /usr/local/sbin/bind_user_directories.sh start

Se isso funcionar para você, entre em contato. Você pode verificar o log do sistema em busca de mensagens após o login. (Ainda não testei e nunca implementei nada como isso antes.) Se você melhorar a solução, compartilhe sua solução final aqui. Obrigado.


Sim, funciona! É uma ótima alternativa para os mdms /etc/mdm/PostLogin/scripts no mundo Ubuntu !!
Adam Ryczkowski 24/03

Você tem alguma solução semelhante no systemd? ... Cf. askubuntu.com/questions/847930/...
Adam Ryczkowski

0

Para executar um script como root antes do login

  1. Você pode iniciar o script com o Upstart .

  2. Você pode adicionar a chamada script para os existentes / gdm / etc inicialização de scripts kdm .

Exemplos: Tópico: Perguntas frequentes: autoinicialização / execução automática, execução periódica .


Mas o que Antonio Sánchez está procurando é como executar um script, root no momento em que um usuário específico efetua login .
Eliah Kagan

O script deve ser executado independentemente, a sessão é gráfica ou shell padrão. Eu atualizei o título para comentar isso. Eu li algo sobre o Upstart, mas parece complicado para a tarefa (aparentemente) simples que é. De qualquer forma e até agora, o Upstart parece ser a única maneira de fazê-lo. Se você conhece o Upstart, seria difícil aprender o suficiente para realizar esse trabalho? Obrigado!
Antonio Sánchez
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.