Mengapa kata sandi yang masuk berfungsi dalam perintah sudo yang disalurkan?

25

Jika aku melakukan:

sudo cat /etc/resolv.conf | less

Ini akan meminta saya untuk kata sandi, meskipun kurang (mungkin) membutuhkan stdin. Atas apa fd adalah prompt kata sandi ditampilkan dan bagaimana cara mendapatkan input kembali?

Karlo
sumber

Jawaban:

48

Sebenarnya, doa tipikal dari sudotidak membaca kata sandi stdinsama sekali. Sebagai gantinya, sudoakan langsung mengakses terminal pengendali (a ttyatau pty, melalui /dev/ttyfile khusus) dan menampilkan prompt dan membaca karakter secara langsung. Ini bisa dilihat pada tgetpass.cfile di sudosumbernya.

Ada beberapa skenario lain:

  • Jika suatu askpassprogram ditentukan, misalnya dalam -Aparam, program itu akan dipanggil.
  • Jika tidak, jika Anda secara khusus meminta sudountuk membaca stdin, misalnya dengan -Sbendera - dan itu juga akan menulis prompt untuk stderr. Inilah kasus di mana jawaban MadHatter berlaku.
  • Jika tidak, jika tidak ttytersedia
    • Jika gema kata sandi dinonaktifkan (secara default, dikontrol oleh visiblepwflag in sudoers), sudoakan melaporkan kesalahan:no tty present and no askpass program specified
    • Kalau tidak, sudoakan kembali menggunakan stdindan stderrbahkan jika itu tidak secara khusus diminta. Jawaban MadHatter juga akan berlaku di sini.
Bob
sumber
10

Pipa menghubungkan sudo catstdout ke lessstdin, sehingga sudo catstdin tidak terpengaruh, dan dapat menerima kata sandi.

Adapun prompt, itu keluar sudo catdi stderr; di bash, coba redirect dengan stdout, gunakan

sudo cat /etc/resolv.conf |& less

dan lihat betapa berbedanya responsnya.

MadHatter mendukung Monica
sumber
16
Walaupun jawaban ini benar karena sudostdin masih terhubung ke terminal dengan contoh perintah, itu tidak secara langsung relevan dengan bagaimana ia mendapatkan kata sandinya: secara default sudotidak akan meminta kata sandi melalui stdin juga tidak akan menampilkan prompt melalui stderr- Anda dapat mencoba 2>/dev/nullmengonfirmasi itu. Sebaliknya, sudolangsung mengakses tty.
Bob