Linux Expect expect_out(buffer) ничего не содержит

Я пытался зафиксировать результат grep, войдя на удаленную машину, используя ssl в команде Expect. Я прочитал переменную «except_out (buffer)», чтобы содержать выходные данные порожденного процесса, но она казалась пустой ... Указатель был бы очень признателен!

#!/bin/bash

username=hoge
password=hoge
hostname=machine20

prompt="\[$username@$hostname ~\]$"

expect -c "
set timeout -1
spawn ssh -l $username $hostname
expect {
   \"$username@$hostname's password:\" {
  send \"$password\n\"
  } \"Are you sure you want to continue connecting (yes/no)?\" {
  send \"yes\n\"
  expect \"$username@$hostname's password:\"
  send \"$password\n\"
  }
}

expect \"$prompt\"
sleep 2

expect \"$prompt\"
send \"ps axuw | grep java | grep -vc grep\n\"

expect -re -indices \"(.*)\"
send \"echo result : $expect_out(buffer)\"

ожидаемая версия: 5.43.0


person pomme    schedule 22.04.2011    source источник
comment
Возможно, вас заинтересует это.   -  person Keith    schedule 22.04.2011
comment
Не избегайте всех этих двойных кавычек. Вы ожидаете подсказку два раза подряд, а между ними только сон — конечно же, это неправильно.   -  person glenn jackman    schedule 22.04.2011
comment
@glenn: Это потому, что все это в сценарии bash, что значительно усложняет ситуацию.   -  person Donal Fellows    schedule 22.04.2011


Ответы (1)


Этот код - настоящий беспорядок. В частности, у вас есть взаимодействия между bash и expect/tcl, которые вызывают у вас проблемы, потому что, когда bash видит $var для неизвестной ему переменной, он заменяет ее пустой строкой.

Хотя вы можете что-то обновить, изменив способ цитирования, на самом деле лучше переписать вещи, чтобы фактически использовать прямой сценарий expect/tcl, например:

#!/usr/bin/env expect

set username "hoge"
set password "hoge"
set hostname "machine20"

set prompt "\[$username@$hostname ~\]$"

set timeout -1
spawn ssh -l $username $hostname
expect {
    "$username@$hostname's password:" {
        send "$password\r"
    }
    "Are you sure you want to continue connecting (yes/no)?" {
        send "yes\r"
        exp_continue
    }
}

# These next two lines look suspicious, BTW...
expect "$prompt"
sleep 2

expect "$prompt"
send "ps axuw | grep java | grep -vc grep\r"

expect -re -indices "(.*)"
send "echo result : $expect_out(buffer)"

Однако я на самом деле настроил бы удаленный хост на использование ключей RSA для входа в систему (на самом деле, я бы настроил удаленный хост на только их использование, поскольку они гораздо устойчивы к атакам, чем пароли, и ими легче управлять), а затем просто сделайте это (с локальным grep, поэтому его не нужно фильтровать):

ssh $username@$host ps axuw | grep java
person Donal Fellows    schedule 22.04.2011
comment
Привет Донал, Спасибо за ваш комментарий. Это действительно помогло мне... Я, наконец, переписал этот код, используя ключи RSA, как вы сказали. - person pomme; 26.04.2011