/ etc / motdが名前付きパイプのときに表示されませんか?


8

Gentoo 3.4.0の実行

/ etc / motdファイルについて最近聞いたので、ランダムなカウセーフォーチュンを表示するようにしました。いくつかのフォーラムで見られるように、デーモンとして機能するランダムなbashスクリプトをいくつか作成し、/ etc / motdを名前付きパイプとしてフィードしました。

パイプのcatingは正常に機能するため、スクリプトに問題はないと思いますが、MOTDはログイン時に表示されません(通常のファイルを使用して動作します)。

fira@nyan ~ % cat /etc/motd
 _______________________________________ 
/ We didn't put in ^^ because then we'd \
| have to keep telling people what it   |
| means, and then we'd have to keep     |
| telling them why it doesn't short     |
| circuit. :-/                          |
|                                       |
| -- Larry Wall in                      |
\ <199707300650.XAA05515@wall.org>      /
 --------------------------------------- 
   \
    \
        .--.
       |o_o |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/`\
    \___)=(___/

私は明白な何かを逃していますか?

.hushloginなどの何も使用せず、いくつかのシェルを使用してみましたが、パイプはa + rで読み取り可能です。

回答:


7

あなたは明白な何かを見逃していません。私はこれを理解するためにpam_motdモジュールソースを掘り下げました。

トリックはpam_motd次のことを行うこと/etc/motdです:

  1. ファイルのサイズを確認してください。
  2. そのサイズのバッファを割り当てます。
  3. ファイル全体をバッファに読み込みます。
  4. 使用中の出力方法でバッファを出力します。(結局のところ、PAMはモジュール式であり、端末であるとは想定できません。)

パイプにはファイルサイズがないため、これはステップ1で失敗します。

編集:なぜPAMはそもそもサイズを気にしているのですか?私はそれが意図的または非意図的なサービス拒否を防ぐためだと思います。PAMがファイルサイズをチェックするとき、ファイルが64キロバイトより大きい場合、motdの出力も拒否します。たとえば、誰かがDVDムービーファイルを/ etc / motdにパイプできた場合、システムにログインしようとする人は誰にとっても非常に悲しいと思います。


さて、結局私はカスタムパッチを使用してPAMを再構築したので、パイプが1つである場合にパイプを正しく読み取る=> pastebin.com/bMpbLskH
Fira

オープンソースはそのように素晴らしいです。^ _ ^ PAMがファイルサイズをチェックする理由についての考えを追加しました。これは、パッチの「さらにチェックが必要」というメモから疑われたと思われます。64k後にパイプの読み取りを停止するのが最も簡単な方法だと思います。
Jander

2

このリンクは、すべての重要な手順を説明します


1
いいね。回答にも直接ステップを追加する必要があるため、将来リンクが壊れた場合でも回答は役に立ちます。
Jander

それで、MotDを無効にして、代わりに手動で何かを表示しますか?なぜそうしないのですが、bashに依存せずにグローバルな方法でこれを行うことができますか?ZSHを使用しているため、/ etc / profilesの内容は実行されません
Fira
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.