Você provavelmente precisará usar su -c 'expect -c "spawn ..."'
- observe as aspas extras.
Estou escrevendo um script para instalar alguns softwares pequenos que estou desenvolvendo. Esse script é executado com sudo
(como root), mas alguns dos comandos executados pelo script precisam (ou devem ser) executados com um usuário regular cujo nome eu mantenho na variável $userName
. A maioria dos comandos são um forro e su -c "/what/ever/command" $userName
funciona bem o suficiente.
No entanto, um desses comandos que eu não quero executar como root
vai me perguntar coisas (na verdade, apenas uma coisa, mas muitas vezes: se deve substituir um arquivo existente ou não). Esse comando que eu posso chamar de " baaad_command
" não tem nenhuma opção para fornecer uma resposta padrão (não há " --assume-no
" ou algo assim).
A única opção vi viável é usar o comando esperar e responder " n\r
" todas as vezes as saídas de comando e string começam com " Overwrite
", eu quero que meu script responda não (significando " n\r
") quantas vezes baaad_command perguntar "Overwrite... ? [y/n]"
Eu tentei muitas combinações diferentes de su, spawn, espera ... sem qualquer sorte.
Esta é a 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 tem nada de extraordinário nas outras 200 tentativas ... só acontece de ser o último.
Qualquer sugestão será muito apreciada. Obrigado antecipadamente.