Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
# Allow user mount/umount (set device owner and use 'owner' option in fstab).
# Create mount point directories for vfat/ext2/ext3/ext4/ntfs partitions.
# Create symlinks using partition label (overwrite duplicates).
# Auto-mount vfat with 'flush' option.
# Auto-mount ext4 with 'sync' option.
# No auto-mount for other filesystems (because there is NO SAFE auto-unmount).
# Auto-unmount vfat/ext2/ext3/ext4/ntfs and cleanup directories/symlinks.
ENV{mount_user}="powerman"
ENV{mount_path}="/mnt"
KERNEL=="sd*", DRIVERS=="usb-storage", ENV{ID_FS_TYPE}!="", \
OWNER="%E{mount_user}", \
ENV{mount_point}="usb.%k"
ACTION=="add", ENV{mount_point}!="", ENV{ID_FS_TYPE}=="vfat", \
ENV{mount_fs}="vfat", \
ENV{mount_opts}="flush,owner,umask=007,showexec,quiet"
ACTION=="add", ENV{mount_point}!="", ENV{ID_FS_TYPE}=="ext2|ext3", \
ENV{mount_fs}="%E{ID_FS_TYPE}", \
ENV{mount_opts}="owner"
ACTION=="add", ENV{mount_point}!="", ENV{ID_FS_TYPE}=="ext4", \
ENV{mount_fs}="ext4", \
ENV{mount_opts}="sync,owner"
ACTION=="add", ENV{mount_point}!="", ENV{ID_FS_TYPE}=="ntfs", \
ENV{mount_fs}="ntfs-3g", \
ENV{mount_opts}="owner,umask=007,fmask=111"
ACTION=="add", ENV{mount_point}!="", \
RUN+="/bin/mkdir -p %E{mount_path}/%E{mount_point}", \
RUN+="/bin/sed -i.bak '$a/dev/%k %E{mount_path}/%E{mount_point} %E{mount_fs} %E{mount_opts} 0 0' /etc/fstab"
ACTION=="add", ENV{mount_point}!="", ENV{ID_FS_TYPE}=="vfat|ext4", \
RUN+="/usr/bin/sudo -u %E{mount_user} /bin/mount %E{mount_path}/%E{mount_point}", \
RUN+="/usr/bin/sudo -u %E{mount_user} /usr/bin/env DISPLAY=:0 /usr/bin/notify-send -t 2500 -u normal -i /usr/share/icons/oxygen/48x48/devices/drive-removable-media-usb-pendrive.png 'USB Flash automounted' '%E{mount_point}\n%E{ID_FS_LABEL}'"
ACTION=="remove", ENV{mount_point}!="", \
RUN+="/bin/umount -l %E{mount_path}/%E{mount_point}", \
RUN+="/bin/sed -i.bak '/^\/dev\/%k \S\+\/%E{mount_point} /d' /etc/fstab", \
RUN+="/bin/rmdir %E{mount_path}/%E{mount_point}", \
RUN+="/usr/bin/sudo -u %E{mount_user} /usr/bin/env DISPLAY=:0 /usr/bin/notify-send -t 1000 -u normal -i /usr/share/icons/oxygen/48x48/devices/drive-removable-media-usb-pendrive.png 'USB Flash disconnected' '%E{mount_point}\n%E{ID_FS_LABEL}'"
ACTION=="add", ENV{mount_point}!="", ENV{ID_FS_LABEL}!="", \
RUN+="/bin/ln -nsf %E{mount_point} %E{mount_path}/%E{ID_FS_LABEL}"
ACTION=="remove", ENV{mount_point}!="", ENV{ID_FS_LABEL}!="", \
RUN+="/bin/rm %E{mount_path}/%E{ID_FS_LABEL}"
udevadm monitor -u -p достаточно информативен вроде бы.При запуске внешних скриптов нужно иметь в виду возможные спецсимволы в partition label, типа случайно попавших туда "&&rm -rf /" (сработает при запуске внешнего скрипта) и "../../etc/" (может смонтировать раздел вместо "/etc") ;-) Вопрос — какие спецсимволы нужно фильтровать для полной защиты этой дыры? На ум сразу приходят "&", "/" и ";", но может быть больше.Почему бы не воспользоваться либо списками (при использовании списков в Python запуск внешних программ обходится без shell), либо экранированием строки (правда я знаю всего один способ экранирования на Python: замените её на
"$_ARGUMENT_0001" и предоставьте соответствующую переменную окружения). При правильном подходе единственное, что надо будет учитывать — это /, который надо на что‐то заменить (можете проверить как это сделано системой в /dev/disk/by-label).;rm -rf / не доставит вам никаких проблем в команде mount $MOUNTPOINT $DEVICE, кроме того, что из‐за пробелов mount получит в аргументах /mnt/;rm, -rf, / и /dev/…).- в начале имени. Для того, чтобы при наличии в переменной ;rm -rf /, его запустить вам нужен eval либо что‐то эквивалентное вроде запуска sh -c, а это присутствует в скриптах крайне редко. Фильтрация только покажет, что вы не разбираетесь в проблеме.Tab не работает в таких случаях.Да ну? Переходите на zsh, всё работает. В fish тоже всё работает. Даже bash можно настроить, чтобы всё работало. Под «всё» я имею ввиду, что повторное нажатие Tab вызывает циклическое переключение между вариантами автодополнения. Zsh дополнительно позволяет управлять переключением стрелками, что очень помогает (как ни странно, у меня нет русской раскладки и все русские тексты я пишу либо со смартфона (транслитом, но используя ruKeyboard), либо транслитом в Vim). Так что я знаю, о чём говорю.
К тому же префикс никак не поможет Таб-ом перейти на нужную папку в консоли, если папок с одинаковым префиксом больше одной =)Это целиком и полностью вопрос выбора способа создания префикса.
Про библиотеки из C, которые используются как основы для Питоновских библиотек, понятно. Но если уж Питон предоставляет обёртки над функциями из C — можно сделать эти обёртки удобными, как это, собственно, и сделано в большинстве Питоновских библиотек.Они удобные. Во‐первых, только shell оперирует сплошной строкой: и exec*, и main(), и вещи вроде sys.argv — это всё списки.
' '.join(argument_list) не обойдётся.$ против \Z).*args в качестве списка, чтобы не отличаться от прочих функций, а никак не принимать на вход строку. И отдельный модуль, который позволяет засунуть в *args запуск $SHELL с заданной строкой.Насчёт однородности — нашёл os.system.В модуле os много практически прямых привязок к C’шным функциям. И этот вариант использует оболочку. Кроме того, «The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function.» и «Note that POSIX does not specify the meaning of the return value of the C system() function, so the return value of the Python function is system-dependent.»
Более того, однородность между теми же check_output и popen тоже неполная — так почему между моей функцией и вышеперечисленными она должна быть полной?Мне не жалко повторить во второй раз, что однородность должна быть в библиотеках языка, и что она не идеальна. И, кстати, вы не нашли «что-то, что non-shell и принимает на вход строку». Ну и os.popen* тоже deprecated. Более того, в документации на
os.system стоит просто рекомендация использовать subprocess. А в документации на os.popen стоит очень заметное розовое предупреждение о том, что popen «Deprecated since version 2.6». Жаловаться на неоднородность deprecated функций имеет не больше смысла, чем жаловаться на то, что человеческий эмбрион не выглядит как человек: такие неоднородности обусловлены историческими причинами.То же разное поведение subprocess.check_output при shell=True и shell=False — это ли не вопиющий пример неоднородности? Вон, человек тоже недоволен — asvetlov.blogspot.com/2011/03/subprocess.html, плюс там пример вообще неадекватного поведения.Я с ним согласен. Как я сказал выше, я бы вообще зарубил Popen возможность использовать shell, но добавил модуль или функцию в subprocess, которая сформирует список аргументов для Popen так, чтобы вызывался shell со строкой. Ну и
Popen('cat', filename, filename2) выглядит лучше, чем Popen(['cat', filename, filename2]). Но всё это не меняет того факта, что функции в subprocess принимают практически одни и те же аргументы.«label_regex»:"*iPhone*"Обычно при слове
regex ожидают один из диалектов Perl’оподобных регулярок, либо что‐то вроде ERE/BRE. А это обычно называется glob либо более общим pattern (которое также может относится и к regex). Если вы подаёте код Python’овскому re.*, то выражение должно выглядеть как .*iPhone.*. Если это выражение правильно, то поле лучше переименовать.Само его существование никого не заставляет на него переходить.Только теоретически. По факту, вам придётся отказаться от популярных дистрибутивов, если вы не сторонник systemd.
Да и, насколько понимаю, его не зря выбрали новой init system.По поводу адекватности этого выбора ведутся жаркие баталии (на ЛОРе — при выходе любой новости про systemd). Даже на хабре не так давно статья была: habrahabr.ru/post/223351/ если у вас есть желание подискутировать на эту тему, то я рекомендую делать это в том топике.
Pautomount — демон автоматического монтирования, запуска скриптов и всего такого прочего