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?
sumber
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?
Sebenarnya, doa tipikal dari sudo
tidak membaca kata sandi stdin
sama sekali. Sebagai gantinya, sudo
akan langsung mengakses terminal pengendali (a tty
atau pty
, melalui /dev/tty
file khusus) dan menampilkan prompt dan membaca karakter secara langsung. Ini bisa dilihat pada tgetpass.c
file di sudo
sumbernya.
Ada beberapa skenario lain:
askpass
program ditentukan, misalnya dalam -A
param, program itu akan dipanggil.sudo
untuk membaca stdin
, misalnya dengan -S
bendera - dan itu juga akan menulis prompt untuk stderr
. Inilah kasus di mana jawaban MadHatter berlaku.tty
tersedia
visiblepw
flag in sudoers
), sudo
akan melaporkan kesalahan:no tty present and no askpass program specified
sudo
akan kembali menggunakan stdin
dan stderr
bahkan jika itu tidak secara khusus diminta. Jawaban MadHatter juga akan berlaku di sini.Pipa menghubungkan sudo cat
stdout ke less
stdin, sehingga sudo cat
stdin tidak terpengaruh, dan dapat menerima kata sandi.
Adapun prompt, itu keluar sudo cat
di stderr; di bash, coba redirect dengan stdout, gunakan
sudo cat /etc/resolv.conf |& less
dan lihat betapa berbedanya responsnya.
sudo
stdin masih terhubung ke terminal dengan contoh perintah, itu tidak secara langsung relevan dengan bagaimana ia mendapatkan kata sandinya: secara defaultsudo
tidak akan meminta kata sandi melalui stdin juga tidak akan menampilkan prompt melaluistderr
- Anda dapat mencoba2>/dev/null
mengonfirmasi itu. Sebaliknya,sudo
langsung mengakses tty.