Использование WGET в каталоге за пределами домашнего каталога пользователя

Это проблема не с настоящей клавиатурой, а с поддельными событиями клавиш, посылаемыми xfce4-power-manager.

xfce4-power-manager подделывает фиктивные (код клавиши 255, не назначен) события клавиатуры (нажатие клавиши с последующим ее отпусканием, каждые 20 секунд, согласно источнику), чтобы убедиться, что экранная заставка не включается в режиме презентации (обычно, когда вы смотрите фильм или проводите презентацию).

Это поведение было добавлено в 1.5.2 (последний выпуск по состоянию на 2015-01-06) для исправления этой ошибки, чтобы отключить все возможные типы экранных заставок в режиме презентации.

Это имеет тот побочный эффект, на который вы повлияли, и который был уже отмечен в этой ошибке.

Таким образом, вы захотите оставить этот режим презентации, чтобы избежать проблемы. Этот вопрос, вероятно, следует поднять как ошибку в xfce4-power-manager, чтобы это изменение было отменено или было найдено лучшее исправление #11083.


Не менее интересно, чем объяснение проблемы, то, как мы в итоге нашли виновника:

xinput test-xi2 --root

Сообщает обо всех событиях ввода X, сообщая нам их источник и природу. Что привело к следующему:

EVENT type 13 (RawKeyPress)
    device: 5 (5)
    detail: 255
    valuators:

EVENT type 14 (RawKeyRelease)
    device: 5 (5)
    detail: 255
    valuators:

Это нажатие клавиши с последующим событием отпускания клавиши для кода 255, исходящее от устройства 5.

xinput list позволяет нам определить устройство ввода:

⎣ Virtual core keyboard                      id=3    [master keyboard (2)]
 ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]

Это устройство id=5 является виртуальным устройством, которое действует как источник для программно сгенерированных событий, которые вы можете генерировать с помощью:

xdotool key x

или

xte 'key x'

Если вы запустите эту команду xte под ltrace, вы заметите, что она делает:

XStringToKeysym(0x7ffed76983e0, 0x7ffed76983e0, 0, 0x7f34e491deb0) = 120
XKeysymToKeycode(0x23abfe0, 120, 120, 0x7f34e4ce7139)              = 53
XTestFakeKeyEvent(0x23abfe0, 53, 1, 0)                             = 1

Это XTestFakeKeyEvent является стандартным X API для отправки этих событий нажатия клавиш.

Теперь мы хотим узнать, что посылает эти 255 событий нажатия клавиш. Мы можем попытаться найти, какие из запущенных в данный момент приложений используют этот API.

sudo lsof -Fn -nPd txt | sed -n '/proc/!s/^n//p' | sort -u | xargs grep -l XTestFakeKeyEvent

Или его более надежный эквивалент:

sudo lsof -Fn -nPd txt | sed -n '/^n\/proc/!s/^n//p' |
  sort -u | xargs -d '\n' grep -l XTestFakeKeyEvent

Перечислите файлы, которые в настоящее время открыты и отображены как исполняемые (txt) для любого процесса (это включает библиотеки и исполняемые файлы) и поищите в них XTestFakeKeyEvent.

Это вернуло xfce4-power-manager.

Оставалось только посмотреть в исходниках, почему этот процесс делает эти XTestFakeKeyEvent.

1
10.10.2018, 23:16
2 ответа

Аналогичный вопрос о stackoverflow (, в котором использовалась java вместо wget, но на самом деле основная проблема связана с синтаксисом URL, который, как мы надеемся, -не зависит от языка ), был решен путем добавления еще одной косой черты и URL -кодирование вот так:

wget -m ftp://user:pass@192.168.1.1/%2Ffoo/bar/

У меня работает и без кодировки, только с лишним слэшем:

wget -m ftp://user:pass@192.168.1.1//foo/bar/

Первая косая черта отбрасывается (и служит только разделителем между хостом и путем ), а вторая косая черта фактически считается частью пути.

4
27.01.2020, 23:23

Вы должны иметь возможность загрузить определенный каталог, используя wgetвот так:

wget -m 'ftp://[user]@192.168.1.1/%2ffoo/bar' -O /foo/bar

Я бы не стал указывать ваш пароль в URL-адресе, так как он появится в вашей истории bash. Эта команда, конечно же, означает, что /foo/barнаходится вне /и больше нигде. Если /foo/barнаходится за чем-то вроде /var/www, вам нужно будет указать полный путь в команде.

Насколько я понимаю, вы используете UNIX -, основанный на /usr/user, поэтому могут быть различия в функциях конкретной реализации wget, которую вы используете.

Вот альтернатива с использованиемcurl:

curl -u [user] 'ftp://192.168.1.1/%2fpath/to/foo/bar' -o /path/to/foo/bar

Пожалуйста, прочтите эти ссылки:

URL-адреса FTP
Как использовать wget
Использование wget для рекурсивной загрузки каталогов FTP
Загрузка с помощью wget в каталог, отличный от текущего каталога
Как указать местоположение с помощью wget?
Загрузка файла с FTP с помощью cURL

Пожалуйста, прокомментируйте, если у вас есть какие-либо вопросы или проблемы с этим ответом. Я настоятельно рекомендую вам внимательно прочитать каждую ссылку, которую я предоставил, прежде чем пытаться использовать команды. Я ценю обратную связь, чтобы исправить любые неправильные представления и улучшить мои сообщения. Я могу обновить свой ответ по мере необходимости.

Удачи!

0
27.01.2020, 23:23

Теги

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