【问题标题】:How to record the underlying CLI action for GUI clicks on Linux?如何记录 Linux 上 GUI 点击的底层 CLI 操作?
【发布时间】:2012-10-06 18:47:42
【问题描述】:

我经常编写脚本,这也可以通过图形用户界面来完成。做一次,很容易使用 gui。要经常这样做,使用脚本要快得多。

(几乎)所有 gui 应用程序都使用底层 cli 应用程序。例如,切换桌面分辨率很可能会引发 xrandr 调用。

或者一个 gui 点击只是改变一些底层配置文件,这同样有趣。

阅读 cli 文档并找出相同的结果需要时间。可以改进吗?

我的意思是,我可以为 Linux 上的任何 GUI 点击记录底层 CLI 调用吗?

【问题讨论】:

    标签: user-interface command-line-interface


    【解决方案1】:

    (几乎)所有 gui 应用程序都使用底层 cli 应用程序。

    这是不真实的。大多数应用程序在自己的代码或其他库中使用对函数的调用。在 Nautilus 中删除文件不会运行rm(1),而是调用unlink(2)(请参阅man 2 unlink)。使用 xrandr 函数的程序应该使用Xrandr(3) 而不是xrandr(1)。生成另一个进程来处理此类任务是缓慢、浪费和丑陋的。

    不过,您可以通过auditd 获取相关详细信息。

    【讨论】:

    • 放得比我想象的要好。你是绝对正确的,这些通常是 API 调用在图形程序的源代码中,它们与系统的其他部分交互。
    【解决方案2】:

    一个非常有价值的工具是 strace。这允许您在给它适当的标志时查看哪些文件正在更改以及正在写入的内容。

    见:http://www.hokstad.com/5-simple-ways-to-troubleshoot-using-strace.html

    如果 GUI 只是按照其他答案的建议调用程序,您会看到它。如果您正在寻找 dbus 和应用程序之间的网络交互,您也会看到这一点。还将看到对套接字文件的访问。

    还可以使用 netstat -nlp 来找出各个守护程序正在使用的端口,以便您轻松跟踪交互。

    如果您对网络流量感兴趣,tcpdump 无疑是答案。

    【讨论】:

      【解决方案3】:

      这是我曾经用来深入了解传递给 CLI 命令的参数的一个廉价技巧:

      在特定位置(如~/bin)创建一个可执行脚本,用于打印命令行参数:

      #!/bin/sh
      echo $@
      exit 0
      

      将其命名为与您要模仿的 CLI 可执行文件相同的名称。现在因为可能有两个同名的可执行文件,bash 将按照 PATH 环境变量中指定的顺序执行它找到的第一个可执行文件。

      也就是说,暂时更改您的 PATH 以在任何其他路径之前包含 ~/bin

      export PATH="$HOME/bin:$PATH"
      

      现在运行 GUI 应用程序带有更改的 PATH 的终端,将调用您的脚本,而不是原来的 CLI 可执行文件。您的脚本将打印出所有传递的参数。

      【讨论】:

        【解决方案4】:

        我不确定这是否是您所要求的,但有时我会使用此技巧来了解幕后发生的事情。首先,我开始循环捕获ps afxu 的输出:

        counter=0 ; while (true) ; do ps afxu > ps-afxu-capture-step-$counter ; echo "Capturing step $counter..." ; sleep 0.01 ; counter=$((counter + 1)); done
        

        然后我diff捕获的“帧”看看有什么变化:

        for i in `seq 1 100` ; do diff ps-afxu-capture-step-$i ps-afxu-capture-step-$((i+1)) ; done > ps-afxu-capture-diff.txt
        

        我昨天才用这个技巧尝试understand what mk4ht was doing

        嗯,最好在/tmp 的子目录中运行第一个命令序列。

        【讨论】:

          【解决方案5】:

          您从不完全正确的角度看待问题。您所谓的“CLI 应用程序”实际上是任何使用标准 i/o 流而没有 GUI 的软件。 CLI 应用程序,作为基于 GUI 的应用程序或 Web 服务器是具有一些执行库和内核调用的逻辑的前端。您可能有一个使用 xrandr 更改分辨率的应用程序。相反,您可能有一个应用程序通过使用一些围绕 X 协议的库来执行此操作,或者使用 X 协议执行此操作的应用程序,甚至是一个使用内核调用来更改分辨率的应用程序(这里我 主要是 em> 指的是旧内核)!
          正如以前的海报所回答的那样,您可能能够以某种方式拦截到 CLI 应用程序的消息,但我怀疑这就是您所指的。除了使用库拦截您想要测试的软件底层库的工作之外,您无法跟踪每个操作 - 然后您将获得库调用列表,而不是带有参数的 CLI 应用程序。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-22
            • 1970-01-01
            相关资源
            最近更新 更多