ограничить частный репозиторий apt с помощью rssh - почему apt-get пытается / bin / sh?

Можно дать попытку:

  1. Studio SUSE
  2. Разработчик Ubuntu
5
14.09.2015, 14:43
2 ответа

Если вы хотите выполнить много команд после запуска терминала, то лучшим подходом было бы записать функцию, экспортировать ее и вызвать эту функцию. Создайте сценарий оболочки, подобный приведенному ниже:

my_function(){
    command1
    command2
    .
    .
    .
    commandn
}

export -f my_function

$(x-terminal-emulator -e "bash -c 'my_function'")

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

-121--99416-

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

Добавить rfkill unblock wifi или rfkill unblock wlan в /etc/rc.local

Для этого в Ubuntu 14,04 используйте текстовый редактор gedit (или избранный):

sudo gedit /etc/rc.local
-121-145446-

У вас нет пути избегать этого

При использовании метода ssh по умолчанию apt необходимо войти на удаленный сервер, вызвать /bin/sh для получения доступа к оболочке и выполнить некоторую работу с некоторыми утилитами GNU, такими как find , dd .

Исходный код apt подтвердил его:

 157       Args[i++] = "/bin/sh";
 158       Args[i] = 0;
 159       execvp(Args[0],(char **)Args);
 160       exit(100);

(Удивительно, что apt по-прежнему использует find с опцией -follow , которая помечена как устаревшая)

1
27.01.2020, 20:42

Что APT делает удаленно

Я создал тестовый аккаунт и регистрировал каждую команду apt, выполненную на удаленном сервере, используя простой скрипт в качестве замены для оболочки владельца репозитория. Очевидно, apt порождает удаленную оболочку, чтобы чтобы найти полный путь к известным файлам::

2015-09-14: Executing 'sh -c /bin/sh'; input and output follows:
find /tmp/repo/./InRelease -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Release.gpg -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Release -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Packages.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./it_CH.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./it.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./en.bz2 -follow -printf '%s\n' 2> /dev/null || echo

find /tmp/repo/./Packages.xz -follow -printf '%s\n' 2> /dev/null || echo

...

Поэтому, я думаю, вы не можете ограничить действия пользователя репозитория через rssh, поскольку: (1) команды, которые должны быть выполнены, передаются в удаленной оболочке через STDIN (в отличие от функции SSH remote exec), и (2) команды являются конвейерами оболочки.

Обходные пути?

Если вы все еще хотите ограничить действия, выполняемые пользователем репозитория удаленно, я вижу два пути:

  • Установите оболочку пользователя repo на rbash вместо этого, и предоставить настраиваемый параметр $PATH, содержащий только те команды, которые должны быть запущены. (Обязательно установите $PATH и снимите установку другие переменные оболочки из начального файла, который не может быть написан от пользователя репозитория). Это все еще оставляет возможность любому человеку имеющего полномочия доступа, прочитать любой файл в системе.

  • Создайте chroot jail только с файлами repo и любыми командами, необходимыми для APT. APT, и установите оболочку пользователя repo на скрипт или программу, которая выполняет chroot /jail "$@" вместо этого.

Логирование apt-get update действий

Вот скрипт, который я использовал для логирования действий, выполняемых удаленно:

#!/bin/sh

echo "$(date -I): executing 'sh $@'; input and output follows" >> /tmp/sh.log
tee -a /tmp/sh.log | /bin/sh "$@" | tee -a /tmp/sh.log
1
27.01.2020, 20:42

Теги

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