Executando script que possui comandos sudo com sudoers

1

Eu escrevi um script que ajuda a limpar meus downloads e animes, mas ele não roda sem raiz.

Então, tentei adicioná-lo ao / etc / sudoers (editado usando as sugestões do techraf):

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification


# Cmnd alias specification
Cmnd_Alias FILEPERM_CMDS = /bin/chown, /bin/chmod

# User privilege specification
root    ALL=(ALL:ALL) ALL
myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/down.sh
myUsernane ALL = NOPASSWD: /media/96e60511-62ca-48ba-bccc-9b365bfcc4e5/Programs/rehamer.sh
myUsernane ALL=(ALL) NOPASSWD: /bin/chown
myUsernane ALL=(ALL) NOPASSWD: /bin/chmod
myUsernane ALL=(ALL) NOPASSWD: FILEPERM_CMDS

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d 

Mas isso não funciona ...

Veja o que há dentro do script:

sudo chown -cR myUsername:users $downloads $anime >>"$default"logs/own.log 2>&1
echo owned
sudo chmod -cR 664 $anime >>"$default"logs/mod.log 2>&1
sudo chmod -cR 765 $downloads >>"$default"logs/mod.log 2>&1
sudo find $downloads $anime -type d -exec chmod a+x {} \; >>"$default"logs/mod.log 2>&1
echo moded
rm -vrf $downloads*.ignore >>"$default"logs/rm.log 2>&1
echo removed ignored files

Se eu deixar o sudo no script, ele pedirá minha senha uma vez e funcionará. Se eu remover o sudo do meu script, ele será executado sem promover a senha, mas ainda recebo os erros Permissions denied vezes sem conta. Como você pode consertar isso?

    
por hakarune 29.02.2016 / 23:37

2 respostas

2

Adicionando o seguinte a sudoers :

myUsername ALL=(ALL) NOPASSWD: /path/to/down.sh

Você permitiu que myUsername executasse o script /path/to/down.sh com privilégios elevados. Isso significa que você pode emitir o seguinte comando:

sudo /path/to/down.sh

Seria suficiente executar todo o seu script com privilégios elevados e não pediria uma senha. Você não precisa colocar sudo adicional para chown ou chmod , pois esses comandos herdarão permissões do script (mas, neste caso, sudo chown seria executado sem problemas, pois root tem permissões para executar todos comandos sem prompt de senha).

Esse é um caminho possível.

O outro jeito ...

Você não permitiu que myUsername executasse chown ou chmod em sudoers . Se você quisesse executar o script como um usuário comum e permitir apenas que determinados comandos fossem executados como root , você deve especificar todos eles em sudoers , por exemplo:

myUsername ALL=(ALL) NOPASSWD: /usr/sbin/chown

seu caminho para binários pode ser diferente

ou especifique alias de comando:

Cmnd_Alias FILEPERM_CMDS = /usr/sbin/chown, /usr/sbin/chmod
myUsername ALL=(ALL) NOPASSWD: FILEPERM_CMDS

Dessa forma, você pode usar seu script como está.

Por fim, você especificou suas permissões em # User alias specification . Este é apenas um bom conselho prático, mas não é sobre isso que trata esta seção. Você deve preferir que ele seja adicionado a # User privilege specification .

Dê uma olhada nos exemplos de sudoers para alguns cenários comuns.

    
por 01.03.2016 / 00:39
0

Uma possibilidade é ter o script sudo em si. Adicione isto ao / etc / sudoers:

myUsername ALL=(ALL) NOPASSWD: /path/to/down.sh

Em seguida, adicione isso no começo do script:

#!/bin/bash

# If not already running as root, rerun via sudo
if [ $(id -u) -ne 0 ]; then
    exec sudo "$BASH_SOURCE" "$@"
    exit $? # in case something fails...
fi

Contanto que o caminho do arquivo corresponda à entrada em / etc / sudoers, ele deve ser capaz de se executar novamente de forma transparente como raiz (para que você possa deixar o sudo s no resto do script). Se não corresponder por algum motivo, você receberá o prompt de senha de sudo .

    
por 01.03.2016 / 22:21