代码之家  ›  专栏  ›  技术社区  ›  zneak

有没有一种方法可以将数据发送到macos下另一个进程的标准输入?

  •  5
  • zneak  · 技术社区  · 15 年前

    我想知道是否有一个API,不管它多么晦涩难懂,允许某人将数据发送到另一个进程的 stdin /proc 访问这些流(当然,使用正确的权限)。

    5 回复  |  直到 15 年前
        1
  •  5
  •   Alex Martelli    15 年前

    不幸的是,我不相信你能做到这一点——MacPorts都是用户区,你所需要的操作需要(或者有很多技巧,见下文,或者)内核协作,我相信,这是不可能实现的。例如, Mac OSX Internals, a System Approach 在关于文件描述符传递的部分中,说

    描述符是进程的本地描述符 获得 尤其是进程a无法访问 通过简单地使用 在中表示该文件的描述符 B。

    然后继续描述FD是如何发送的。

    “欺骗”部分将要求您在另一个进程中运行一些代码(在userland中或作为内核的一部分)。

    要在内核级实现这一点,需要对内核代码本身或内核加载的代码进行类似的修补 以完整的、未经验证的信任运行(因此它们可以劫持不相关进程的文件描述符表条目)--我确实希望Mac OS X中没有这样的代码路径(因为它们的主要用途无疑是病毒、特洛伊木马和其他各种恶意软件),但是,如果有并且您可以找到它们,这可能是比修补每个感兴趣的二进制可执行文件更通用的解决方案。

    回到userland,另一种相当通用的方法可能是修补所有感兴趣的进程加载的动态加载库,而不是修补各个进程的几个可执行文件。

        2
  •  6
  •   extraneon    15 年前

    大概有点像

    mkfifo MYPIPE
    Prog < MYPIPE
    echo "test" > MYPIPE
    
        3
  •  5
  •   Jasha    10 年前

    here .

    例如,假设您正在终端ttys000上运行“cat”命令。

    在端子1上:

    $ tty
    /dev/ttys000
    $ cat
    

    $ sudo ./writevt /dev/ttys000 'Hello!^M'
    

    ^M 上面是一个控制字符。在我的mac上,你可以通过键入 Ctrl-V 然后 Ctrl-<enter> .

    以下是1号航站楼的结果:

    $ tty
    /dev/ttys000
    $ cat
    Hello!
    Hello!
    

    $ gcc -o writevt writevt.c 
    
        4
  •  1
  •   JulesLt    15 年前

    假设它是有用户权限的(例如,你想从第三方应用程序中捕获信息,重定向到另一个应用程序,比如Rogue Amoeba的音频应用程序或一些视频流捕获应用程序),那么我会说你要么想看内核扩展,要么想看输入管理器。

    (另请参阅fscript anywhere、SIMBL和Application Enhancer—所有将功能注入第三方应用程序的软件示例)。

    如果您对用户输入而不是stdin感兴趣,那么替换的输入法工具包实际上可能“足够好了”--经典地说,输入管理器已经被用来将各种代码注入到应用程序中。

        5
  •  0
  •   Kaelin Colclasure    15 年前

    从技术上讲,您可以将线程注入目标进程,然后让它将stdin文件描述符的dup发送回您,但您可能不应该这样做