我想通过其标准输入/标准输出与(远程)非交互式外壳通信以运行多个命令并读取输出。问题是,如果我在 shell 标准输入上填充多个命令,我无法检测到各个命令输出之间的边界。
在类似 Python 的伪代码中:
sh = Popen(['ssh', 'user@remote', '/bin/bash'], stdin=PIPE, stdout=PIPE)
sh.stdin.write('ls /\n')
sh.stdin.write('ls /usr\n')
sh.stdin.close()
out = sh.stdout.read()
但显然out
包含连接的两个命令的输出,我无法可靠地拆分它们。
到目前为止,我最好的想法是\0
在输出之间插入字节:
sh.stdin.write('ls /; echo -ne "\0"\n')
sh.stdin.write('ls /usr; echo -ne "\0"\n')
然后我可以拆分out
零个字符。
其他对我不起作用的方法:
- 我不想为每个命令运行单独的 ssh 会话,因为握手太重了。
- 我不希望在创建的 shell 上强制 ControlMaster 选项尊重最终用户的 ssh_config。
- 我宁愿不需要要求用户安装特定的服务器程序。
有没有更好的方法在一个会话中运行多个命令并获得单独的输出?是否存在具有某种二进制输出模式的广泛部署的 shell?
PS。有一个重复的问题,但没有令人满意的答案: Run multiple commands in a single ssh session using popen and save the output in separate files