Можно ли для сценария Bash заблокировать управление пакетами, чтобы сценарий мог использовать apt (и dpkg) для внесения изменений?

Я хотел бы сделать что-то вроде этого:

  1. Спросить пользователя, какие пакеты удалить в интерактивном режиме
  2. Удалить запрошенные пакеты

И я хочу, чтобы система пакетов оставалась нетронутой при получении пользовательского ввода .

Это другое дело - ждать, пока какая-то другая программа что-то изменяет в системе управления пакетами, чем предотвращать попытки какой-либо другой программы начать вмешиваться в систему управления пакетами, пока моя программа решает, что делать с системой управления пакетами и при совершении решенных действий.

См. Связанный отчет об ошибке и комментарии там.

В настоящее время существует как минимум два файла блокировки, используемые для блокировки системы dpkg: '/ var / lib / dpkg / lock' и '/ var / lib / dpkg / lock-frontend'. Я пытаюсь заблокировать, используя предыдущий файл, запустив следующий сценарий от имени суперпользователя:

#!/bin/bash
exec {var}>/var/lib/dpkg/lock
flock -n $var || { echo was locked already; exit 1; }
read -p 'Now the lock should be active. Press enter to release.'
exit

Но я все еще могу использовать, например, sudo apt install , поэтому apt не думает, что файл заблокирован.

0
задан 20 December 2019 в 16:36

2 ответа

Вы можете попробовать построить перехватчик. Переместите двоичный файл apt в другое место (используйте which apt , чтобы узнать, где он находится). Переименуйте его во что-то вроде apt-old , затем как root создайте сценарий оболочки в том месте, где у вас изначально был apt , сделайте его исполняемым и сделайте так, чтобы он выглядел примерно так:

apt-old $ @

Это будет автоматически передавать любые аргументы, которые вы передаете своему скрипту-перехватчику, в исходный двоичный файл apt , что означает, что вы можете поместить все, что захотите, перед этой строкой, и она будет выполнять его при каждом запуске, например, вы можете добавить свою собственную проверку блокировки файла:

#!/usr/bin/bash
if [ -f "/var/file_lock" ]; then
  echo "A program has superior rights to apt at this time."
  exit 1
else
  apt-old $@
fi

Это позволит вам заставить программы, вызывающие apt , использовать другую проверку файла, созданную вашей программой.Это дает вам свободу создавать его где и когда вам нравится, и при этом вы можете использовать собственные механизмы блокировки файлов apt.

Обратите внимание, что это не отключит исходный двоичный файл apt, вы просто перемещаете его так, чтобы ваш сценарий занял свое место в пути.

1
ответ дан 26 December 2019 в 13:06

flock (1) управляет блокировками flock (2), тогда как dpkg и apt используют блокировки fcntl (2). В Linux два типа блокировок полностью независимы.

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

Чтобы делать то, что вы хотите, напишите сценарий Python, используя python3-apt. Это позволяет поддерживать блокировку внешнего интерфейса на протяжении всей операции, обеспечивая правильную работу.

Невозможно сделать это правильно из оболочки, так как мы еще не разрешаем вызывающим apt (1) и друзьям удерживать блокировку внешнего интерфейса. Вероятно, имеет смысл разрешить и это.

1
ответ дан 29 December 2019 в 00:20

Другие вопросы по тегам:

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