User interface 如何记录Linux上GUI单击的底层CLI操作?

User interface 如何记录Linux上GUI单击的底层CLI操作?,user-interface,command-line-interface,User Interface,Command Line Interface,我经常编写脚本,这也可以通过图形用户界面来完成。要做到这一点,使用gui很容易。要经常这样做,使用脚本要快得多 (几乎所有gui应用程序都使用底层cli应用程序。例如,切换桌面分辨率很可能会发出xrandr调用 或者一个gui点击仅仅改变一些底层的配置文件,这同样有趣 阅读cli文档并找出相同的结果需要时间。这能改进吗 我的意思是,我可以记录Linux上任何GUI点击的底层CLI调用吗 (几乎所有gui应用程序都使用底层cli应用程序 这是不真实的。大多数应用程序在自己的代码或其他库中使用函数调

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

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

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

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

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

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

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


尽管如此,您仍然可以使用捕获相关详细信息。

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

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

#!/bin/sh
echo $@
exit 0
将其命名为与要模拟的CLI可执行文件相同的名称。现在,由于可以有两个同名的可执行文件,bash将按照PATH环境变量中指定的顺序执行它找到的第一个可执行文件

也就是说,临时更改路径,使其在任何其他路径之前包含
~/bin

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

现在,在终端内以更改后的路径运行GUI应用程序,将调用脚本而不是原始CLI可执行文件。您的脚本将打印出任何传递的参数。

strace是一个非常有价值的工具。这使您可以在指定适当的标志时查看哪些文件正在更改,哪些文件正在写入

见:

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

最好也使用netstat-nlp来找出各个守护进程使用的端口,这样您就可以轻松地跟踪交互


如果你感兴趣的是网络流量,tcpdump当然是答案。

我不确定这是你想要的,但有时我会用这个技巧来了解幕后发生的事情。首先,我开始在循环中捕获
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
就在昨天,我使用了这个技巧来尝试


嗯,如果您在
/tmp
的子目录中运行第一个命令序列,那么您从一个不完全正确的级别来看待问题会更好。您所谓的“CLI应用程序”实际上是任何使用标准i/o流而没有GUI的软件。CLI应用程序,作为基于GUI的应用程序或web服务器,是一个前端,具有一些执行库和内核调用的逻辑。您可能有一个应用程序使用xrandr更改分辨率。相反,您可能会有一个应用程序通过使用X协议库来实现这一点,或者有一个应用程序使用X协议来实现这一点,或者甚至有一个应用程序使用内核调用来改变分辨率(这里我主要指的是较旧的内核)

正如前面的海报所回答的那样,您可能能够以某种方式截获到CLI应用程序的消息,但我怀疑您所指的是什么。除了使用库拦截要测试的底层软件库的工作之外,您无法跟踪每个操作,然后您将获得库调用列表,而不是带有参数的CLI应用。

比我所能做的更好。您完全正确,这些通常是图形程序源中与系统其他部分交互的API调用。