ajuda com o script expect, executa cat on remote comp e obtém a saída dele para a variável

3

Eu tenho um script bash + expect que tem que conectar via ssh à comp remota, ler o arquivo lá, encontrar uma linha específica com o "hostname" (como "hostname aaaa1111") e armazenar este nome na variável a ser usado depois de um tempo. Como posso obter o valor do parâmetro "hostname"? Eu pensei que o conteúdo da linha estaria na variável $ expect_out (buffer) (para que eu possa digitalizar e analisar), mas não é. Meu script é:

    #!/bin/bash        
    ----bash part----
    /usr/bin/expect << ENDOFEXPECT
    spawn bash -c "ssh root@$IP"  
    expect "password:"
    send "xxxx\r"
    expect ":~#"
    send "cat /etc/rc.d/rc.local |grep hostname \n"
    expect ":~#"
    set line $expect_out(buffer)
    puts "line = $line, expect_out(buffer) = $expect_out(buffer)"
    ...more script...
    ENDOFEXPECT

Aqui link , há um exemplo:

    # Send the prebuilt command, and then wait for another shell prompt.
    send "$my_command\r"
    expect "%"
    # Capture the results of the command into a variable. This can be displayed, or written to disk.
    set results $expect_out(buffer)

parece que não funciona neste caso, ou o que há de errado com o script?

    
por lugger1 11.08.2011 / 21:44

2 respostas

3

Em primeiro lugar, seu heredoc age como uma string com aspas duplas, então a variável $expect_out está sendo substituída pelo shell antes de expect iniciar. Você precisa garantir que seu heredoc não esteja sendo tocado pela casca. Portanto, quaisquer variáveis do shell precisam ser buscadas de uma maneira diferente. Aqui, estou assumindo que IP é uma variável de shell e estou transmitindo para o ambiente.

export IP
/usr/bin/expect << 'ENDOFEXPECT'
  set prompt ":~#"
  spawn ssh root@$env(IP)  
  expect "password:"
  send "xxxx\r"
  expect $prompt
  send "grep hostname /etc/rc.d/rc.local \n"
  expect $prompt
  set line $expect_out(buffer)
  ...more script...
ENDOFEXPECT
    
por 12.08.2011 / 19:51
3

Por que você está esperando por isso?

ssh -i ssh_private_key root@${IP} "grep -E -o 'hostname.*$' /etc/rc.d/rc.local"
    
por 11.08.2011 / 21:55

Tags