Я не думаю, что это - полностью проблема удара.
В комментарии Вы сказали наблюдение этой ошибки после выполнения
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
в другую учетную запись или делают что-то подобное; если Вы просто входите в учетную запись, полномочия корректны.
Можно использовать dpkg
система рычага для перемонтирования его - вставила это /etc/apt/apt.conf.d/00exectmp
:
DPkg::Pre-Invoke {"mount -o remount,exec /tmp";};
DPkg::Post-Invoke {"mount -o remount /tmp";};
Бормотание, можно просто заменить 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. Никакая потребность изменить систему.
apt
пакет обновлен, который является. Я не рекомендую смешать с файлами, предоставленными пакетами.
– reinierpost
12.10.2016, 17:25