Для начала, ваши совпадающие директивы серьезно ошибочны: лучшее правило должно соответствовать только для SUBSYSTEM и USB VID и PID.
В любом случае, у вас не может быть просто команд запуска root, которые должны управлять вашим активным X-сеансом. Если вам действительно нужно это сделать, вы должны, по крайней мере, импортировать $ DISPLAY и $ XAUTHORITY, но правильное решение - использовать собственные инструменты среды рабочего стола для запуска этих команд, когда это необходимо.
Причина, по которой это не удается, связана с разрешениями и подстановочным знаком *
. Мы можем воспроизвести это в локальной файловой -системе, подобной этой:
Настройте сценарий, дерево каталогов в/tmp/top
:
sudo -s <<'x'
mkdir -p /tmp/top/{a,b}/dir/sub/
touch /tmp/top/{a,b}/dir/sub/file
chown root /tmp/top/?/dir
chmod go= /tmp/top/?/dir
x
Обратите внимание, что у нас, как у обычного пользователя, нет разрешения опускаться ниже/tmp/top/*/dir
:
find /tmp/top/?/dir -type f
find: ‘/tmp/top/a/dir’: Permission denied
find: ‘/tmp/top/b/dir’: Permission denied
Попробуйте спуститься с привилегиями root из каталога, который мы не можем получить как обычный пользователь:
sudo find /tmp/top/*/dir/sub -type f
find: ‘/tmp/top/*/dir/sub’: No such file or directory
Помните, что оценка подстановочных знаков оболочки происходит до выполнения команды. Итак, здесь происходит расширение пути, содержащего подстановочный знак *
. Ваша обычная учетная запись пользователя не может проверить существование sub
, поэтому весь путь не может быть проверен. Подстановочный знак остается в виде звездочки (— поведение по умолчанию, когда совпадение не удается )и привилегированному пользователю root find
предоставляется буквальный путь /tmp/top/*/dir/sub
для нисхождения. Этот путь не существует, отсюда и ошибка.
Попробуйте спуститься с привилегиями root из каталога, к которому мы можем получить доступ как обычный пользователь:
sudo find /tmp/top/*/dir -type f
/tmp/top/a/dir/sub/file
/tmp/top/b/dir/sub/file
Здесь происходит то же самое, но с более полезными последствиями. Путь /tmp/top/*/dir
можно полностью оценить как обычного пользователя, в результате чего получится два пути /tmp/top/a/dir
и /tmp/top/b/dir
. Они передаются корневому привилегированному find
, и он может впоследствии спуститься по ним -через корневой -только подкаталог -и составить список обнаруженных файлов.
В вашей ситуации весьма вероятно, что каталоги .local
в вашем пути с подстановочными знаками не могут быть доступны без привилегий суперпользователя, но каталоги более высокого уровня вполне доступны. Пока вы указываете путь, который можно оценить как вашу обычную учетную запись пользователя, find
может продолжить работу с расширенным набором путей. Как только вы укажете путь, который не может быть оценен в контексте вашей обычной учетной записи пользователя, раскрытие завершится ошибкой, и find
будет передан путь, содержащий буквальный символ *
. Это, конечно, не совпадает, и find
не работает.
Чтобы решить эту проблему, вам просто нужно отложить оценку пути, пока ваша команда не будет запущена от имени пользователя root:
sudo bash -c "find /nfshome/*/.local/ -type f -size +1G -exec ls -lh {} \;"
В вашей команде sudo
дает дополнительные привилегии только команде find
, а не оболочке. Поэтому, если вы начнете с высокого уровня, find
сможет спуститься в файловое дерево и показать вам содержимое.
Но ваша оболочка пытается расширить *
. Если у вашего пользователя нет прав на просмотр содержимого /nfshome/*/.local
, он не сможет сопоставить какие-либо файлы в (, такие как /nfshome/*/.local/share
). Без совпадения в find
ничего не передается.
Вы можете убедиться в этом, изучив вывод echo /nfshome/*/.local
и echo /nfshome/*/.local/share
. Второй, вероятно, будет пустым.
Непонятно, почему вы хотите выполнить вторую команду, когда первая работает. Вы можете запустить всю команду в подоболочке и выполнить ее с помощью sudo
. Напримерsudo -c "find..."