find не возвращает ожидаемые файлы

Для начала, ваши совпадающие директивы серьезно ошибочны: лучшее правило должно соответствовать только для SUBSYSTEM и USB VID и PID.

В любом случае, у вас не может быть просто команд запуска root, которые должны управлять вашим активным X-сеансом. Если вам действительно нужно это сделать, вы должны, по крайней мере, импортировать $ DISPLAY и $ XAUTHORITY, но правильное решение - использовать собственные инструменты среды рабочего стола для запуска этих команд, когда это необходимо.

6
11.05.2019, 01:02
2 ответа

Причина, по которой это не удается, связана с разрешениями и подстановочным знаком *. Мы можем воспроизвести это в локальной файловой -системе, подобной этой:

  1. Настройте сценарий, дерево каталогов в/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
    
  2. Обратите внимание, что у нас, как у обычного пользователя, нет разрешения опускаться ниже/tmp/top/*/dir:

    find /tmp/top/?/dir -type f
    find: ‘/tmp/top/a/dir’: Permission denied
    find: ‘/tmp/top/b/dir’: Permission denied
    
  3. Попробуйте спуститься с привилегиями 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для нисхождения. Этот путь не существует, отсюда и ошибка.

  4. Попробуйте спуститься с привилегиями 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 {} \;"
3
27.01.2020, 20:27

В вашей команде sudoдает дополнительные привилегии только команде find, а не оболочке. Поэтому, если вы начнете с высокого уровня, findсможет спуститься в файловое дерево и показать вам содержимое.

Но ваша оболочка пытается расширить *. Если у вашего пользователя нет прав на просмотр содержимого /nfshome/*/.local, он не сможет сопоставить какие-либо файлы в (, такие как /nfshome/*/.local/share). Без совпадения в findничего не передается.

Вы можете убедиться в этом, изучив вывод echo /nfshome/*/.localи echo /nfshome/*/.local/share. Второй, вероятно, будет пустым.

Непонятно, почему вы хотите выполнить вторую команду, когда первая работает. Вы можете запустить всю команду в подоболочке и выполнить ее с помощью sudo. Напримерsudo -c "find..."

4
27.01.2020, 20:27

Теги

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