Execute expect dentro de um script bash como outro usuário

Execute expect dentro de um script bash como outro usuário

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 $userNamevariável. A maioria dos comandos são de uma só linha e su -c "/what/ever/command" $userNamefuncionam bem o suficiente.

Porém, um daqueles comandos que não quero executar vai rootme 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.

informação relacionada