Bash 期望脚本:在关闭ssh后执行操作
问题是在bash中的expect脚本中保存一个变量并在关闭ssh后执行操作 到目前为止,我得到的是:Bash 期望脚本:在关闭ssh后执行操作,bash,expect,Bash,Expect,问题是在bash中的expect脚本中保存一个变量并在关闭ssh后执行操作 到目前为止,我得到的是: echo "Getting package name..." getPackageName=$(expect -c ' exp_internal 1 log_user 1 global expect_out # puts "Getting package name..." spawn ssh -q -o StrictHostKeyChecking=no -o PreferredAuthen
echo "Getting package name..."
getPackageName=$(expect -c '
exp_internal 1
log_user 1
global expect_out
# puts "Getting package name..."
spawn ssh -q -o StrictHostKeyChecking=no -o PreferredAuthentications=password -o PubkeyAuthentication=no -o RSAAuthentication=no -l user 10.20.30.40
sleep 1
expect {
"*sword*" {
send "12341234\r"
}
timeout {
send_user "Error: timeout\n"
exit 1
}
}
expect {
"*user@*>*" {
# getting name of the latest modified file
send "cd /export/home/user/Releases/build/1.3.32.0 && find * -type f -printf '"'"'%T@ %p\\n'"'"' | sort -n | tail -1 | cut -f2- -d\" \"\r"
}
timeout {
send_user "Error: timeout\n"
exit 1
}
}
expect {
"BUILD_MAIN*" {
# assigning value to variable
set result_lines [split $expect_out(0,string) \r\n]
set package_filename [lindex $result_lines 0]
puts "package_filename: $package_filename"
}
timeout {
send_user "Error: timeout\n"
exit 1
}
}
expect "*#"
send "exit\r"
# here I need to perform some actions on local machine after ssh logout
expect "Connection*"
send "export LATEST_BUILD=$package_filename\r"
send_user "Message sent to user"
')
因此,在下面的代码块中,我试图在关闭ssh后在本地计算机上设置环境变量(最新的构建),并在那里粘贴一个变量值(package_filename),该值在ssh会话期间已定义
这里的要点是,我在输出中看到了最后一条“发送给用户的消息”,但之前的发送“导出最新版本=12345\r”显然不起作用
#!/bin/bash
getPackageName=$(expect -c '
# A common prompt matcher
set prompt "%|>|#|\\\$ $"
# To suppress any other form of output generated by spawned process
log_user 0
### Spawning ssh here ###
spawn ssh user@xxx.xx.xxx.xxx
expect "password"
send "welcome!2E\r"
expect -re $prompt
# Your further code
send "exit\r"
expect eof
##### The below segment is not needed ######
##### if your intention is to get only the 'package_filename' value #####
# spawn bash
# expect -re $prompt
# send "export LATEST_BUILD=54.030\r"
# expect -re $prompt
# send "echo \$LATEST_BUILD\r"
# expect -re $prompt
# send "exit\r"
# expect eof
#
##### The End ######
# Enabling logging now ...
log_user 1
# Print only the value which you want to return
puts "$package_filename"
')
echo $getPackageName
eof
用于识别文件结束事件,即连接关闭
注意:导出的变量LATEST_BUILD
仅可用于生成的bash会话
更新:
log\u user
用于随时关闭/打开由Expect
生成的日志记录
log_user 0; # Turn off logging
log_user 1; # Turn on logging
我希望您的唯一目的是获取
包\u文件名
。所以,我们甚至不需要生成bashshell。相反,只需最后打印该值,从而使其可供父bash脚本使用 ssh关闭后,send“export LATEST\u BUILD=$package\u filename\r”
将无法访问,因为您可能会收到spawn\u id not open
错误消息。您应该生成bash
shell。请注意,导出的变量只有在会话被Expect
关闭之前才可用。我不是bash专家。(其他人可以评论)。我不知道为什么由于expect
的错误,您没有获得命令替换的stderr
输出。您好,谢谢您的评论。您能否提供一个正确的代码示例?我一直在使用ssh的“exit\r”和“spawn bash-I”(以及其他一些spawn bash参数),但我的“send”在本地计算机上仍然没有任何作用。发送“退出\r”就足够了,还是我需要其他信息?整个过程就是向本地机器上的环境变量返回一些值。谢谢。嗨@nonrandom\u passer,如果这是你看到的最终结果,还有一种方法。由于您已经知道目标系统的凭据和路径,因此可以在远程计算机上创建该文件,并将其向后scp。关于您粘贴的代码,您能检查一下它是否有帮助吗?您希望得到提示($)而不是控制台消息(“连接*”)?您好@alok,您说得对,在远程机器上也有更多的方法来执行它,但我想在本地处理它。为了使代码更健壮,您可以根据超时事件和传递条件定义代码的退出状态。看一看,了解一下做类似工作的同一个。非常感谢。真的错过了eof。无法使导出的变量可用于父脚本的bash会话?您的意思是希望主bash脚本可以使用package\u filename
的值?是的,完全正确。就我所知,到目前为止,我也不知道如何返回多个值,而不是像任何分隔符(即逗号或空格)分隔的值那样返回它们,这些值将在父bash脚本中再次进一步解析。希望任何其他专家阅读本文,都能帮助我们。