Saya telah mengonfigurasi sudo
untuk berjalan tanpa kata sandi, tetapi ketika saya mencoba ssh 'sudo Foo'
, saya masih mendapatkan pesan kesalahan sudo: sorry, you must have a tty to run sudo
.
Mengapa ini terjadi dan bagaimana cara mengatasinya?
Jawaban yang Diterima:
Itu mungkin karena /etc/sudoers
Anda file (atau file apa pun yang disertakan) memiliki:
Defaults requiretty
…yang membuat sudo
membutuhkan TTY. Sistem Red Hat (RHEL, Fedora…) diketahui membutuhkan TTY dalam sudoers
default mengajukan. Itu tidak memberikan manfaat keamanan nyata dan dapat dihapus dengan aman.
Red Hat telah mengetahui masalahnya dan akan dihapus pada rilis mendatang.
Jika mengubah konfigurasi server bukanlah pilihan, sebagai solusi untuk kesalahan konfigurasi tersebut, Anda dapat menggunakan -t
atau -tt
pilihan untuk ssh
yang memunculkan terminal semu di sisi jarak jauh, tetapi berhati-hatilah karena memiliki sejumlah efek samping.
-tt
dimaksudkan untuk penggunaan interaktif. Itu menempatkan terminal lokal di raw
mode sehingga Anda berinteraksi dengan terminal jarak jauh. Artinya jika ssh
I/O bukan dari/ke terminal, yang akan memiliki efek samping. Misalnya, semua input akan digaungkan kembali, karakter terminal khusus (^?
, ^C
, ^U
) akan menyebabkan pemrosesan khusus; pada keluaran, LF
s akan dikonversi ke CRLF
s… (lihat jawaban ini untuk Mengapa file biner ini diubah? untuk lebih jelasnya.
Untuk meminimalkan dampak, Anda dapat memanggilnya sebagai:
ssh -tt host 'stty raw -echo; sudo ...' < <(cat)
< <(cat)
akan menghindari pengaturan terminal lokal (jika ada) di raw
mode. Dan kami menggunakan stty raw -echo
untuk mengatur disiplin baris terminal jarak jauh sebagai pass through (secara efektif sehingga berperilaku seperti pipa yang akan digunakan sebagai pengganti terminal semu tanpa -tt
, meskipun itu hanya berlaku setelah perintah itu dijalankan, jadi Anda perlu menunda pengiriman sesuatu untuk input sampai itu terjadi).
Perhatikan bahwa karena output dari perintah jarak jauh akan masuk ke terminal, itu masih akan mempengaruhi bufferingnya (yang akan berbasis baris untuk banyak aplikasi) dan efisiensi bandwidth sejak TCP_NODELAY
aktif. Juga dengan -tt
, ssh
setel IPQoS ke lowdelay
sebagai lawan dari throughput
. Anda dapat mengatasi keduanya dengan:
ssh -o IPQoS=throughput -tt host 'stty raw -echo; sudo cmd | cat' < <(cat)
Juga, perhatikan bahwa itu berarti perintah jarak jauh tidak dapat mendeteksi akhir file pada stdinnya dan stdout dan stderr dari perintah jarak jauh digabungkan menjadi satu aliran.
Terkait:Debian – Hapus pengguna dan kata sandi saat login di Debian 9 Stretch?Jadi, bukan pekerjaan yang bagus.
Jika Anda memiliki cara untuk menelurkan terminal semu di host jarak jauh (seperti dengan expect
, zsh
, socat
, perl
IO::Pty
…), maka akan lebih baik menggunakannya untuk membuat terminal semu untuk melampirkan sudo
untuk (tetapi tidak untuk I/O), dan gunakan ssh
tanpa -t
.
Misalnya, dengan expect
:
ssh host 'expect -c "spawn -noecho sh -c {
exec sudo cmd >&4 2>&5 <&6 4>&- 5>&- 6<&-}
exit [lindex [wait] 3]" 4>&1 5>&2 6<&0'
Atau dengan script
(di sini dengan asumsi implementasi dari util-linux
):
ssh host 'SHELL=/bin/sh script -qec "
sudo cmd <&3 >&4 2>&5 3<&- 4>&- 5>&-
" /dev/null 3<&0 4>&1 5>&2'
(dengan asumsi (untuk keduanya) bahwa shell login dari pengguna jarak jauh adalah seperti Bourne).