シェル出力リダイレクトを使用せずにコマンドラインからファイルに書き込む方法は? [コピー]

シェル出力リダイレクトを使用せずにコマンドラインからファイルに書き込む方法は? [コピー]

私は試みる:

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

dmesg ログにメッセージを書き込みます。これは「sudo」の出力を/dev / kmsgにリダイレクトするため、「許可されていません」というエラーが発生します。したがって、「echo」コマンドはrootとして実行され、/ 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シェルシステムログモジュールのコマンドラインインタフェースであるコマンドを使用します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'

関連情報