我经常编写脚本,这也可以通过图形用户界面来完成。一次完成,使用 gui 就很容易。要经常这样做,使用脚本要快得多。
(几乎)所有 GUI 应用程序都使用底层 cli 应用程序。例如,切换桌面分辨率很可能会引发 xrandr 调用。
或者 GUI 单击只是更改一些底层配置文件,这同样有趣。
阅读 cli 文档并找出相同的结果需要时间。可以改进吗?
我的意思是,我可以记录 Linux 上任何 GUI 单击的底层 CLI 调用吗?
(几乎)所有 GUI 应用程序都使用底层 cli 应用程序。
这是不真实的。大多数应用程序都在自己的代码或其他库中调用函数。在 Nautilus 中删除文件不会运行
rm(1)
,而是调用 unlink(2)
(请参阅 man 2 unlink
)。使用 xrandr 函数的程序应使用 Xrandr(3)
而不是 xrandr(1)
。产生另一个进程来处理此类任务是缓慢、浪费且丑陋的。
不过,您也许可以使用 auditd 捕获相关详细信息。
strace 是一个非常有价值的工具。当您给它适当的标志时,这使您可以看到哪些文件正在更改以及正在写入什么。
参见:http://www.hokstad.com/5-simple-ways-to-troubleshoot-using-strace.html
如果 GUI 只是按照其他答案的建议调用程序,您将会看到它。如果您正在寻找 dbus 和应用程序之间的网络交互,您也会看到这一点。还将看到对套接字文件的访问。
最好使用 netstat -nlp 来找出各个守护进程正在使用哪些端口,以便您可以轻松跟踪交互。
如果您感兴趣的是网络流量,tcpdump 当然是答案。
这是我曾经用来深入了解传递给 CLI 命令的参数的一个廉价技巧:
在~/bin
等特定位置创建一个
可执行脚本,打印出命令行参数:
#!/bin/sh
echo $@
exit 0
将其命名为与您要模拟的 CLI 可执行文件相同的名称。现在,因为可能有两个同名的可执行文件,所以 bash 将按照 PATH 环境变量中指定的顺序执行它找到的第一个可执行文件。
也就是说,暂时更改您的 PATH 以在任何其他路径之前包含
~/bin
:
export PATH="$HOME/bin:$PATH"
现在在具有更改的 PATH 的终端中运行 GUI 应用程序,将调用您的脚本而不是原始的 CLI 可执行文件。您的脚本将打印出传递的所有参数。
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
我昨天才使用这个技巧来尝试
理解mk4ht
在做什么
/tmp
的子目录中运行第一个命令序列。
指的是旧版本)内核)!
正如之前的发帖者所回答的那样,您可能能够以某种方式拦截 CLI 应用程序的消息,但我怀疑这就是您所指的内容。除了使用库来拦截您想要测试的软件底层库的工作之外,您无法跟踪每个操作 - 然后您将获得库调用列表,而不是带有参数的 CLI 应用程序。