Automatize o aplicativo de linha de comando para outro usuário

0

eu tenho um problema com o seguinte comando. Eu quero escrever um script que define o vncpasswd para outro usuário. Se eu executar o seguinte comando, ele só funcionará para o usuário atual.

#< echo "passw0rd\npassw0rd\nn" | vncpasswd

Mas ao executar o próximo comando, recebo um problema porque o eco resultante não é mais uma entrada válida para o programa.

#< su nonrootuser -c "echo "passw0rd\npassw0rd\nn" | vncpasswd"

#> Using password file /home/nonrootuser/.vnc/passwd
#> Password: Warning: password truncated to the length of 8.
#> Verify:   Passwords do not match. Please try again.

Obrigado pelas suas respostas! : D

    
por w5e 19.07.2016 / 19:47

1 resposta

1

Dependendo do shell, o comando echo pode ou não executar a expansão de barra invertida para transformar \n em uma nova linha. Por exemplo, o bash não é por padrão, mas sim após shopt -s xpg_echo .

Mas mesmo que o echo incorporado em sh realize uma expansão de barra invertida na sua máquina, seu código não será acionado devido a como você escreveu o comando. Você está passando a string echo passw0rdnpassw0rdnn | vncpasswd para o comando su : a segunda aspas duplas terminam o literal de cadeia com aspas duplas e a terceira aspas duplas inicia um novo literal de cadeia com aspas duplas, portanto as sequências \n não estão aspas duplas no shell externo e, portanto, \n expande para n . Você quis escrever algo como

su nonrootuser -c "echo -e 'passw0rd\npassw0rd\nn' | vncpasswd"

para que as barras invertidas sejam passadas literalmente pelos dois shells e com a opção -e passada para echo para que ele execute a expansão da barra invertida.

Mas, em vez de mexer com echo de uma maneira não totalmente portátil, basta chamar printf (que é totalmente confiável) ou executar echo uma vez para cada linha:

su nonrootuser -c "{ echo 'passw0rd'; echo 'passw0rd'; echo n; } | vncpasswd"
su nonrootuser -c "printf '%s\n' 'passw0rd' 'passw0rd' n | vncpasswd"
su nonrootuser -c "
  vncpasswd <<EOF
passw0rd
passw0rd
n
EOF"
    
por 20.07.2016 / 02:50