如何通过生成的telnet会话发送转义字符^]?

7

我能够在shell脚本中打开一个生成的telnet会话以运行一些命令。之后,我尝试使用send发送转义字符(请参见下面的语法),但它从未到达我能够关闭会话的部分。有人能指点我正确的方向吗?由于这个问题,我通过这种方式打开多个telnet会话,这不是我想要的。

send "^]\r"
expect "telnet>"
send "close\r"
close $spawn_id 

http://donsnotes.com/tech/charsets/ascii.html#cntrl - user2840240
3个回答

10

3
谢谢您的回复,它为我指明了正确的方向。我发现x1d\r会打印出^],这正是我需要的。 - user2840240
2
\r 真的必要吗? - potrzebie
@potrzebie 这取决于你之后想要发送什么。所以,不行。 :-) - Donal Fellows

2

我过去几天一直在尝试解决这个问题,最终找到了解决方案 :)

\x1b\r\x1d\r 对我没用。我在这里找到了解决方案:使用 tr 和 echo 命令在脚本中使用控制字符

我使用了以下代码:

escseq=`echo 'e' | tr 'e' '\035'`

使用$escseq获取Ctrl +]。

工作原理:

如果您的echo无法直接生成控制字符,则tr实用程序可以为您完成此操作。tr也理解八进制序列。使您的echo输出您不需要的字符,并让tr将它们转换为您需要的控制字符。

例如,要生成4个字符的序列ESCape CTRL-a [ CTRL-w,请使用以下命令:

escseq=`echo 'ea[w' | tr 'eaw' '\033\001\027'`
命令从echo管道中读取四个字符;它将“e”转换成ESCape(八进制033),将“a”转换成CTRL-a(八进制001),将“w”转换成CTRL-w(八进制027)。左括号不变; tr按原样打印。

注意:如果要使用shell脚本自动注销telnet会话,则此功能非常有用。


我尝试了这个方法,对我来说效果非常好。在expect中,执行set escseq "echo 'e' | tr 'e' '\035'" - harperville

1

CTRL+R代表着"^]"转义序列,用于退出telnet。


这并没有回答问题。OP无法以编程方式发送CTRL+R,而现有的已接受答案实际上提供了解决方案。 - LordWilmore
2
发布回答后不久意识到这一点。我仍然希望答案能够在这里,以防有人因其他原因意外地发现它有用。 - A.K.M.Shafiqul Islam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接