сцепитесь сценарий в Кв. - добираются

Я не думаю, что это - полностью проблема удара.

В комментарии Вы сказали наблюдение этой ошибки после выполнения

sudo su username2

при входе в систему как username. Это su это инициировало проблему.

/dev/stdout символьная ссылка на /proc/self/fd/1, который является символьной ссылкой на, например, /dev/pts/1. /dev/pts/1, то, которое является псевдотерминалом, принадлежит, и перезаписываемое, username; то владение предоставили когда username зарегистрированный. Когда Вы sudo su username2, владение /dev/pts/1 не изменяется, и username2 не имеет разрешения записи.

Я утверждал бы, что это - ошибка. /dev/stdout должен быть, в действительности, псевдоним для потока стандартного вывода, но здесь мы видим ситуацию где echo hello работы, но echo hello > /dev/stdout сбои.

Одно обходное решение должно было бы сделать username2 член группы tty, но это дало бы username2 разрешение записать в любой tty, который является, вероятно, нежелательным.

Другое обходное решение должно было бы войти в username2 считайте вместо использования su, так, чтобы /dev/stdout точки к недавно выделенному псевдотерминалу, принадлежавшему username2. Это не могло бы быть практично.

Другое обходное решение должно было бы изменить Ваши сценарии, таким образом, они не обращаются к /dev/stdout и /dev/stderr; например, замените это:

echo OUT > /dev/stdout
echo ERR > /dev/stderr

этим:

echo OUT
echo ERR 1>&2

Я вижу это в своей собственной системе, Ubuntu 12.04, с ударом 4.2.24 - даже при том, что документ удара (info bash) в моей системе говорит это /dev/stdout и /dev/stderr рассматриваются особенно при использовании в перенаправлениях. Но даже если удар не рассматривает те имена особенно, они должны все еще действовать как эквиваленты для стандартных потоков ввода-вывода. (POSIX не упоминает /dev/std{in,out,err}, таким образом, может быть трудно утверждать, что это - ошибка.)

Смотря на старые версии удара, документация подразумевает это /dev/stdout и др. рассматриваются особенно, существуют ли файлы или нет. Функция была представлена в ударе 2.04, и NEWS файл для той версии говорит:

Код перенаправления теперь обрабатывает несколько имен файлов особенно:/dev/fd/N,/dev/stdin,/dev/stdout, и/dev/stderr, присутствуют ли они в файловой системе.

Но если Вы исследуете исходный код (redir.c), Вы будете видеть, что та специальная обработка включена только если символ HAVE_DEV_STDIN определяется (это определяется, когда удар создается из источника).

Насколько я могу сказать, никакая выпущенная версия удара не сделала специальную обработку /dev/stdout и др. безусловный - если некоторое распределение не исправило его.

Таким образом, другое обходное решение (который я не попробовал) должно было бы захватить источники удара, изменить redir.c сделать специальное предложение /dev/* обработка безусловного, и использование восстановленная версия, а не та, которая шла системой. Это - вероятно, излишество, все же.

СВОДКА:

Ваша ОС, как моя, не обрабатывает владение и полномочия /dev/stdout и /dev/stderr правильно. колотите, предположительно, рассматривает эти имена особенно в перенаправлениях, но на самом деле это делает так, только если файлы не существуют. Это не имело бы значения если /dev/stdout и /dev/stderr работавший правильно. Эта проблема только обнаруживается когда Вы su в другую учетную запись или делают что-то подобное; если Вы просто входите в учетную запись, полномочия корректны.

17
27.11.2016, 16:52
2 ответа

Можно использовать dpkgсистема рычага для перемонтирования его - вставила это /etc/apt/apt.conf.d/00exectmp:

DPkg::Pre-Invoke {"mount -o remount,exec /tmp";};
DPkg::Post-Invoke {"mount -o remount /tmp";};  
26
27.01.2020, 19:47

Бормотание, можно просто заменить apt-get с вашим сценарием.

Переместиться apt-get кому: real-apt-get и, затем, создайте названный сценарий apt-get как этот:

#!/bin/sh

mount -o remount -o ... /tmp
real-apt-get "$@"
mount -o remount -o ... -o noexec /tmp

В любом случае мне не нравится это решение. Это - более легкое изменение временная переменная среды каталога при необходимости в нем. Что-то как (sh стиль):

mkdir /root/mytmp
TMPDIR=/root/mytmp
export TMPDIR
apt-get ...
rm -rf /root/mytmp

Этот склонный путь - добирается, будет использовать /root/mytmp как временный dir. Никакая потребность изменить систему.

-1
27.01.2020, 19:47
  • 1
    ... до apt пакет обновлен, который является. Я не рекомендую смешать с файлами, предоставленными пакетами. –  reinierpost 12.10.2016, 17:25
  • 2
    Согласно предыдущему комментарию, перезаписывая предоставленные двоичные файлы пакета действительно плохая идея...! Принятый ответ выше, но даже если Вы действительно хотели продолжить что-то вроде этого, вместо этого, сохраняли сценарий как/usr/local/bin/apt-get (или лучше все еще, вероятно, ~/bin/apt-get предполагающий, что никакие другие пользователи не захотят его; также удостоверьтесь, что это находится в Вашем пути). Затем вместо того, чтобы назвать "real-apt-get" просто используют полный путь/usr/bin/apt-get. Затем можно добраться не, обновляет проблем, не повреждая сценарий. (Это полагается на/usr/local/bin, являющийся прежде/usr/bin в ПУТИ - значение по умолчанию в Debian). –  Jeremy Davis 19.05.2017, 09:31

Теги

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