3

不久前,我在askubuntu上发布了一个问题。由于没有任何动作,而且我还挖了一些,我会在这里尝试。可能是一个更正确的地方,(我不知道是否可以再提出问题(我没有得到任何这些选项))。

无论如何:

有没有办法获取 gnome-terminal 配置文件 ID?在 bash 脚本中需要它——例如——</p>

gconftool-2 "do some change to some value for current profile."

在我试图回答这个问题的过程中,我取得了一些进展——但没有令人满意的解决方案。老实说,它真的让我害怕应用程序是如何屏蔽从命令行作为终端仿真器进行修改的!对我来说这是不可理解的。

除了接触 gnome-terminal 的来源,(我不想要自定义版本),还有什么合法的方法可以得到这个吗?事实上,它是 vte 的包装器,它使用各种共享库,以某种我没有想到的方式,等等。

将一些 C 代码添加到混合中就可以了。

至今:

  • 我已经检查了“保存配置”选项,但因为它 1. 不令人满意,也就是 100%,并且 2. 更重要的是,这也被删除,它完全失败了。有关更多详细信息,请参见下面我自己的答案。

  • 这没有环境变量。

  • dbus:似乎没有任何消息传输或任何功能可用于此类信息。已测试当前(3.6.0)版本和最新开发。

  • 注入:虽然它是可能的,并且已经尝试向它注入自定义代码,但这是一个容易出错的尝试,它不是一个解决方案。

4

1 回答 1

2

如果有人想知道等等。

决定再看看这个 - 并取得了一些进展。

使用内置选项--save-config有以下感兴趣的属性:

Role=gnome-terminal-window-2587-1856448950-1359348087
ActiveTerminal=Terminal0xa896200
Geometry=110x87+900+1
WorkingDirectory=/home/xxx/tmp

仔细看。连续打开两个窗口,做了一个save-config

角色

我们可以将其拆分为各个部分:

gnome-terminal-window
2587
1856448950
1359348087

PID

2587两者都是一样的,很快pstree 2587 -p我们发现它是PID。此外,还可以echo $$找到我们的 bash(或任何一个更喜欢的)。

开始时间

现在第二个数字完全不同,这表明它可能是一个随机值。最后一个,tho,只有 diff 中的最后一个数字。很可能是时间戳。我知道我在这个tmp窗口的目录中——所以,通过我们对proc 文件系统的了解:

# btime: boot time, in seconds since the Epoch
$ cat /proc/stat | grep ^btime | cut -d' ' -f2
1359039155
# starttime: The time in jiffies the process started after system boot.
$ cat /proc/$$/stat | cut -d' ' -f22
30893222

# WANT: 1359348087
btime + starttime / Hertz
1359039155 + (30893222 / 100) = 1359348087.22 ~ 1359348087

好的。最后一位是 Epoch 开始的时间戳。但不幸的是,它不是 jiffies 和舍入的值,所以如果我们通过例如脚本启动了几个窗口,我们最终会得到相同的值。

(经过一些检查后,似乎秒数被四舍五入到最接近的值而不是零等)

随机值

好的。那么PID之后的值呢?很可能是一个随机值,但可以肯定的是。要检查这一点,我们必须去源头。

$ git clone git://git.gnome.org/gnome-terminal
$ gnome-terminal --version
GNOME Terminal 3.6.0

$ git log --grep="3\.6\.0"
commit f4d291a90dc4f513fc15f80fdebcdc3c3349b70a
...    
    Version 3.6.0

$ git checkout f4d291a90dc4f513fc15f80fdebcdc3c3349b70a

经过一番挖掘,我们发现:

# terminal-util.c
48: void
terminal_util_set_unique_role (GtkWindow *window, const char *prefix)
{
    char *role;

    role = g_strdup_printf(
        "%s-%d-%d-%d", 
        prefix, 
        getpid(), 
        g_random_int(), 
        (int) time (NULL)
    );
    gtk_window_set_role (window, role);
    g_free (role);
}

好的。我们不仅确认秒是随机值,而且确认 PI 和时间是正确的。

几何学

xwininfo -id $(xdotool getactivewindow) | \
grep '^\s*-geometry' | \
sed 's/^\s*[^ ]* \(.*\)/\1/'

# yields 110x87+900+1

好的。现在我们要检查三个值:

  • 时间
  • 几何学
  • 小路

问题是即使这样,我们也可以轻松地拥有两个具有相同值的窗口。更重要的是;一些天才决定从应用程序的选项中删除它。


终端窗口十六进制

进一步查看代码,发现ActiveTerminaletc. 中的十六进制值是指向当前窗口结构的内存中当前地址的指针值。如果不想破解内存映射,AKA 就不是很有用。

于 2013-01-28T05:57:07.510 回答