Чтобы взять под контроль запущенный сеанс X, вам необходимо настроить сервер VNC для подключения к тому же дисплею, что и X. Обычно X подключается к первому дисплею - : 0
.
Вам также понадобится X Authority для этого X-сеанса. Это можно найти, обратившись к файлу X Authority, который использует удаленный Диспетчер отображения. Это зависит от вашего Диспетчера отображения и может быть найдено с помощью ps aux
и grep
. Например: psaux | grep Xorg
дает вам нечто подобное:
/usr/libexec/Xorg -background none :0 -seat seat0 -auth /var/run/lightdm/root/:0 -listen tcp vt1 -noswitch
Обратите внимание на параметр -auth
, поскольку он вам понадобится с VNC. Затем вам нужно запустить что-то вроде следующего как root
на удаленном компьютере после установки x11vnc
:
/usr/bin/x11vnc -norc -forever -shared -bg -autoport 5900 -auth /var/run/lightdm/root/:0
Самый простой способ - создать службу, которая запускает это для вас при загрузке . В дистрибутивах, использующих systemd
, создайте файл /etc/systemd/system/x11vnc.service
, подобный следующему:
[Unit]
Description=VNC Server for X11
Requires=display-manager.service
After=display-manager.service
[Service]
Type=forking
ExecStart=/usr/bin/x11vnc -norc -forever -shared -bg \
-autoport 5900 \
-rfbauth /etc/x11vnc.pass \
-o /var/log/x11vnc.log \
-auth /var/run/lightdm/root/:0
[Install]
WantedBy=graphical.target
Обратите внимание на параметр -rfbauth
. Вам необходимо заранее создать файл паролей, используя:
$ sudo x11vnc -storepasswd /etc/x11vnc.pass
В качестве альтернативы, если вы не чувствуете, что вам нужны защищенные паролем сеансы VNC, просто удалите строку -rfbauth
.
Включить при загрузке с помощью:
$ sudo systemctl enable x11vnc.service
Запустить вручную с помощью:
$ sudo systemctl start x11vnc.service
Теперь вы можете подключиться к удаленному компьютеру с помощью своего клиента VNC и взять на себя сеанс.
command1 |
xargs sh -c 'for p do [ -f "$p" ] && printf "%s\n" "$p"; done' sh |
xargs command 2
Дополнительный бит в середине — это еще один xargs
вызов короткого скрипта, который в основном просто перебирает заданные ему аргументы командной строки и печатает пути, соответствующие существующим обычным файлам (или символические ссылки на обычные файлы ). Эти существующие пути затем передаются в последнюю часть конвейера.
Это предполагает, что все пути свободны от встроенных символов новой строки, пробелов и табуляции.
Предполагая, что command1
выводит список в формате, ожидаемом xargs
, вы можете определить:
existing_plain_readable_files_only() {
perl -le "for (@ARGV) {
if (-f && -r) {s/'/'\\\\''/g; print qq('\$_')}
}" -- "$@"
}
И использовать как:
command1 | xargs existing_plain_readable_files_only | xargs command2
Здесь мы используем perl
оператор -f
для обычных файлов только (не каталогов, устройств, каналов... )и -r
для тех, которые доступны для чтения пользователю (, предполагая, что command2
захочет их прочитать ), и мы используем одинарные -кавычки, за исключением самих одинарных кавычек, которые экранируются с помощью \
.
Этот вид цитирования поддерживается как xargs
, так и оболочкой, что означает, что вы также можете использовать эту функцию для обработки массивов оболочки, содержащих произвольные списки файлов:
eval "array2=($(existing_plain_readable_files_only "${array1[@]}"))"
(здесь предполагают оболочки ksh93
, zsh
, bash
, mksh
или yash
).