Saída estranha quando a variável de eco de um usuário diferente

1
$ sudo su - user1 -c 'echo $DOMAIN_HOME'
/app/user1/DOMAINHOME

Isso parece bem, certo? No entanto, vamos aprofundar um pouco:

$ sudo su - user1 -c 'echo $DOMAIN_HOME' | tee test.out
$less test.out

ESC]P0000000ESC]P8A9A9A9ESC]P1DC143CESC]P9FF0000ESC]P2008000ESC]PA00FF00ESC]P3aa9943ESC]PBFFD700ESC]P41E90FFESC]PC87CEFAESC]P5706c9aESC]PD826ab1ESC]P6FFA500ESC]PEF0F8FFESC]P7FFFFFFESC]PFFFFFFFESC[HESC[2JESC[HESC[2J/app/user1/DOMAINHOME

Isso está causando falha nos meus scripts.

Eles são códigos de cores originados pelo .bashrc, que são fontes de cores para o xterm. Depois de fazer uma pequena pesquisa, a última seção [HESC [2JESC [HESC [2J é o que limpa o terminal antes de gerar o caminho.

Eu tenho puxado meu cabelo tentando descobrir por que isso está aparecendo. Alguma idéia?

Nota: Quando logado como user1, ele reflete bem a variável.

    
por Motorahead 05.05.2015 / 01:08

1 resposta

2

Como você está usando "su -" o shell que está sendo executado está fingindo que é um shell de login (executando /etc/profile do sistema, o perfil do usuário, como .profile ou .bash_profile e assim por diante). Um desses scripts está gerando a seqüência de escape (a string Esc]P ) e imprimindo esse resultado para stdout. Não deveria fazer isso.

O que deve ser feito é verificar se o shell é interativo, e então - e somente então! - deve gerar a seqüência de escape.

A melhor maneira de procurar por um shell interativo é verificar o valor de "$ -" e ver se ele contém a letra i - se isso acontecer, o shell é interativo e, se não, a concha não é. Eu normalmente uso algo assim:

case "$-" in
*i*)  # Here if the shell is interactive
      ;;
*)    # Here otherwise
      ;;
esac

Você precisará determinar o que está gerando essa seqüência de escape. Os culpados comuns são echo , tput ee outros comandos que devem modificar as configurações do terminal. Eu fiz alguns Google'ing mas não consegui achar aquela sequência de escape em particular, então eu não posso fornecer pistas sobre onde / o que procurar.

Claro, por que você está usando su - ? Apenas use sudo -u user1 e elimine uma etapa extra (seus requisitos podem incluir a execução de .profile de user1 ; eu não sei e você não disse).

    
por 05.05.2015 / 01:33