쉘 출력 리디렉션을 사용하지 않고 명령줄에서 파일에 어떻게 쓸 수 있습니까? [복사]

쉘 출력 리디렉션을 사용하지 않고 명령줄에서 파일에 어떻게 쓸 수 있습니까? [복사]

나는 시도한다:

sudo echo "$USER: my message" > /dev/kmsg

dmesg 로그에 메시지를 씁니다. 이는 "sudo"(더 이상 권한이 없지만)의 출력을 /dev/kmsg로 리디렉션하기 때문에 "권한 거부됨" 오류가 발생합니다. 따라서 "echo" 명령은 루트로 실행되고 /dev/kmsg에 쓰기는 나로 실행됩니다. "echo" 명령을 참조하여 리디렉션(">/dev/kmsg")은 sudo가 이해하지 못하는 쉘 서비스이기 때문에 작동하지 않습니다. (해당 사용자 ID는 NOPASSWD를 사용하는 sudoers에 있습니다.)

파일 이름을 옵션으로 사용하고 해당 인수를 작성하는 Linux 명령이 있습니까? 예: "tee /dev/kmsg - 기록하려는 메시지" "logger" 명령을 알고 있지만 "dmesg"에 표시된 로그 파일에는 기록되지 않습니다. (특정 일이 언제 발생하는지 알 수 있도록 시작하는 동안 몇 가지 소식을 전파하고 싶습니다.)

이것은 작동하지만 파일을 쓸 곳이 필요하다는 문제가 있습니다.

echo "$USER: My msg" >/tmp/foo
sudo cp /tmp/foo /dev/kmsg
rm /tmp/foo

해결책ctrl-alt-delor의 설명은 다음과 같습니다.

echo "my message" | sudo tee /dev/kmsg >/dev/null

파이프와 리디렉션을 사용하지만 권한이 없는 셸에서 발생합니다. "/dev/kmsg"에 대한 권한 있는 액세스는 "sudo"의 "tee" 명령 내에서 발생합니다. 그리고 디스크 파일에 쓸 필요가 없습니다(문제가 될 수 있음).

또한 @stolenmoments 솔루션:

echo something | sudo dd of=/dev/kmsg

답변1

logger쉘 시스템 로그 모듈의 명령줄 인터페이스인 command를 사용합니다 syslog. 이 -p스위치를 사용하면 로그 메시지가 발생하는 우선 순위를 변경할 수 있으며, 이 우선 순위는 메시지가 기록되는 로그 파일을 결정하는 데 사용됩니다. 매뉴얼에서:

   -p, --priority priority
          Enter the message into the log with the specified priority.  The priority may be specified numerically or as a facility.level pair.  For example, -p local3.info logs the message as infor‐
          mational in the local3 facility.  The default is user.notice.

답변2

"이유"에 관계없이 stdin을 읽고 지정된 출력 파일에 쓰는 모든 명령이 수행됩니다. 내가 가장 좋아하는 것은 "dd"이지만 "dd"가 가리키는 것은 무엇이든 사용할 수 있을 만큼 나이가 들었습니다.

무언가를 에코 | sudo dd of=/dev/kmsg

잘 작동할 겁니다.

답변3

쉘 리디렉션이 필요하지 않은 것을 요구한다는 것을 알고 있지만 sudo다음과 같이 변경하면 명령이 작동하도록 할 수 있습니다.

sudo su -c 'echo "$USER: my message" > /dev/kmsg'

관련 정보