/ etc / motd tidak ditampilkan ketika pipa bernama?

8

Menjalankan Gentoo 3.4.0

Setelah baru-baru ini mendengar tentang file / etc / motd, saya mencoba untuk membuatnya menampilkan keberuntungan cowsay acak. Saya menulis beberapa bash script acak untuk bertindak sebagai daemon, memberi makan / etc / motd sebagai pipa bernama, seperti yang terlihat di beberapa forum.

Saya tidak berpikir ada masalah dengan skrip karena cating pipa berfungsi dengan baik, tetapi MOTD tidak akan ditampilkan saat login (menggunakan file biasa berfungsi)!

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                      |
\ <[email protected]>      /
 --------------------------------------- 
   \
    \
        .--.
       |o_o |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/`\
    \___)=(___/

Apakah saya kehilangan sesuatu yang jelas?

Tidak menggunakan sesuatu seperti .hushlogin atau yang lainnya, mencoba menggunakan beberapa shell, pipa dapat dibaca + r.

Fira
sumber

Jawaban:

7

Anda tidak melewatkan sesuatu yang jelas. Saya menggali sumber pam_motdmodul untuk mencari tahu yang ini.

Kuncinya adalah pam_motdmelakukan hal berikut dengan /etc/motd:

  1. Periksa ukuran file.
  2. Alokasikan buffer ukuran itu.
  3. Baca seluruh file ke dalam buffer.
  4. Keluarkan buffer melalui metode output apa pun yang digunakan. (Bagaimanapun, PAM bersifat modular; tidak dapat menganggap itu terminal.)

Karena pipa tidak memiliki ukuran file, ini gagal pada langkah 1.

EDIT : Mengapa PAM peduli tentang ukuran di tempat pertama? Saya membayangkan itu untuk mencegah penolakan layanan, baik disengaja atau tidak disengaja. Ketika PAM memeriksa ukuran file, itu juga menolak untuk mengeluarkan motd jika file lebih besar dari 64 kbytes. Saya membayangkan siapa pun yang mencoba masuk ke sistem akan sangat sedih jika seseorang berhasil menyalurkan file film DVD ke / etc / motd, misalnya - belum lagi berapa banyak memori yang mungkin diperlukan.

Jander
sumber
Nah, pada akhirnya saya baru saja membangun kembali PAM dengan tambalan khusus sehingga akan membaca pipa dengan benar jika itu salah satu => pastebin.com/bMpbLskH
Fira
Open source memang luar biasa. ^ _ ^ Saya menambahkan pemikiran saya tentang mengapa PAM memeriksa file, yang saya pikir Anda mungkin curigai dari catatan "perlu pemeriksaan lebih lanjut" di tambalan Anda. Saya kira hal yang paling mudah untuk dilakukan adalah berhenti membaca pipa setelah 64k.
Jander
2

Tautan ini akan memandu Anda melalui semua langkah penting

bunga aster
sumber
1
Bagus. Anda harus menambahkan langkah-langkah secara langsung dalam jawaban juga, jadi jika tautan tersebut terputus di masa depan, jawaban Anda akan tetap berguna.
Jander
Jadi, nonaktifkan MotD, dan tampilkan sesuatu secara manual? Kenapa tidak, tetapi bisakah saya melakukan ini secara global, independen dari bash? Saya menggunakan ZSH sehingga isi dari / etc / profiles tidak dieksekusi
Fira