Необходимость sudo при установке с помощью dnf

Ваша команда бессмысленна. Прежде всего, cd /../..— это то же самое, что и cd /, т. е. он просто изменит текущий рабочий каталог на самый верхний -каталог в иерархии каталогов. Во-вторых, cdне производит никакого вывода, поэтому передача его в во что-либо не принесет много пользы.

В-третьих, ls -lсоздаст список записей (имен )в текущем каталоге. Вы используете wc -lдля подсчета количества строк в выводе ls -l. Это число, вероятно, будет по крайней мере на единицу больше, чем реальное количество записей каталога в любом каталоге, поскольку ls -lвыводит своего рода заголовок (BSD lsне делает этого для пустых каталогов, но GNU lsвсегда делает ). ls -lне будет не перечислять скрытые имена файлов, и будет (при передаче вwc -l)создавать несколько строк для файлов, в именах которых есть символы новой строки.

Не используйте lsни для чего, кроме как для просмотра списков каталогов (глазами ), и всегда используйте wc -lтолько для подсчета строк . Есть более умные и быстрые способы подсчета файлов.

Связанные:


Чтобы перечислить количество записей каталога (имен )во всех подкаталогах 2-го уровня, используя bash, используйте что-то вроде

shopt -s nullglob dotglob

for dirpath in /*/*/; do
    set -- "$dirpath"/*
    printf '%d\t%s\n' "$#" "$dirpath"
done

Это зацикливается на всех каталогах 2-го уровня. Для каждого каталога он расширяет шаблон подстановки *в каталоге и устанавливает позиционные параметры для полученных имен. После этого специальная переменная $#будет содержать количество имен позиционных параметров (в каталоге ). Затем мы печатаем путь к каталогу вместе с этим счетчиком.

Сначала устанавливаются параметры оболочки nullglobи dotglob, чтобы мы правильно подсчитывали скрытые имена и чтобы мы получали правильный подсчет (0 )для пустых каталогов.

Хотели бы вы иметь рекурсивный подсчет каждого подкаталога на уровне 2:

shopt -s nullglob dotglob globstar

for dirpath in /*/*/; do
    set -- "$dirpath"/**/*
    printf '%d\t%s\n' "$#" "$dirpath"
done

Параметр оболочки globstarв bashпозволяет использовать **, который представляет собой шаблон, который «рекурсивно» сопоставляется с подкаталогами.

Хотели бы вы перечислить здесь только те, в которых 20 или более записей (, используя второй вариант сверху, который рекурсивно подсчитывает имена в каждом подкаталоге):

shopt -s nullglob dotglob globstar

for dirpath in /*/*/; do
    set -- "$dirpath"/**/*
    if [[ $# -ge 20 ]]; then
        printf '%d\t%s\n' "$#" "$dirpath"
    fi
done

5
13.11.2020, 07:24
2 ответа

Когда вы вводите не -имя установленной программы, это не dnfее установка, а PackageKit и ее команда не найдена плагин (пакетPackageKit-command-not-found). PackageKit использует PolicyKit, чтобы решить, запрашивать ли пароль при выполнении привилегированных задач или нет, а локальным активным пользователям-администраторам не нужно указывать пароль для установки пакета (это не специфичная функция Fedora, она получена от usptream, см. это Обсуждение FESCO). По той же причине вам не нужно вводить пароль при установке или обновлении пакетов из инструментов с графическим интерфейсом, таких как GNOME Software, которые также используют PackageKit в качестве серверной части.

Вы также можете использовать PackageKit из командной строки, команда pkconи pkcon install <package>также не будет запрашивать пароль.

А зачем dnfнужно sudo? Он просто не использует PolicyKit.

4
18.03.2021, 22:49

В описанном вами сценарии «вы» не устанавливаете установленный пакет -служба PackageKit (, которая уже запущена с правами root ), выполняет установку на вашем от имени. PackageKit использует PolicyKit, чтобы определить, кому разрешено или кому запрещено устанавливать пакеты -. Если вы не хотите, чтобы непривилегированные пользователи могли устанавливать программное обеспечение, вы можете изменить политику PolicyKit, чтобы запретить это. Одна из причин существования PackageKit заключается в том, что пользователю не нужно знать подробности системы управления пакетами в любом дистрибутиве, который он использует (, будь то dnf, или yum, или apt, или pacmanили что-то еще )-, им просто нужно попросить PackageKit установить пакет,и PackageKit занимается деталями управления пакетами и их установкой в ​​этом конкретном дистрибутиве. Когда вы вручную используете dnfдля установки пакета в Fedora, вы напрямую взаимодействуете с системой управления пакетами -PackageKit не выполняет эту операцию от вашего имени -, поэтому вам нужно работать как root (или укажите пароль root )для установки пакетов на этом уровне. Но, как обычный пользователь, вы можете использовать pkcon install <packagename>, чтобы попросить PackageKit выполнить установку от вашего имени (, если системная политика, настроенная в PolicyKit, позволяет вам сделать это ), даже не запуская как root (через suили sudoи т. д. ), или ввод пароля root.

Поведение, о котором вы говорите, когда вам предлагается установить пакет, если вы пытаетесь запустить что-то в командной строке, предоставленное пакетом, который вы еще не установили, управляется пакетом под названием " PackageKit -команда -не -найдена ". Я абсолютно ненавижу такое поведение, и одна из самых первых вещей, которые я делаю в любой недавно установленной системе Linux, — это удаление пакета PackageKit-command-not-found, чтобы этого не было сделано....

10
18.03.2021, 22:49

Теги

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