期望脚本:关闭 ssh 后执行操作

Expect script: to perform actions after closing ssh

问题是在 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 后在本地计算机上设置环境变量 (LATEST_BUILD),并在其中粘贴一个变量值 (package_filename)之前在 ssh 会话期间已定义。

这里的重点是我在输出中看到了最后的"Message sent to user",但是前面的send"export LATEST_BUILD=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_user用于随时打开off/on由Expect生成的日志记录。

log_user 0; # Turn off logging
log_user 1; # Turn on logging

我希望你的唯一目的是得到package_filename。所以,我们甚至不需要生成 bash shell。相反,只需打印最后的值,从而使其可用于父 bash 脚本。