Linux Ожидает, что expect_out (буфер) ничего не содержит

#bash #ssh #tcl #expect #sh

#bash #ssh #tcl #ожидать #sh

Вопрос:

Я пытался зафиксировать результат 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 "$passwordn"
  } "Are you sure you want to continue connecting (yes/no)?" {
  send "yesn"
  expect "$username@$hostname's password:"
  send "$passwordn"
  }
}

expect "$prompt"
sleep 2

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

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

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

Комментарии:

1. Возможно, вас заинтересует это .

2. Не экранируйте все эти двойные кавычки. Вы ожидаете приглашение два раза подряд, а между ними только режим ожидания — конечно, это неправильно

3. @glenn: Это потому, что все это в скрипте bash, что значительно усложняет работу.

Ответ №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 "$passwordr"
    }
    "Are you sure you want to continue connecting (yes/no)?" {
        send "yesr"
        exp_continue
    }
}

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

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

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

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

 ssh $username@$host ps axuw | grep java
  

Комментарии:

1. Привет, Донал, спасибо за ваш комментарий. Это действительно помогло мне… Я, наконец, переписываю этот код, используя ключи RSA, как вы сказали.