Como inserir a senha apenas uma vez em um script bash que precisa de sudo

17

Dados

  • Eu quero que os usuários do operador nesta máquina montem seus próprios compartilhamentos cifs
  • O arquivo sudoers já contém o comando /bin/mount -t cifs //*/* /media/* -o username=* para todos os operadores
  • Eu quero que os usuários montem um cifs em um script digitando a senha apenas uma vez, não duas vezes.
  • A senha do sudo e a senha do cifs são idênticas.

O que eu já tenho

Este script funciona:

#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... mas requer que os usuários digitem a mesma senha duas vezes!

  • Uma vez para sudo
  • Uma vez para o monte em si

Isso também funcionaria:

#!/bin/bash
echo -n Password: 
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... mas isso exigiria que eu permitisse que todos os usuários do operador pudessem sudo sh (grande problema de segurança)

Pergunta

* Como montar um compartilhamento cifs no bash ¹ sem colocar sh no arquivo sudoers nem criar um arquivo permanente / temporário ?? ? *

Nota 1: não python, perl, C, Go, ... por favor?
Nota 2: Eu sei que posso apenas remover a senha através do arquivo sudoers , mas estou tentando aumentar a segurança sem abrir mão da conveniência ...

    
por Fabby 20.12.2015 / 15:43

4 respostas

8

Eu sou burro!

O seguinte script:

#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"

apenas funciona e:

  1. Não cria arquivos que contenham senhas
  2. Permite que o usuário digite apenas uma senha para vários compartilhamentos (incluindo os do Windows)
  3. Não há necessidade de privilégios extras a serem concedidos. : -)
por Fabby 20.12.2015 / 16:16
22

Você deve fazer o usuário fazer a chamada usando sudo como sudo script . basta verificar se o script está sendo executado como root, se não pedir por ele

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root, use sudo "$0" instead" 1>&2
   exit 1
fi

Não tente capturar a senha dos seus usuários.

    
por Braiam 20.12.2015 / 23:11
3

Exigir nenhuma senha sudo para executar este comando; o prompt de senha para mount permanece.

Em sudoers , inclua algo como

ALL        ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

Depois de incluir isso, sudo não pedirá mais uma senha para esse comando específico; o usuário ainda precisa fornecer uma senha para o comando mount .

Nota : peguei o comando verbatim do que você incluiu na pergunta; Não verifiquei se seus curingas permitiriam que os usuários fizessem algo desagradável. Leia a% man_de% manpage para exemplos de maldade. Em particular, observe que essa linha em sudoers permite que o usuário adicione qualquer número de opções sudoers ou outros argumentos a -o . Você pode querer repensar sua abordagem, por exemplo, adicionando um script como o @Braiam propõe e permitir a execução do mesmo através de mount sem autenticação extra. O script garante que os usuários só possam executar o formulário específico de sudo que você deseja que eles executem.

Além disso, em vez de permitir isso para todos os usuários, você também pode limitar isso a membros de um determinado grupo, por exemplo, você poderia criar um grupo mount e depois ter

%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
    
por Oliphaunt 20.12.2015 / 18:42
0

Uma solução geral para essas questões é colocar o seguinte preâmbulo no topo do seu sudo, exigindo scripts:

#!/bin/bash
case $EUID in
   0) : cool we are already root - fall through ;;
   *) # not root, become root for the rest of this session
      # (and ask for the sudo password only once)
      sudo $0 "$@" ;;
esac
# now the present process is effective-UID  (root)
# so there's no need to put sudo in front of commands

any more commands here will run as superuser ...

Obviamente, isso tem uma desvantagem em que, se alguns comandos no script não exigirem que sudo seja executado, haverá uma elevação desnecessária de privilégios aqui.

Enfim, pensei em compartilhar essa pequena dica. A coisa mais legal sobre isso, é que se você já é root eficaz-uid (por exemplo, se você já o chamou sob o sudo), ele faz a coisa corretamente. Também dar um erro e forçar você a digitar / re-executar (com sudo) é menos amigável.

Você também pode querer verificar a variável timestamp_timeout em man 5 sudoers , que diz a sudo para lembrar as credenciais do usuário por um número limitado de minutos (e pode ser fracionário).

    
por arielf 26.12.2015 / 04:05