Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

In my .bashrc there are a couple commands which redirect standard error to /dev/null, and this is not allowed within rbash:

bash: /dev/null: restricted: cannot redirect output

Is there some way to get around this (short of modifying Bash)? That is, to either

  • discard standard error some other way or
  • only attempt to redirect if it's allowed.
share|improve this question

2 Answers 2

up vote 4 down vote accepted

You can close stderr as in:

ls /blah 2>&-

While that will work in most cases, it may cause problems as poorly written applications may end up opening a new file which would automatically get 2 as the file descriptor and could end up writing error messages where you wouldn't want them to.

That also means that any write to stderr done by the application would return with an error (EBADF) which may affect their behavior.

As pipes are allowed, you could provide with a command that discards all its input. Here, using grep -v '^' (but you could use tail -n 0 or sed d or a script called discard that does cat > /dev/null):

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

You can check whether redirection to /dev/null is allowed/works or not with:

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

You can check whether the shell is restricted or not with:

case $- in
  (*r*) echo restricted
esac
share|improve this answer
    
According to man rbash you won't be able to do any redirecting (even to closed) from within the shell. I think pipes are forbidden also. –  Yuugian Jan 24 '13 at 0:38
    
@Yuugian, it's only redirections that can cause the shell to create a file that are prohibited. Input redirections (<) and pipes (which are more a way to run concurrent processes with their stdout and in connected), including process substitution and command substitution are allowed. You can double-check the manual and try it for yourself. –  Stéphane Chazelas Jan 24 '13 at 7:35
    
This actually works! Create a file test.sh with the lines echo fail >&2 and echo success, chmod u+x test.sh, PATH=$PATH:. rbash, then run test.sh and test.sh 2>&- to verify. –  l0b0 Jan 24 '13 at 9:55

From man rbash it looks like any redirect is prohibited: (the following are disallowed or not performed)redirecting output using the >, >|, <>, >&, &>, and >> redirection operators

It does look like you can spawn another shell script to do the redirect because 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.

So, while you couldn't $ foo 2>/dev/null it looks like you could run $ bar where bar contains
#/bin/bash
foo 2>/dev/null

It would have to be set up in advance from a full bash environment because rbash also disallowed specifying command names containing / which looks like it would prohibit your current directory./bar but not the implicit /bin/bar

Please note: I haven't tried this yet

share|improve this answer
1  
If you can do that, it is surely a bug in restricted bash... –  vonbrand Jan 23 '13 at 21:57
    
that's why I was thinking that you would have to set it up from outside the rbash. If your cwd is not in $PATH then it is not much of a hole. rbash keeps you from using cd, calling a program not in $PATH, or changing $PATH –  Yuugian Jan 24 '13 at 0:41

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.