如何用Python通过串口发送Ctrl+D指令配置Juniper路由器
解决Juniper配置脚本中发送Ctrl+D(^D)的问题
我之前写串口自动化脚本时也碰到过一模一样的问题!Ctrl+D对应的是ASCII里的**End of Transmission (EOT)**字符,它的十进制编码是4,Python里根本不认识\EOT这种转义写法,这就是你代码执行到这里挂起的核心原因。
正确的实现方式
你有两种可靠的方法来发送这个字符:
- 使用
chr(4)生成对应的ASCII字符,直接传给ser.write() - 直接发送字节串
b'\x04'(串口通信场景下用字节形式通常更稳妥,避免编码问题)
修改后的代码片段
另外我注意到你代码里有个小笔误:ser.write(text + '/r')里的/r应该是\r,这个也一起修正了:
ser.write ('root\r\n') time.sleep(5) ser.write ('cli\r\n') ser.write('configure\r\n') ser.write('top\r\n') ser.write('load set terminal\r\n') file = open('REDACTED', 'r+') text = file.read() ser.write(text + '\r') # 修正了这里的/r为\r ser.write('\n') ser.write(chr(4)) # 替换原来的\EOT,用ASCII码4对应的字符 # 或者用字节形式:ser.write(b'\x04') ser.write('commit and-quit\r\n')
补充说明
当你在终端里按Ctrl+D时,本质就是向设备发送了ASCII码为4的字符,所以直接发送这个编码对应的内容就能正确触发传输结束的指令,不会再出现挂起的问题了。
内容的提问来源于stack exchange,提问作者Cwhelden
相关产品推荐
相关产品推荐

