Сделайте копирование как целевого пользователя. Это автоматически сделает конечные файлы. Удостоверьтесь, что исходные файлы читаемы миром (или по крайней мере читаемы всеми целевыми пользователями). Выполненный chmod
впоследствии, если Вы не хотите, чтобы скопированные файлы были читаемы миром.
getent passwd |
awk -F : '$1 ~ /^u12/ {print $1}' |
while IFS= read -r user; do
su "$user" -c 'cp -Rp /original/location/somefiles ~/'
done
X11 использует TCP в качестве транспортного протокола. Диапазон TCP-портов для X11 обычно составляет 6000-6063, но, скорее всего, вы увидите, что используется TCP-порт 6000.
Таким образом, вы должны иметь возможность использовать любой сетевой монитор по вашему выбору для наблюдения за трафиком, фильтруя для этого диапазона портов и соответствующих хостов. Я также знаю, что, например, wireshark
уже содержит набор фильтров x11
для наблюдения за трафиком, который вас интересует.
Например, для мониторинга всего трафика X11 на локальной машине (при использовании TCP; обратитесь к ответу @Stéphane Chazelas) используйте следующий фильтр:
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
Вы можете говорить с X11 по TCP, или через доменное гнездо Unix, или (в Linux) через доменное гнездо Unix в пространстве имен абстрактного.
Когда DISPLAY имеет значение host:4
, сокращенное от tcp/host:4
, клиенты используют TCP для соединения с сервером. TCP-порт затем 6000 плюс номер дисплея (в данном случае 6004).
В этом случае вы можете перехватить трафик с помощью любого сетевого анализатора, например, tcpdump
или wireshark
, перехватив TCP-трафик на этом порту.
Если $DISPLAY
только :4
(сокращение от unix/:4
), то клиенты используют гнездо домена unix. Либо /tmp/.X11-unix/X4
, либо тот же самый путь в пространстве имен ABSTRACT (обычно отображается как @/tmp/.X11-unix/X4
в выводе netstat
).
Захват трафика в этом случае более сложен.
Если ваш X-сервер слушает по TCP (но в настоящее время уже не слушает), то проще всего изменить DISPLAY
на localhost:4
вместо :4
и перехватить сетевой трафик на порту 6004 на интерфейсе обратной петли.
Если этого не происходит, вы можете использовать socat
в качестве человека посередине , который принимает соединения как TCP и перенаправляет их в качестве unix или абстрактного:
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
Затем можно установить $DISPLAY
на localhost:4
и перехватить сетевой трафик, как указано выше, или сказать socat
, чтобы он был сброшен с помощью -x -v
.
Теперь, если вы не можете изменить $DISPLAY
и хотите перехватить трафик уже запущенного локального приложения X, использующего unix-доменные сокеты, то это становится сложным.
Одним из подходов может быть использование strace
(или эквивалентной команды в вашей системе, если не Linux) для отслеживания системных вызовов, которые ваше приложение делает для связи с сервером X.
Здесь для xterm
я наблюдаю, как он делает writev()
, recvfrom()
и recvmsg()
системные вызовы дескриптора файлов 3 для этого. Так что я могу сделать:
strace -qqxxttts9999999 -e writev,recvmsg,recvfrom -p "$xterm_pid" 2>&1 |
perl -lne '
if (($t,$f,$p) = /^([\d.]+) (writev|recvmsg|recvfrom)\(3, (.*)/) {
@p = ($p =~ /\\x(..)/g);
$dir = $f eq "writev" ? "O" : "I";
while (@p) {print "$dir $t 0000 " . join(" ", splice @p,0,64000)}
}' | text2pcap -T6000,1234 -Dqt %s. - - | wireshark -ki -
(или tshark -Vi -
).
Идея состоит в том, чтобы извлечь метку времени и байты, отправленные/полученные из вывода строки
и использовать text2pcap
, чтобы преобразовать их в pcap
(добавив фиктивные TCP-заголовки на порту 6000 с -T6000,1234
) перед подачей на wireshark
). Мы также разделяем пакеты, чтобы избежать лимита 64kiB на максимальную длину записи пакетов.
Обратите внимание, что для правильной работы text2pcap
с точки зрения правильного направления движения, вам нужна относительно недавняя версия wireshark.
Если вас в основном интересует протокол X11, а не его лежащие в основе TCP / IP и Ethernet, и если вы можете настроить параметры клиента или сервера, вы можете использовать инструмент, специально разработанный для захвата и декодирования трафика между клиентом X11 и сервером X11. В отличие от диссектора Wireshark
X11, эти инструменты вряд ли могут быть сбиты с толку трафиком, поскольку полностью вовлечены в него.
Основным из них является xscope , который, несмотря на то, что он не доступен в виде двоичного файла для некоторых дистрибутивов Unix или Linux, может быть легко собран из исходного кода .
Кроме того, существуют также xtruss и xtrace , но у меня нет опыта работы с ними.
Все эти инструменты действуют как обратные прокси-серверы, ретранслируя соединения с реальным сервером X11. Клиенты просто используют другую переменную DISPLAY (или аргумент -display) для подключения к прокси.
например:
$ wget http://xorg.freedesktop.org/archive/individual/app/xscope-1.4.1.tar.gz
..
$ tar xzf xscope-1.4.1.tar.gz
..
$ cd xscope-1.4.1
$ ./configure && ./make
..
$ ./xscope & sleep 5; xclock -display :1
...
0.00: Client --> 12 bytes
byte-order: LSB first
major-version: 000b
minor-version: 0000
0.00: 692 bytes <-- X11 Server
protocol-major-version: 000b
protocol-minor-version: 0000
release-number: 00adfef8
resource-id-base: 04c00000
resource-id-mask: 001fffff
motion-buffer-size: 00000100
image-byte-order: LSB first
bitmap-format-bit-order: LSB first
bitmap-format-scanline-unit: 20
bitmap-format-scanline-pad: 20
min-keycode: 8 (^H)
max-keycode: 255 (\377)
vendor: "The X.Org Foundation"
pixmap-formats: (7)
roots: (1)
0.00: Client --> 20 bytes
............REQUEST: QueryExtension
name: "BIG-REQUESTS"
0.00: 32 bytes <-- X11 Server
..............REPLY: QueryExtension
present: True
major-opcode: 85
Примечание. Если по какой-либо причине вы не можете изменить настройки клиентов X11 (отображение), вы можете перенастроить сервер для прослушивания другого порта (обычно 6001 против 6000), а затем настроить xscope
для прослушивания исходного порта (6000).