Estou escrevendo um script bash para instalar alguns pequenos softwares que estou desenvolvendo. Esse script é executado com sudo
(como root), mas alguns dos comandos executados pelo script precisam (ou deveriam ser) executados com um usuário normal cujo nome mantenho na $userName
variável. A maioria dos comandos são de uma só linha e su -c "/what/ever/command" $userName
funcionam bem o suficiente.
Porém, um daqueles comandos que não quero executar vai root
me perguntar coisas (na verdade, apenas uma coisa, mas muitas vezes: se deve sobrescrever um arquivo existente ou não). Esse comando que posso chamar de " baaad_command
" não tem nenhuma opção para fornecer uma resposta padrão (não há " --assume-no
" ou algo parecido).
A única opção que considero viável é usar oesperarcomando e responda " n\r
" toda vez que o comando for exibido e a string começar com " Overwrite
", quero que meu script responda não (significando " n\r
") quantas vezes o baaad_command perguntar"Overwrite... ? [y/n]"
Eu tentei muitas combinações diferentes de su, spawn, expect... sem sorte.
Esta é minha última tentativa até agora:
#!/bin/bash
if [[ -d "$destinationFolder" ]] ; then
if [[ -n "$userName" ]] ; then
spawned=$(su -c expect -c "
spawn baaad_command --user \"foo\" --passwd \"bar\" \"$destinationFolder\"
expect {
Overwrite: { send \"n\r\"; exp_continue }
eof { exit }
}
" )
else
echo "Don't have a non-root username to install baaad_command with. Skipping"
exit 3
fi
else
echo "$destinationFolder directory not found in $(pwd). Can't continue"
exit 2
fi
Não há nada de notável nas outras 200 tentativas... apenas acontece que é a última.
Qualquer dica será muito apreciada. Agradeço antecipadamente.
Responder1
Você provavelmente precisará usar su -c 'expect -c "spawn ..."'
- observe as aspas extras.