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.