Это, вероятно, будет буферизовать в awk, не кошке. В первом случае awk полагает, что это является интерактивным, потому что его ввод и вывод является TTYs (даже при том, что они - другой TTYs - я предполагаю, что awk не проверяет это). Во втором вход является каналом, таким образом, он работает нев интерактивном режиме.
Необходимо будет явно сбросить в awk программе. Это не портативно, все же.
Для большего количества фона и деталей о том, как сбросить вывод, читайте: http://www.gnu.org/software/gawk/manual/html_node/I_002fO-Functions.html
Можно закрыть 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
От 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
Пожалуйста, примите во внимание: Я еще не попробовал это
cwd
не находится в $PATH затем, это не большая часть дыры. rbash мешает Вам использовать cd
, вызов программы не в $PATH или изменении $PATH
– Yuugian
24.01.2013, 02:41
man rbash
Вы не сможете сделать любое перенаправление (даже к закрытому) из оболочки. Я думаю, что каналы запрещаются также. – Yuugian 24.01.2013, 02:38<
) и каналы (которые являются больше способом выполнить параллельные процессы с их stdout и в связанном), включая замену процесса и замену команды позволяются. Можно перепроверить руководство и попробовать его за себя. – Stéphane Chazelas 24.01.2013, 09:35echo fail >&2
иecho success
,chmod u+x test.sh
,PATH=$PATH:. rbash
, затем выполненныйtest.sh
иtest.sh 2>&-
проверить. – l0b0 24.01.2013, 11:55