제한된 Bash 쉘에서 stderr을 삭제하는 방법은 무엇입니까?

제한된 Bash 쉘에서 stderr을 삭제하는 방법은 무엇입니까?

내 .bashrc에는 여러 명령이 있습니다.표준 오류를 /dev/null로 리디렉션이며 다음 범위에서는 허용되지 않습니다 rbash.

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

Bash를 수정하는 것 외에 이 문제를 해결할 수 있는 방법이 있나요? 즉, 혹시

  • 그렇지 않으면 표준 오류를 버리거나
  • 허용되는 경우에만 리디렉션을 시도하십시오.

답변1

다음과 같이 stderr를 끌 수 있습니다:

ls /blah 2>&-

이는 대부분의 경우 작동하지만 잘못 작성된 응용 프로그램이 자동으로 파일 설명자 역할을 하는 새 파일을 열 수 2있고 예상하지 못한 오류 메시지가 나타날 수 있기 때문에 문제가 발생할 수 있습니다.

이는 또한 애플리케이션이 stderr에 쓰는 모든 작업이 오류(EBADF)를 반환하여 해당 동작에 영향을 미칠 수 있음을 의미합니다.

파이프가 허용되므로 모든 입력을 삭제하는 명령을 제공할 수 있습니다. 여기에서는 다음을 사용합니다 (단, 또는 이라는 스크립트를 grep -v '^'사용할 수도 있음 ) .tail -n 0sed ddiscardcat > /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

참고: 아직 시도해 본 적이 없습니다.

관련 정보