Linux Expect Expect_out (буфер) ничего не содержит - PullRequest
0 голосов
/ 22 апреля 2011

Я пытался перехватить результат grep, войдя на удаленный компьютер, используя команду ssl в Expect. Я прочитал переменную "exception_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

1 Ответ

1 голос
/ 22 апреля 2011

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

В то время как вы могли бы обновлять вещи, изменяя то, как вы делаете кавычки, на самом деле лучше переписать вещи, чтобы фактически использовать скрипт прямого ожидания / 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
...