Paramiko执行hex命令报错:需-b参数及批处理启动程序问题咨询
解决hex命令批处理模式的启动程序问题
让我们一步步拆解你的问题,帮你理清报错原因和解决方向:
先理解两个报错的本质
第一个报错:
Redirection or piping of stdin or stdout is allowed only with -b
这个错误很明确:你使用-p参数时,尝试通过stdin.write('test')给hex命令传输入,但-p模式不支持标准输入的管道/重定向操作。hex命令要求如果要做这种输入输出的重定向,必须切换到批处理模式(即使用-b参数)。第二个报错:
Batch-mode X requires a startup procedure
当你切换到-b批处理模式后,hex命令需要一个启动程序/脚本来定义整个批处理的操作流程——它不会直接读取你通过stdin传入的零散输入,而是需要一个结构化的指令文件来告诉它该做什么。
解决方向一:找到批处理模式的启动程序要求
你可以通过以下几种方式获取启动程序的规范:
- 查看hex命令的内置帮助:在远程服务器上执行
hex -h或者hex --help,重点关注-b参数的说明部分,里面通常会明确启动程序的格式、命名规则或者示例。 - 查阅man手册:如果hex命令有官方手册,执行
man hex,搜索“batch mode”或者“-b”相关章节,这里会详细说明启动程序的结构(比如需要包含哪些指令、如何处理输入输出)。 - 寻找同目录的示例文件:检查你的
database_list.pf所在目录,或者hex命令的安装目录,有没有类似batch_sample.p、startup_example.proc这类后缀的文件,它们大概率是官方提供的启动程序示例,直接参考写法即可。
解决方向二:正确使用批处理模式(常规做法)
通常来说,hex的批处理启动程序是一个包含一系列操作指令的文本文件,比如:
# 示例启动程序内容(假设后缀为.p) # 定义输入内容 INPUT test # 指定要处理的文件 PROCESS /path/to/another_file.p # 输出结果到指定文件 OUTPUT /path/to/result.txt
然后你需要把这个启动程序的路径作为参数传给-b,修改后的hex命令应该是:
/path/to/hex_file/hex -h 35 -cpterm iso8859-1 -cpstream ibm850 -pf /path/to/databases_list/database_list.pf -b /path/to/your_startup_procedure.p
这样hex命令会加载这个启动程序,按照里面的指令自动执行,无需再通过stdin传输入。
解决方向三:通过stdin直接传入启动指令(替代方案)
有些工具的批处理模式允许用-作为启动程序路径,来直接读取stdin中的指令。你可以尝试修改hex命令为:
/path/to/hex_file/hex -h 35 -cpterm iso8859-1 -cpstream ibm850 -pf /path/to/databases_list/database_list.pf -b -
然后在你的Paramiko脚本中,传入符合格式的启动指令,记得刷新缓冲区:
command = "cd /path/to/command_file; sh command;" stdin, stdout, stderr = ssh.exec_command(command) # 传入批处理指令,每条指令换行结尾 stdin.write('INPUT test\nPROCESS /path/to/another_file.p\n') stdin.flush() # 必须刷新,确保指令被发送到远程进程 lines = stdout.readlines() print(lines) ssh.close()
注意:这种方式需要确保你传入的指令完全符合hex批处理模式的语法要求,否则还是会报错。
内容的提问来源于stack exchange,提问作者ThRnk
相关产品推荐
相关产品推荐

