Список установленных вручную пакетов верхнего уровня без их зависимостей

Допустим, вы хотите включить отсутствие пароля для команды/бинарного файла nodejs.

Измените visudo

sudo visudo

с помощью следующей строки, чтобы включить отсутствие пароля для команды. Передайте несколько команд с запятыми и пробелом после каждой команды.

 ALL = NOPASSWD: /usr/local/bin/node

например. sunthara ALL = NOPASSWD: /usr/local/bin/node

enter image description here

11
12.09.2018, 14:05
4 ответа

Это можно сделать с помощью Python apt API. Пакеты, которые вы видите в apt-mark showmanual, точно такие же, как в apt.cache.Cache(), для которых is_installedимеет значение true иis_auto_installed неверно. Но легче обрабатывать зависимости:

#! /usr/bin/env python3

from apt import cache

manual = set(pkg for pkg in cache.Cache() if pkg.is_installed and not pkg.is_auto_installed)
depends = set(dep_pkg.name for pkg in manual for dep in pkg.installed.get_dependencies('PreDepends', 'Depends', 'Recommends') for dep_pkg in dep)

print('\n'.join(pkg.name for pkg in manual if pkg.name not in depends))

Даже здесь перечислены некоторые пакеты, которые я не ожидал там увидеть (init, grep?!).

12
27.01.2020, 19:58

Следующий сценарий оболочки ищет родителей всех установленных зависимостей.

function get_installed_packages() {
    apt list --installed | sed 's#/.*##'
}

function get_installed_packages_with_deps() {
    dpkg-query --show --showformat '${Package} ${Depends} \
        ${Pre-Depends}\n' $(get_installed_packages) | 
    sed 's/ ([^(]*)//g; s/:any\|,//g'
}

function get_package_relations() {
    awk '{print $1 " " $1; for(i = 2; i <= NF; i++) print $1 " " $i;}'
}

function add_marker() {
    echo "~ ~"
}

function resolve_parents() {
    tsort | sed -n '1,/~/ p' | head -n -1
}

(get_installed_packages_with_deps | get_package_relations; add_marker) | 
resolve_parents

Я использовал tsortв этом скрипте.Я предполагаю, что при добавлении маркера в конце без зависимостей маркер также будет последней записью без зависимостей в моем результате. Таким образом, я могу отличить последний пакет без зависимостей от первого пакета с зависимостями.

Я заметил одну проблему с этим решением:
В графе зависимостей есть циклы. Эти записи игнорируются tsort.

3
27.01.2020, 19:58

Вы можете найти все установленные вручную пакеты без их 1-го уровня зависимостей следующим образом:

apt-mark showmanual | sort > manually-installed.txt

apt show $(apt-mark showmanual) 2>/dev/null | 
grep -e ^Depends -e ^Pre-Depends > deps1.txt

cat deps1.txt | 
sed 's/^Depends: //; s/^Pre-Depends: //; 
     s/(.*)//g; s/:any//g' > deps2.txt

cat deps2.txt | tr -d ',|' | tr ' ' '\n' | grep -v ^$ |
sort -u > all-dep-packages.txt

grep -v -F -f all-dep-packages.txt manually-installed.txt

Вы также можете использовать следующую -магию вкладыша:

apt-mark showmanual | sort | grep -v -F -f <(apt show $(apt-mark showmanual) 2> /dev/null | grep -e ^Depends -e ^Pre-Depends | sed 's/^Depends: //; s/^Pre-Depends: //; s/(.*)//g; s/:any//g' | tr -d ',|' | tr ' ' '\n' | grep -v ^$ | sort -u)
3
27.01.2020, 19:58

См. этот ответ на Аскубунту , в котором используется сравнение apt-mark showmanualс содержанием/var/log/installer/initial-status.gz:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Это дало мне именно те пакеты, которые я добавил вручную с момента новой установки Ubuntu.

0
15.04.2021, 12:38

Теги

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