gpt4 book ai didi

bash - 在 Bash 脚本中期望 : expect_out not printing out buffer

转载 作者:行者123 更新时间:2023-11-29 09:29:01 25 4
gpt4 key购买 nike

我试图通过登录交换机来捕获“dir”命令的输出,但我无法这样做。我在 Bash 中使用 Expect。我正在使用 expect_out 在缓冲区中捕获该命令的输出并将其打印出来。实际上我想捕获输出并对其执行一些操作。

脚本:

#!/bin/bash
expect -c "
spawn telnet 1.1.1.1 2000
sleep 1
send \"\r\"
send \"\r\"
expect {
Prompt> { send \"dir\r\" }
}
set output $expect_out(buffer)
"
echo "$output"

输出:

spawn telnet 1.1.1.1 2000
Trying 1.1.1.1...
Connected to 1.1.1.1 (1.1.1.1).
Escape character is '^]'.




Prompt>

Prompt>

显示这些提示后,脚本就退出了。我该如何解决这个问题?

拆分后,我可以使用参数替换和单引号。现在我面临着不同的错误。

脚本:

expect -c "
spawn telnet $IP $PORT1
sleep 1
send \"\r\"
send \"\r\"
"
expect -c '
expect {
Prompt> { send \"dir\r\" }
set output $expect_out(buffer)
puts "$output"
}
'

输出:

spawn telnet 172.23.149.139 2033
can't read "expect_out(buffer)": no such variable
while executing
"expect {
Prompt> { send \"dir\r\" }
set output $expect_out(buffer)
puts "$output"
}
"

我根据建议改成了。但我仍然面临错误。

脚本:

output=$(expect -c '
spawn telnet '"$IP $PORT1"'
sleep 1
send '"\r"'
send '"\r"'

expect Prompt> { send '"dir\r"' }
expect '"\n"'
expect -indices Prompt>
puts '"[string range $expect_out(buffer) 0 [expr $expect_out(0,end) - 1]]"'

')

echo "======="
echo "$output"
echo "======="

输出:

syntax error in expression "(0,end) - 1"
while executing
"expr (0,end) - 1"
invoked from within
"string range (buffer) 0 [expr (0,end) - 1]"
invoked from within
"puts [string range (buffer) 0 [expr (0,end) - 1]]"

=======
spawn telnet 1.1.1.1 2000
Trying 1.1.1.1...
Connected to 1.1.1.1 (1.1.1.1).
Escape character is '^]'.




Prompt>

Prompt>
=======

因此为了避免错误,我更改了行

puts '"[string range $expect_out(buffer) 0 [expr $expect_out(0,end) - 1]]"'

puts '"$expect_out(buffer)"'

但是我没有得到任何错误,但是 dir 的输出也没有被打印出来。像这样的东西:

Prompt>

Prompt> (buffer)

最佳答案

您的第二个“拆分”Expect 程序无权访问派生的 telnet 进程。当你这样拆分它们时,你使它们独立(一个不能访问另一个的变量或状态;实际上,当第二个启动第一个及其telnet进程时,不不再存在)。


shell 将自动连接任何字符串(未被未加引号/未转义的空格分隔),而不考虑它们使用的引号类型(如果有)。这意味着您可以开始将 Expect 程序的第一部分放在单引号中,切换到双引号以替换参数,然后返回到程序其余部分的单引号(以避免必须转义任何 "在您的 Expect 代码中出现的 $\`

expect -c '
spawn telnet '"$HOST $PORT"'
sleep 1
⋮ (rest of Expect program)
'

它使用单引号来保护大部分程序,但切换回双引号让 shell 将其 HOST 和 IP 参数替换为 Expect 程序的文本。


接下来,启动expect 的shell 无法访问Expect 程序内部的变量集。从子进程收集输出的正常方法是让它写入 stdout 或 stderr,然后让 shell 通过命令替换 ($()) 收集输出。

在 Tcl(和 Expect)中,您可以使用 puts 将字符串发送到 stdout。但是,默认情况下,Expect 还将向 stdout 发送正常的“交互”输出(它从任何生成的命令接收的内容以及它发送给它们的内容;即,如果您手动运行生成的命令,您会看到什么)。您可以使用 log_user 0 禁用此默认日志记录。

你可以这样写你的程序:

#!/bin/sh
output=$(expect -c '
# suppress the display of the process interaction
log_user 0

spawn telnet '"$HOST $PORT"'
sleep 1
send "\r"
send "\r"
# after a prompt, send the interesting command
expect Prompt> { send "dir\r" }
# eat the \n the remote end sent after we sent our \r
expect "\n"
# wait for the next prompt, saving its position in expect_out(buffer)
expect -indices Prompt>

# output what came after the command and before the next prompt
# (i.e. the output of the "dir" command)
puts [string range $expect_out(buffer) \
0 [expr $expect_out(0,start) - 1]]
')
echo "======="
echo "$output"
echo "======="

关于bash - 在 Bash 脚本中期望 : expect_out not printing out buffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5589577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com