como escapar caracteres incomuns / uniq de esperar scripts?

1

no script de espera, posso definir qualquer comando ou caractere para executá-lo na máquina remota mas o mais triste é que esperamos não conseguir enviar o mesmo caractere que eles definiram no script expect

por exemplo

Eu quero executar esta linha do script de espera, a fim de alterar o endereço IP de 10.10.10.10 para 1.1.1.1

    expect #  {send "perl -i -pe 's/\Q10.10.10.10\E/1.1.1.1/' /etc/hosts\r"}

mas quando eu executo a tela de espera, na verdade, vejo essa linha em execução no console:

   [root@localhost ~]# perl -i -pe 's/Q10.10.10.10E/1.1.1.1/' /etc/hosts

preste atenção que a barra invertida antes de Q e antes de E foi Desaparecida

então eu me pergunto como escapar desses personagens de esperar script?

então, esperamos que ele execute a mesma linha no console da seguinte forma

   [root@localhost ~]# perl -i -pe 's/\Q10.10.10.10\E/1.1.1.1/' /etc/hosts
  • OBSERVAÇÃO defina uma barra invertida "\" antes que a barra invertida não ajude!

meu script:

 #!/bin/ksh

 #
 expect='cat << EOF
 set timeout -1
 spawn  ssh  192.9.200.10 
       expect {
                 ")?"   { send "yes\r"  ; exp_continue  }

                 word:  {send secret1\r}
              }
  expect #  {send "perl -i -pe 's/\Q10.10.10.10\E/1.1.1.1/' /etc/hosts\r"}
  expect #    {send exit\r}
  expect eof
  EOF'


  expect -c  "$expect" 

RESULTADOS (depois que eu corro meu script:)

   spawn ssh 192.9.200.10 
   root@'192.9.200.10 s password: 
   Last login: Sun Aug  4 22:46:53 2013 from 192.9.200.10 
    [root@localhost ~]# perl -i -pe 's/Q10.10.10.10E/1.1.1.1/' /etc/hosts
    [root@localhost ~]# exit
    logout

    Connection to 192.9.200.10  closed.
    
por maihabunash 04.08.2013 / 19:13

2 respostas

2

Não sei bem por que, mas você precisa de algumas fugas extras. Tente isto:

{send "perl -i -pe 's/\\\Q127.0.0.1\\\E/1.1.1.1/' /etc/hosts\r"}

Eu não tenho certeza sobre os detalhes, mas isso tem algo a ver com o script sendo executado i) através do shell, ii) através do expect e iii) através do Perl. Provavelmente, cada uma delas (ou uma combinação) precisa ter o \ escapado, e é por isso que você acaba precisando de tantos escapes aninhados.

De qualquer forma, como @slm mencionou em seu comentário, você realmente não precisa esperar por isso. Basta configurar sem senha ssh e depois simplesmente executar

ssh  192.9.200.10 perl -i -pe 's/\Q127.0.0.1\E/1.1.1.1/' /etc/hosts
    
por 04.08.2013 / 19:54
1

Em vez de fazer expect , você poderia fazer isso com apenas baunilha ssh e um HEREDOC:

#!/bin/bash

ssh -T ssh [email protected] <<\EOI
perl -i -pe 's/\Q10.10.10.10\E/1.1.1.1/' /etc/hosts
EOI

Eu não estou assim em ksh , mas isso deve ser facilmente adaptado a isso, se necessário. Também estou usando um par de chaves ssh para facilitar o login remotamente sem precisar alimentar uma senha.

    
por 04.08.2013 / 19:16