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