3

しばらく前にaskubuntuに質問を投稿しました。アクションがなく、もう少し掘り下げたので、ここで試してみます。おそらくもっと正しい場所です(そして、質問をこれ以上移動できるかどうかはわかりません(これらのオプションはありません))。

とにかく:

gnome-terminalプロファイルIDを取得する方法はありますか?bashスクリプトでそれを必要とする–例えば– </ p>

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

これに対する答えを目指して、私はある程度の進歩を遂げましたが、満足のいく解決策はありませんでした。正直なところ、ターミナルエミュレーターであるコマンドラインからの変更からアプリケーションがどれほど保護されているかを本当に怖がらせます。私にはそれは理解できません。

gnome-terminalのソースに触れる以外に(カスタムバージョンは必要ありません)、これを取得するための合法的な方法はありますか?これはvteのラッパーであるため、さまざまな共有ライブラリを使用します。これは、私が思いもよらなかった方法などです。

ミックスにCコードを追加しても問題ありません。

ここのところ:

  • 「save-config」オプションをチェックアウトしましたが、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

よく見てください。短い連続で2つのウィンドウを開き、を実行しましたsave-config

役割

さまざまな部分に分割できます。

gnome-terminal-window
2587
1856448950
1359348087

PID

2587どちらも同じであり、簡単pstree 2587 -pに説明すると、それがPIDであることがわかります。さらに、echo $$私たちのbash(またはどちらかが好きな方)を見つけます。

開始時間

ここで、2番目の数値は大きく異なり、おそらくランダムな値であることがわかります。最後の1つ、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

わかった。最後の桁は、エポックによる開始時のタイムスタンプです。しかし、残念ながら、それは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);
}

わかった。2番目がランダムな値であることを確認するだけでなく、PIと時間が正しいことも確認します。

ジオメトリ

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

# yields 110x87+900+1

わかった。これで、チェックする値が3つあります。

  • 時間
  • ジオメトリ

問題は、これでも、同じ値の値を持つ2つのウィンドウを簡単に作成できることです。そしてもっと重要です。一部の天才は、これをアプリケーションのオプションから削除することを決定しました。


ターミナルウィンドウヘックス

コードをさらに見ると、etcなどの16進値ActiveTerminalは、現在のウィンドウを保持している構造体のメモリ内の現在のアドレスへのポインタ値であることがわかります。メモリマッピングをハックしたくない場合は、AKAはあまり役に立ちません。

于 2013-01-28T05:57:07.510 に答える