如何在Linux上记录GUI点击的底层CLI操作?

问题描述 投票:0回答:6

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

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

或者 GUI 单击只是更改一些底层配置文件,这同样有趣。

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

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

user-interface command-line-interface
6个回答
5
投票

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

这是不真实的。大多数应用程序都在自己的代码或其他库中调用函数。在 Nautilus 中删除文件不会运行

rm(1)
,而是调用
unlink(2)
(请参阅
man 2 unlink
)。使用 xrandr 函数的程序应使用
Xrandr(3)
而不是
xrandr(1)
。产生另一个进程来处理此类任务是缓慢、浪费且丑陋的。

不过,您也许可以使用 auditd 捕获相关详细信息。


3
投票

strace 是一个非常有价值的工具。当您给它适当的标志时,这使您可以看到哪些文件正在更改以及正在写入什么。

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

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

最好使用 netstat -nlp 来找出各个守护进程正在使用哪些端口,以便您可以轻松跟踪交互。

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


0
投票

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

~/bin等特定位置创建一个

可执行
脚本,打印出命令行参数:

#!/bin/sh
echo $@
exit 0

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

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

~/bin

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

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


0
投票
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

的子目录中运行第一个命令序列。

    


0
投票
主要

指的是旧版本)内核)! 正如之前的发帖者所回答的那样,您可能能够以某种方式拦截 CLI 应用程序的消息,但我怀疑这就是您所指的内容。除了使用库来拦截您想要测试的软件底层库的工作之外,您无法跟踪每个操作 - 然后您将获得库调用列表,而不是带有参数的 CLI 应用程序。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.