(Адаптированный из Linux: wmctrl не может открыть дисплей, когда сессия инициировала через ssh+screen),
Для X программ нужны два сведения для соединения с X дисплеями.
Этому нужен адрес дисплея, который обычно является :0
когда Вы зарегистрированы локально или :10
, :11
, и т.д., когда Вы зарегистрированы удаленно (но число может измениться в зависимости от того, сколько X соединений активны). Адрес дисплея обычно обозначается в DISPLAY
переменная среды.
Этому нужен пароль для дисплея. X паролей дисплея называют волшебными cookie. Волшебные cookie не указаны непосредственно: они всегда хранятся в X авторитетных файлах, которые являются набором записей формы “дисплей :42
имеет cookie 123456
”. X авторитетных файлов обычно обозначаются в XAUTHORITY
переменная среды. Если $XAUTHORITY
не установлен, использование программ ~/.Xauthority
.
Вы пытаетесь действовать на окна, которые отображены на Вашем рабочем столе. Если Вы - единственный человек, использующий Вашу настольную машину, вероятно, что отображаемое имя :0
. Нахождение местоположения X авторитетных файлов более трудно, потому что с gdm, как настроено под Debian сжимают или Ubuntu 10.04, это находится в файле со случайным образом сгенерированным именем. (У Вас не было проблемы прежде, потому что более ранние версии gdm использовали настройку по умолчанию, т.е. cookie, сохраненные в ~/.Xauthority
.)
Вот несколько способов получить значения DISPLAY
и XAUTHORITY
:
Можно систематически запускать экранную сессию с рабочего стола, возможно, автоматически в сценариях входа в систему (от ~/.profile
; но сделайте это только если вход в систему под X: тест, если DISPLAY
установлен на начало значения :
(который должен покрыть все случаи, с которыми Вы, вероятно, встретитесь)). В ~/.profile
:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
Затем на ssh сессии:
screen -d -r local
Вы могли также сохранить значения DISPLAY
и XAUTHORITY
в файле и отзыве значения. В ~/.profile
:
case $DISPLAY in
:*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
esac
На ssh сессии:
. ~/.local-display-setup.sh
screen
Вы могли обнаружить значения DISPLAY
и XAUTHORITY
от рабочего процесса. Это более трудно автоматизировать. Необходимо выяснить PID процесса, это подключено к дисплею, от которого Вы хотите продолжить работать, затем получить переменные среды /proc/$pid/environ
(eval export $(¹).
Другой подход (после предложения Arrowmaster) не должен пытаться получить значение $XAUTHORITY
на ssh сессии, но вместо этого сделать X копий сессии ее cookie в ~/.Xauthority
. Так как cookie сгенерированы каждый раз, когда Вы входите в систему, это не проблема, если Вы удерживаете устаревшие значения ~/.Xauthority
.
Может быть проблема безопасности, если Ваш корневой каталог доступен по NFS или другой сетевой файловой системе, которая позволяет удаленным администраторам просматривать ее содержание. Они должны были бы все еще соединиться с Вашей машиной так или иначе, если Вы не включили X соединений TCP (Debian имеет их прочь по умолчанию). Таким образом для большинства людей, это любой не применяется (никакой NFS) или не является проблемой (соединения TCP № X).
Для копирования cookie, когда Вы войдете в свой рабочий стол X сессий добавьте следующие строки к ~/.xprofile
или ~/.profile
(или некоторый другой сценарий, который прочитан, когда Вы входите в систему):
case $DISPLAY:$XAUTHORITY in
:*:?*)
# DISPLAY is set and points to a local display, and XAUTHORITY is
# set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
¹ В принципе это испытывает недостаток в надлежащем заключении в кавычки, но в этом определенном экземпляре $DISPLAY
и $XAUTHORITY
не будет содержать метасимвола оболочки.
Поскольку прошлые логины:
last "$USER_NAME"
Кроме того, команда who
списки текущие логины.
При поиске даты последнего входа в систему пользователя некоторые системы обеспечивают его непосредственно, например lastlog -u "$USER_NAME"
на Linux или lastlogin "$USER_NAME"
на FreeBSD. Это также доступно в выводе finger
, но не в легкой к синтаксическому анализу форме. В любом случае это доступно в выводе last
(на многих вариантах Unix, last -n 1 "$USER_NAME"
показывает последний вход в систему; иначе можно сделать last "$USER_NAME" | head -n 1
). Обратите внимание, что последний вход в систему не может соответствовать последнему выходу из системы (например, пользователь остался связанным от одного источника в течение долгого времени и недавно сделал быстрый сетевой вход в систему).
На Linux, last -R $username | awk '/still logged in/ {print $3,$4,$5,$6}'
ничего не возвратит, если пользователь не будет зарегистрирован, иначе список даты/времени для каждой активной сессии.
Другие unixes, которые не знают -R
для опции продлиться (который подавляет имя хоста) будет нужна некоторая модификация.
last $USER_NAME
покажет текущим пользователям также. Это покажет что-то какusername ttyp0 192.168.1.100 Tue Sep 13 13:09 still logged in
– Stefan Lasiewski 15.09.2010, 01:12