sudo exibe a senha digitada no script bash

3

Eu tenho um script bash que usa sudo algumas vezes. Há alguns pontos estranhos sobre isso.

  1. Ele me pede minha senha alguns segundos depois de eu já ter digitado para um comando anterior.
  2. A segunda vez que insiro minha senha, ela é exibida no visor.

Aqui estão os bits relevantes do script.

sudo service apache2 stop
drush sql-dump --root="$SITE_DIR" --structure-tables-key=svn --ordered-dump | grep -iv 'dump completed on' | sudo tee "$DB_DIR/${SITE_NAME}.sql" > /dev/null
sudo svn diff "$DB_DIR" | less
sudo svn commit -m "$MESSAGE" "$DB_DIR"
sudo service apache2 start

A primeira senha é parar o apache e funciona como esperado. Como mencionado, o sudo tee não 'lembra' que eu tenho privilégios elevados, pede a senha novamente, e ecoa na tela. Dado que tee tem tudo a ver com echoing, eu brinquei um pouco com scripts simples que têm | sudo tee , e todos funcionam como esperado.

Editar: Eu olhei para o comando drush , e é um arquivo bash que chama o PHP usando exec . Isso soa como poderia ter potencial - alguma idéia? Aqui está a linha de drush .

exec php $SCRIPT_PATH --php='which php' "$@"

Edit2: Estava procurando algo para fazer com scripts Ruby e deparamos com este post sobre níveis elevados privilégios em scripts de serverfault.

    
por Andy 18.06.2010 / 12:19

4 respostas

8

Posso sugerir outra solução? Pare de usar sudo nos scripts bash, em vez disso, execute o script inteiro com direitos elevados.

Você pode verificar facilmente se o script é executado como root ou não:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "$0 must be run as root"
    exit 1
fi

Extraído de esta importante pergunta .

    
por 18.06.2010 / 13:31
0

Você pode verificar novamente sua versão sudo ?
Eu vejo isso no manual atual do sudo ,

-A

Normally, if sudo requires a password, it will read it from the current terminal. If the -A (askpass) option is specified, a (possibly graphical) helper program is executed to read the user's password and output the password to the standard output. If the SUDO_ASKPASS environment variable is set, it specifies the path to the helper program. Otherwise, the value specified by the askpass option in sudoers(5) is used.

e

SUDO_ASKPASS

Specifies the path to a helper program used to read the password if no terminal is available or if the -A option is specified.

Não lembro de ter lido ou usado isso antes ...

    
por 18.06.2010 / 13:31
0

De exemplos do man 8 sudo :

Para fazer uma listagem de uso dos diretórios na partição / home. Note que isto executa os comandos em um sub-shell para fazer o trabalho de redirecionamento de cd e arquivo.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

E eu não sei o que "testes" você correu com tee, mas o caso simples:

$ sudo id | sudo tee /tmp/junk

Solicita duas senhas de uma só vez e, em seguida, ambas disputam a fila de entrada para que nenhuma delas aceite a senha (e elas estragam a disciplina stty line para que os caracteres digitados sejam reproduzidos).

Atualização: Ah, você queria saber por que o sudo não se aplica ao pipeline? Porque o shell tem que separar os subprocessos de um pipeline, cada qual herda o contexto do shell pai. No que diz respeito ao shell, sudo é apenas um comando e executa seus argumentos em um contexto de privilégio elevado que não "flui" pelo canal. Como um conjunto de comandos, o pipeline pode ser lido como

drush sql-dump > pipe ;  ( grep < pipe  ;  ( sudo tee file < pipe ) )

que é um modelo mais preciso do que está acontecendo.

    
por 18.06.2010 / 13:43
0

Você também pode sempre olhar para algo simples como criando um fifo ou 'pipe' para a saída que você quer ler

'mkfifo -m 600 /path/to/fifo' 

man mkfifo para mais informações. Seu código agora vai ler algo como:

sudo service apache2 stop 
#this will be visible and you can type in your password
stty -echo
# this will now remove echoing of characters to the screen
drush sql-dump --root="$SITE_DIR" --structure-tables-key=svn --ordered-dump | grep -iv 'dump completed on' | sudo tee "$DB_DIR/${SITE_NAME}.sql" > /dev/null
# as you are again looking for visible output, i would use the fifo here
sudo svn diff "$DB_DIR" \> /path/to/fifo &
sleep 4 # or longer
tail /path/to/fifo
sudo svn commit -m "$MESSAGE" "$DB_DIR"
sudo service apache2 start
stty echo
    
por 27.03.2011 / 15:41