Как отбросить stderr в ограниченной оболочке Bash?

Это, вероятно, будет буферизовать в awk, не кошке. В первом случае awk полагает, что это является интерактивным, потому что его ввод и вывод является TTYs (даже при том, что они - другой TTYs - я предполагаю, что awk не проверяет это). Во втором вход является каналом, таким образом, он работает нев интерактивном режиме.

Необходимо будет явно сбросить в awk программе. Это не портативно, все же.

Для большего количества фона и деталей о том, как сбросить вывод, читайте: http://www.gnu.org/software/gawk/manual/html_node/I_002fO-Functions.html

6
24.01.2013, 00:24
2 ответа

Можно закрыть stderr как в:

ls /blah 2>&-

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

Это также означает, что любая запись к stderr, сделанному приложением, возвратилась бы с ошибкой (EBADF), который может влиять на их поведение.

Поскольку каналы позволяются, Вы могли предоставить команду, которая отбрасывает весь ее вход. Здесь, использование grep -v '^' (но Вы могли использовать tail -n 0 или sed d или названный сценарий discard это делает cat > /dev/null):

{ ls /blah 2>&1 >&3 | grep -v '^'; } 3>&1

С другой стороны, у Вас мог быть независимо от того, что, запускается, к которому ограниченная оболочка запускает его с fd 3 (например), перенаправленного /dev/null (rbash 3> /dev/null), таким образом, можно затем сделать в ограниченной оболочке:

ls /blah 2>&3

Который позволяется:

$ rbash -c 'ls /blah 2>&3' 3> /dev/null
$

Можно проверить ли перенаправление к /dev/null позволяется/работается или не с:

if true 2>&- > /dev/null; then
  echo allowed
fi

Можно проверить, ограничивается ли оболочка или не с:

case $- in
  (*r*) echo restricted
esac
6
27.01.2020, 20:26
  • 1
    Согласно man rbash Вы не сможете сделать любое перенаправление (даже к закрытому) из оболочки. Я думаю, что каналы запрещаются также. –  Yuugian 24.01.2013, 02:38
  • 2
    @Yuugian, это - только перенаправления, которые могут заставить оболочку создавать файл, которые запрещаются. Перенаправления ввода (<) и каналы (которые являются больше способом выполнить параллельные процессы с их stdout и в связанном), включая замену процесса и замену команды позволяются. Можно перепроверить руководство и попробовать его за себя. –  Stéphane Chazelas 24.01.2013, 09:35
  • 3
    Это на самом деле работает! Создайте файл test.sh со строками echo fail >&2 и echo success, chmod u+x test.sh, PATH=$PATH:. rbash, затем выполненный test.sh и test.sh 2>&- проверить. –  l0b0 24.01.2013, 11:55

От man rbash похоже, что любое перенаправление запрещается: (следующее запрещено или не выполнено),redirecting output using the >, >|, <>, >&, &>, and >> redirection operators

Действительно похоже, что можно породить другой сценарий оболочки, чтобы сделать перенаправление потому что When a command that is found to be a shell script is executed, rbash turns off any restrictions in the shell spawned to execute the script.

Так, в то время как Вы не могли $ foo 2>/dev/null похоже, что Вы могли работать $ bar где панель содержит
#/bin/bash
foo 2>/dev/null

Это должно было бы быть настроено заранее от полной среды удара, потому что rbash также запретил specifying command names containing / то, которое похоже на него, запретило бы Ваш текущий каталог./bar но не неявное /bin/bar

Пожалуйста, примите во внимание: Я еще не попробовал это

2
27.01.2020, 20:26
  • 1
    Если можно сделать это, это - конечно, ошибка в ограниченном ударе... –  vonbrand 23.01.2013, 23:57
  • 2
    вот почему, я думал, что необходимо будет настроить его снаружи rbash. Если Ваш cwd не находится в $PATH затем, это не большая часть дыры. rbash мешает Вам использовать cd, вызов программы не в $PATH или изменении $PATH –  Yuugian 24.01.2013, 02:41
  • 3
    rbash воняет. Я никогда не использовал его и с удовольствием так. –  Rolf 27.03.2017, 00:39

Теги

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