Bash 期望脚本:在关闭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

问题是在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 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脚本中再次进一步解析。希望任何其他专家阅读本文,都能帮助我们。