Цель способности записать в файл и разрешить группу пользовательского доступа только для чтения может быть достигнута принадлежностью файла и полномочиями. Скажем, все пользователи, которым нужен такой доступ, находятся в 'пользовательской' группе, и у Вас один есть доступ к корневой учетной записи в той системе. Затем сделайте (как корень):
touch /var/log/AccessLog
chown root:users /var/log/AccessLog
chmod 640 /var/log/AccessLog
С этого времени только корень сможет изменить файл, но все пользователи смогут считать его.
Если вместо этого Вы хотите позволить пользователям писать в файл, но должны отслеживать то, кто (и когда) изменил его, Вы могли бы использовать FAM (Монитор Изменения Файла). Выше этого, для ведения учет учета всех предыдущих версий файла можно поместить Систему управления версиями (как МЕРЗАВЕЦ, например)) - можно заставить его сотрудничать с FAM так, чтобы каждая модификация файла инициировала фиксацию к локальному репозиторию. Вероятно, могут быть более легкие способы сделать это, но ничто не прибывает по моему мнению (по крайней мере ничто, что работало бы сверху файловой системы).
Существует много плееров между Вашей клавиатурой и процессом, который наконец обрабатывает событие клавиатуры. Среди главных частей среды то, что X систем имеют свой собственный обрабатывающий клавиатуру слой и X партнеров различные "коды клавиши" с ключами, чем Ваша система основы Linux. showkey
команда показывает Вам коды клавиши в малопонятном жаргоне основной системы Linux. Для xmodmap
Вам нужны эти X кодов клавиши, которые являются что xev
отображается. Пока Вы планируете работать в X и сделать Ваше ключевое повторное переплетение с xmodmap
, затем, проигнорировать showkeys
и просто слушайте что xev
говорит.
Что Вы хотите искать в Вашем xev
вывод является блоками как это:
KeyPress event, serial 27, synthetic NO, window 0x1200001, root 0x101, subw 0x0, time 6417361, (340,373), root:(342,393), state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False KeyRelease event, serial 27, synthetic NO, window 0x1200001, root 0x101, subw 0x0, time 6417474, (340,373), root:(342,393), state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES, XLookupString gives 0 bytes: XFilterEvent returns: False
xev
имеет тенденцию генерировать большой вывод, особенно когда Вы перемещаете свою мышь. Вам, вероятно, придется прокрутить назад некоторое время для нахождения вывода, который Вы ищете. В предыдущем выводе мы видим что keysym Alt_L
связан с X кодами клавиши 64
.
Как корень, выполненный:
showkey -s
... видеть то, что scancode для Вашего таинственного ключа. Я получил что-то вроде этого:
# showkey -s
kb mode was RAW
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]
press any key (program terminates 10s after last keypress)...
0xc6
0x46 0xc6
0xc6
0x46 0xc6
0x46
Не уверенный, почему кажется, что один ключ генерирует два scancodes. Это не keydown/keyup вещь, почти я мог сказать от шаблона. Отметьте предупреждение, таким образом, можно хотеть выполнить это в однопользовательском режиме.
Я предположил, что 0x46 был моим scancode.
Затем, найдите неиспользованный код клавиши с:
xmodmap -pke | less
Здесь Вы видите, что код клавиши 97 не использован в моей системе:
keycode 94 = less greater less greater bar brokenbar
keycode 95 = F11 XF86Switch_VT_11 F11 XF86Switch_VT_11
keycode 96 = F12 XF86Switch_VT_12 F12 XF86Switch_VT_12
keycode 97 =
keycode 98 = Katakana NoSymbol Katakana
keycode 99 = Hiragana NoSymbol Hiragana
Использование кода клавиши X и код клавиши использование ядра ВЫКЛЮЧЕНЫ 8 по "историческим причинам". Поэтому возьмите 97 - 8 = 89 и используйте 89 с командой setkeycodes (снова как корень):
# setkeycodes 46 89
И Вы должны быть установлены. Подтвердите с xev, что Вы получаете Событие Нажатия клавиши с кодом клавиши 97. (хотя, после того как я сказал файлу ключей Fluxbox использовать тот код клавиши, что я больше не получал события KeyPress - возможно, потому что Fluxbox глотает их, когда он использует их?)
Обратите внимание, что 'setkeycodes' не переживет перезагрузку, таким образом, необходимо будет добавить его к init сценариям (например, в/etc/rc.local)
Нечетный, мой xev дает событие KeyPress и KeyRelease для высокого звука (и для ключа Windows, здесь названного "супер"):
KeyPress event, serial 40, synthetic NO, window 0xae00001,
root 0x2ca, subw 0x0, time 595467354, (98,77), root:(102,443),
state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 40, synthetic NO, window 0xae00001,
root 0x2ca, subw 0x0, time 595467453, (98,77), root:(102,443),
state 0x18, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
И правый:
KeyPress event, serial 40, synthetic NO, window 0xae00001,
root 0x2ca, subw 0x0, time 595572876, (75,33), root:(79,399),
state 0x10, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 40, synthetic NO, window 0xae00001,
root 0x2ca, subw 0x0, time 595572972, (75,33), root:(79,399),
state 0x18, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
Я вижу две возможности:
xinit -- :1
, который должен получить Вас X-сервер только с xterm — даже не будет выполнения менеджера окон. Выход из xterm закроет сеанс).Другая возможность: просто получите коды клавиши от xmodmap:
anthony@Zia:~$ xmodmap -pk | grep -i alt
64 0xffe9 (Alt_L) 0xffe7 (Meta_L) 0xffe9 (Alt_L) 0xffe7 (Meta_L)
108 0xffea (Alt_R) 0xffe8 (Meta_R) 0xffea (Alt_R) 0xffe8 (Meta_R)
204 0x0000 (NoSymbol) 0xffe9 (Alt_L) 0x0000 (NoSymbol) 0xffe9 (Alt_L)
anthony@Zia:~$ xmodmap -pk | grep -i super
133 0xffeb (Super_L) 0x0000 (NoSymbol) 0xffeb (Super_L)
134 0xffec (Super_R) 0x0000 (NoSymbol) 0xffec (Super_R)
206 0x0000 (NoSymbol) 0xffeb (Super_L) 0x0000 (NoSymbol) 0xffeb (Super_L)
Существует 64 и 108 снова. xmodmap -pm
покажет Вам просто карту модификатора, которая также дает Вам числа (хотя, на этот раз, в шестнадцатеричном числе).
Я пытался решить это для меня, и я просто понял это.
Основная проблема состоит в том, что Вы не получаете событие для нажатия клавиши. Рассмотрение журнала, Вы отправили причину, очевидно.
FocusOut event, serial 36, synthetic NO, window 0x4a00001,
mode NotifyGrab, detail NotifyAncestor
FocusIn event, serial 36, synthetic NO, window 0x4a00001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 36, synthetic NO, window 0x0,
keys: 122 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Вы видите Focus{In,Out}
события имеют a mode
из Notify{Grab,Ungrab}
. Это указывает, что ключ был обработан другим процессом (вероятно, приложение ярлыка/привязки клавиш).
В моем случае это был xbindkeys, но если Вы используете настольную среду, у них, вероятно, есть система привязки клавиш. Чтобы видеть, что эти события являются xev, необходимо будет остановиться/запретить другую программу.
Если Вы не можете определить, какая программа крадет ключевые события, лучшее решение состоит в том, чтобы запустить еще X сессий без нее выполнение. Выполните следующую команду для запуска еще X демонстрирующихся сессий :1
, если это уже взято, просто увеличивают число в конце. Можно, конечно, изменить терминал на то, что Вы предпочитаете или установили в своей системе.
xinit /usr/bin/xterm -- :1
Затем выполненный xev
снова. Это должно дать Вам результат без него получаемый другими программами. Обратите внимание, что менеджер окон, который начинает, является фокусом при наведении курсора, таким образом, необходимо будет установить курсор выше xev окна для ключей, которые будут получены.
Как был сказан в этом превосходном ответе dubiousjim, код клавиши отличается, потому что существует много слоев между xev и ядром.
У меня была такая же проблема с исчезновением Alt_L
в XUbuntu 14.04 (Alt_R
было нормально). После долгой игры я заметил, что showkey
записала нажатие клавиши, но xev
не --- это должно было быть что-то в оконной системе. Я пролистал все настройки "Window Manager" и "Window Manager Tweaks" и ничего не нашел. Наконец, я нашёл бродячую Alt_L
в списке клавиатурных комбинаций (xfce4-клавиатурных комбинаций
) в "Редакторе настроек". Я "обнуляю" это и возвращаю свой Alt_L
обратно! Блуждающий ярлык Alt_L
нигде больше не появлялся, кроме как в "Редакторе настроек".
Я «обнаруживаю» три вопроса в вашем вопросе:
XEV
и ShowKee
Сообщите об различных ключевых кодах для ключа?
не показывать ALT , нажав правильно? В связи с первым вопросом : в наши дни, где клавиатура «драйвер» в X не на самом деле не водит аппаратное обеспечение, он мог бы просто пройти клавишные коды из ядра до X Core, но это не так. Он добавляет 8 к ключевому коду, прежде чем передавать его.
Второе: Что-то в вашей X сеансе захватывает событие ALT . Другие ответы охватывают это уже. (I.e. XEV
не получает событие, которое вы хотели бы видеть). Чулприт может быть связан с вашим диспетчером окон. Попробуйте более голой X сеанс.
В-третьих: не используйте XMODMAP
. Это было устарело на десятилетие. Новые парни XKB и его инструмент SETXKBMAP
.
$ setxkbmap -query
rules: evdev
model: pc105
layout: us
variant: altgr-intl
options: caps:backspace
Для обмена ALT и Win Уже есть опция, подготовленная в XKB. Просто добавьте его:
$ setxkbmap -option altwin:swap_alt_win
$ setxkbmap -query
rules: evdev
model: pc105
layout: us
variant: altgr-intl
options: altwin:swap_alt_win,caps:backspace
xev -event keyboard
был бы достаточно для избавления большей части шума. – Fredrik Wendt 26.08.2017, 09:04