Я думаю, вы должны отделить обработку файлов из обработки каталога. Сделайте каталоги первыми. В мире GNU:
cd /dir2
find /dir -mindepth 1 -maxdepth 1 -type d -exec mkdir {} \;
, а затем симлизы:
find /dir -mindepth 1 -maxdepth 1 -type f -exec ln -s -t /dir2 {} +
Не похоже, что ядро раскрывает эту информацию. Поэтому, кроме отладки ядра, я не думаю, что вы можете это знать. Лучшее, что вы можете сделать, это перечислить все процессы, которые имеют tun
или tap
устройств, открытых так:
lsof /dev/net/tun
Так что это сузит его, но в случае, когда есть несколько активных tun
интерфейсов в системе, это не говорит вам, какой процесс управляет каким туннелем.
Когда процесс хочет создать интерфейс tun
, он открывает интерфейс /dev/net/tun
независимо от того, какой интерфейс tun
он намерен использовать. Затем он позволяет ядру динамически назначать новое имя интерфейса tun
(например, tun0
, tun1
, tun2
и т.д.) или задает выбранное имя. Это делается с помощью вызова ioctl
с кодом TUNSETIFF
. Так что, если вы не сможете отследить, что ioctl
звонит, нет способа сказать, какое имя было присвоено.
Как указано, bash
обычно доступен в установке по умолчанию для многих искажений. Ваш сценарий не достигнет максимальной базы пользователей, полагаясь на zsh
.
Важный вопрос, на который необходимо ответить перед разработкой сценария: « Почему важно, в какой оболочке выполняется сценарий? »
Различные оболочки используют другой синтаксис или предлагают дополнительные функции оболочки, которые могут не поддерживаться другими оболочками. Чтобы написать сценарий для «общего мира конечных пользователей Linux», определите, использует ли сценарий какой-либо синтаксис или функции оболочки, которые зависят от конкретной среды оболочки.
Например, bash
shell поддерживает определенные расширения, которые не поддерживаются тире
, оболочкой Борна или каким-либо /bin/sh
, точками в системе пользователя.
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Feb 19 2014 /bin/sh -> dash
Попробуйте выполнить эхо {1.. 10}
с /bin/sh
по сравнению с /bin/bash
, и вы получите совершенно разные выходные данные.
То же самое касается zsh
, который, поддерживая большинство синтаксисов bash
, обеспечивает дополнительное расширение и синтаксис, которые не поддерживаются оболочкой bash
. Конкретные примеры см. в таблицах , сравнивающих оболочки .
Потенциальную базу пользователей можно расширить за пределы bash
, придерживаясь сценариев, которые работают при вызове с # !/bin/sh -u
. Однако это порождает еще один важный вопрос: « Чем жертвуют в обмен на большую переносимость? »
Определите, стоит ли жертвовать различиями, связанными с безопасностью, функциональностью, эффективностью или чем-либо еще, что вы считаете приоритетным для вашего сценария. Возможно, не нужно широко использовать скрипт с известной уязвимостью безопасности только потому, что он работает в большем количестве сред.
Для bash
написано так много сценариев, что поддержка этих сценариев используется в качестве критерия при сравнении командных оболочек . Гораздо больше людей смогут запустить сценарий, чем если бы он основывался на zsh
или любом другом синтаксисе, исключительном для среды оболочки.
Кроме того, имейте в виду, что в конечном счете у вас нет контроля над тем, как пользователь выполняет сценарий (также полезно для отладки сценариев в различных оболочках ):
Помните, что если вы используете оболочку для чтения сценария оболочки ("sh scriptname "), вместо непосредственного выполнения (" ./scriptname "), shell будет рассматривать все комментарии в начале сценария оболочки как комментарии. В частности, комментарий, в котором указывается переводчик использование при выполнении сценария («# !/bin/sh -u») будет проигнорировано, так как будут все опции, перечисленные рядом с этим интерпретатором.
Итак, лучшее, что вы можете сделать, это сделать ваши сценарии портативными, пока нет больших жертв тому, как он функционирует.
Также можно увидеть Условные обозначения кодирования Bash - Переполнение стека .
-121--16836- Необходимо настроить gdm3
, PAM
для autologin
:
Отредактируйте файл /etc/gdm/custom.conf
.
# Enable automatic login for user
[daemon]
AutomaticLogin=username
AutomaticLoginEnable=True
Поместите следующую конфигурацию pam
в /etc/pam.d/gdm-password
:
auth sufficient pam_succeed_if.so user ingroup nopasswdlogin
Затем создайте пользователя и группу nopasswdlogin
.