Как лучше всего найти текущий DISPLAY и XAUTHORITY в неинтерактивной оболочке для текущего пользователя? [дубликат]

ОК, лучшим решением для меня (но, думаю, это дело вкуса) было использование fgetcsv от PHP, поскольку у меня уже есть PHP на этом сервере. Жаль, что команда bash read не обрабатывает новые строки так же хорошо, как функция PHP. Она автоматически распознает дополнительные разделители (например, "'s").

Образец:

<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 10000, "|")) !== FALSE) {
        $num = count($data);
        echo "$num fields in line $row:\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $c + 1 . ": " . $data[$c] . "\n";
        }
    }
    fclose($handle);
}
?>

Вывод (например, в моем исходном вопросе):

4 fields in line 1:
1: aaa
2: 111
3: !!!
4: 
4 fields in line 2:
1: bbb
2: 222
3: @@
@
4: 
4 fields in line 3:
1: ccc
2: 333
3: ###
4: 
3
21.03.2018, 13:07
2 ответа

Окончательное решение, не требующее привилегий root и доступное из не-интерактивной оболочки автоматизированным способом, более продвинутое и удобное в использовании, чем возможный дубликат ссылки, предоставленной ранее:

-XAUTHORITY:

ps -u $(id -u) -o pid= |
  xargs -I{} cat /proc/{}/environ 2>/dev/null |
  tr '\0' '\n' |
  grep -m1 '^XAUTHORITY='

-DISPLAY:

ps -u $(id -u) -o pid= |
  xargs -I{} cat /proc/{}/environ 2>/dev/null |
  tr '\0' '\n' |
  grep -m1 '^DISPLAY='

Фрагмент содержит список всех пользователей pids, выполняет итерацию по ним, затем прерывается на первом совпадении

На основании этого

4
27.01.2020, 21:12

В дистрибутивах с системой инициализации systemdвывод

systemctl --user show-environment

показывает DISPLAYи XAUTHORITY. По крайней мере, это верно для моей системы Debian 9 с systemd и gdm3в качестве диспетчера отображения.

Ошибка :После запуска startx xterm -- :2 vt2на tty2 systemctl выдал мне DISPLAYи XAUTHORITYиз нового дисплея; мой основной дисплей :0больше не был таким видимым.


Другие подходы:

По крайней мере, для XAUTHORITYнадежнее проанализировать вывод ps aux | grep Xorgи найти опцию -auth. В моем случае он находится в /run/user/1000/gdm/Xauthority, а не в ~/.Xauthority.

Подводные камни:

  • Может быть более одного экземпляра Xorg.
  • Вместо Xorg может быть Xwayland.
  • Вместо Xorg может быть Xvfbили что-то другое.
  • Это может быть удаленный сеанс вообще без локального Xorg.

Обычно команды Xorgтакже содержат номер дисплея. К сожалению, мой не:

/usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3

-displayfd 3каким-то образом указывает на DISPLAY. Если смотреть как root в /proc/$(pidof Xorg)/fd/3, я нахожу

    lrwx------ 1 root root 64 Mär  8 22:45 3 -> socket:[21437]

Хотя я не знаю, как искать сокет 21437. Я уверен, что это указывает на /tmp/.X11-unix/X0. Одним из подходов является lsof +E -aUc Xorg, который показывает интересные выходные данные :много соединений, содержащих @/tmp/.X11-unix/X0и одно соединение dbus.

Немного грязно :Папка fdтоже показывает мне

l-wx------ 1 root root 64 Mär  8 22:45 5 -> /var/log/Xorg.0.log

Xorg.0.logявляется четким указанием для дисплея :0.


Другой подход :notify-send, кажется, собирает DISPLAYи XAUTHORITYс некоторой dbusмагией. Но я понятия не имею, как. Это может быть самый чистый и переносимый способ, если хотя бы запущен демон dbus.

5
27.01.2020, 21:12

Теги

Похожие вопросы