使用expect时引用HEREDOC和文件有什么区别

问题描述 投票:0回答:1

我有一个脚本,可以使用 Expect 通过 ssh 连接到服务器并发出一些命令。

当我以 HEREDOC 形式运行 Expect 脚本时,输入密码后,它会通过生成的 shell 以 eof 退出,另一方面,当我运行与文件完全相同的脚本时,它会给我一个 shell,这是怎么回事?

我尝试使用这个片段:

expect -d /dev/stdin <<- END
sleep 10
set timeout 20
eval spawn "ssh [email protected]"

expect "[email protected]'s password: " { send -- "Passw0rd\r" }

interact
END

但是每次我尝试连接时,我都会收到“收到的 eof”,并期望退出,没有 shell。

expect: does "\[email protected]'s password: " (spawn_id exp6) match glob pattern "rmh@[email protected]'s password: "? yes
expect: set expect_out(0,string) "rmh@[email protected]'s password: "
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "\rrmh@[email protected]'s password: "
send: sending "Passw0rd\r" to { exp6 }
interact: received eof from spawn_id exp0

另一方面,当我打开与文件完全相同的脚本时,我会进行连接。

cat <<- END > interact.expect
sleep 10
set timeout 20
eval spawn "ssh ssh [email protected]"

expect "[email protected]'s password: " { send -- "Passw0rd\r" }

interact
END

expect -d interact.expect

我尝试了多次并仔细检查了脚本是否相同。

有人可以解释一下这是怎么回事吗?

bash expect
1个回答
1
投票

区别在于当您到达

interact
语句时会发生什么。这告诉
expect
将其标准输入连接到提供给当前命令的 pty。

expect
从文件中读取时,其
stdin
仍连接到终端,因此
interact
将允许您使用终端与命令进行交互。

但是当您使用here-doc时,

stdin
连接到here-doc,
expect
进程失去了终端连接。因此
expect
得到 EOF,因为您已到达此处文档的末尾。

如果您使用重定向从文件中读取而不是使用文件名参数,您会看到同样的结果:

expect -d /dev/stdin < interact.expect
© www.soinside.com 2019 - 2024. All rights reserved.