#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, как вы сказали.