내 .bashrc에는 여러 명령이 있습니다.표준 오류를 /dev/null로 리디렉션이며 다음 범위에서는 허용되지 않습니다 rbash
.
bash: /dev/null: restricted: cannot redirect output
Bash를 수정하는 것 외에 이 문제를 해결할 수 있는 방법이 있나요? 즉, 혹시
- 그렇지 않으면 표준 오류를 버리거나
- 허용되는 경우에만 리디렉션을 시도하십시오.
답변1
다음과 같이 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
답변2
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는 이를 허용하지 않기 때문에 전체 bash 환경에서 미리 설정해야 합니다. 이는 현재 디렉터리를 허용하지 않지만 암시적 디렉터리는 specifying command names containing /
허용하지 않는 것처럼 보입니다../bar
/bin/bar
참고: 아직 시도해 본 적이 없습니다.