Bash: prompt remoto interativo

15

Eu tenho um script que se conecta a um servidor remoto e verifica se algum pacote está instalado:

ssh root@server 'bash -s' < myscript.sh

myscript.sh:

OUT='rpm -qa | grep ntpdate'
if [ "$OUT" != "" ] ; then
    echo "ntpdate already installed"
else
    yum install $1
fi

Este exemplo pode ser simplificado. Aqui está o myscript2.sh , que tem o mesmo problema:

read -p "Package is not installed. Do you want to install it (y/n)?" choise

Meu problema é que o bash não consegue ler minhas respostas de forma interativa.

Existe uma maneira de executar o script local remotamente sem perder a capacidade de solicitar ao usuário?

    
por Anthony Ananich 10.11.2013 / 14:23

3 respostas

21

Tente algo assim:

$ ssh -t yourserver "$(<your_script)"

O -t força uma alocação tty, $(<your_script) lê todo o arquivo e, nesse caso, passa o conteúdo como um argumento para ssh , que será executado pelo shell do usuário remoto.

Se o script precisar de parâmetros, passe-os após o script:

$ ssh -t yourserver "$(<your_script)" arg1 arg2 ...

Funciona para mim, não tenho certeza se é universal.

    
por 10.11.2013 / 17:19
3

Seu problema é que ssh inicia um login, shell não interativo na máquina remota. A solução fácil óbvia seria copiar o script para o servidor remoto e executá-lo de lá:

scp myscript.sh root@server:/tmp && ssh root@server /tmp/myscript.sh

Se a cópia não for uma opção por qualquer motivo, eu modificaria o script para primeiro conectar e verificar se $1 está instalado, depois reconecte e instale conforme necessário:

OUT=$(ssh root@server rpm -qa | grep "$1");
if [ "$OUT" != "" ] ; then
    echo "$1 already installed"
else
   read -p "Package $1 is not installed. Do you want to install it (y/n)?" choice
   if [ "$choice" -eq "y" ]; then
       ssh root@server yum install "$1"
   fi
fi
    
por 10.11.2013 / 16:23
0

Aqui está uma boa explicação .

Então eu adaptei o script para

hostname
echo -n "Make your choice :"
read choice
echo "You typed " ${choice}
echo done

e isso não funcionou.

então mudei o script para o controle remoto para evitar o redirecionamento local no ssh. (Meus comandos estão em um arquivo chamado f )

cat f | ssh [email protected] 'cat >remf'
ssh user@remotehost bash remf

Isso funcionou. Aqui está a saída:

christian@clafujiu:~/tmp$ ssh localhost bash tmp/f
christian@localhost's password: 
Linux clafujiu 2.6.32-52-generic #114-Ubuntu SMP Wed Sep 11 19:00:15 UTC 2013 i686 GNU/Linux
Sun Nov 10 14:58:56 GMT 2013
Make your choice :abc
You typed  abc
done

Como @terdon mencionou que a intenção original era executar scripts locais remotamente, a cópia remota pode ser automatizada, isso é apenas um exemplo, tudo em uma linha.

REMID='cat f |ssh user@remotehost 'cat > remf_$$; echo $$'' ;ssh [email protected] "bash remf_${REMID} ; rm -v remf_${REMID}"
    
por 10.11.2013 / 15:13