Itu mungkin karena /etc/sudoersfile Anda (atau file apa pun yang termasuk) memiliki:
Defaults requiretty
... yang membuatnya sudomembutuhkan TTY. Sistem Red Hat (RHEL, Fedora ...) telah diketahui membutuhkan TTY dalam sudoersfile default . Itu tidak memberikan manfaat keamanan nyata dan dapat dihapus dengan aman.
Red Hat telah mengakui masalahnya dan itu akan dihapus di rilis mendatang.
Jika mengubah konfigurasi server bukanlah suatu opsi, sebagai solusi untuk kesalahan konfigurasi tersebut, Anda dapat menggunakan opsi -tatau -ttopsi sshyang memunculkan terminal semu di sisi jarak jauh, tetapi berhati-hatilah bahwa ia memiliki sejumlah sisi. efek.
-ttdimaksudkan untuk penggunaan interaktif. Ini menempatkan terminal lokal dalam rawmode sehingga Anda berinteraksi dengan terminal jarak jauh. Itu berarti bahwa jika sshI / O bukan dari / ke terminal, itu akan memiliki efek samping. Misalnya, semua masukan akan bergema kembali, karakter terminal khusus ( ^?, ^C, ^U) akan menyebabkan pengolahan khusus; pada output, LFs akan dikonversi ke CRLFs ... (lihat jawaban untuk Mengapa file biner ini diubah? untuk lebih jelasnya.
Untuk meminimalkan dampak, Anda dapat memintanya sebagai:
ssh -tt host 'stty raw -echo; sudo ...' < <(cat)
The < <(cat)akan menghindari pengaturan dari terminal lokal (jika ada) di rawmodus. Dan kami menggunakan stty raw -echountuk menetapkan disiplin garis terminal jarak jauh sebagai lewat (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 untuk menunda pengiriman sesuatu untuk input sampai itu terjadi).
Perhatikan bahwa karena output dari perintah jarak jauh akan menuju terminal, itu masih akan mempengaruhi buffering-nya (yang akan berbasis garis untuk banyak aplikasi) dan efisiensi bandwidth sejak TCP_NODELAYdinyalakan. Juga dengan -tt, sshatur IPQoS lowdelaysebagai lawan 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 end-of-file pada stdin dan stdout dan stderr dari perintah jarak jauh digabung menjadi satu aliran.
Jadi, tidak begitu bagus untuk bekerja.
Jika Anda sudah suatu punya cara untuk menelurkan sebuah pseudo-terminal di remote host (seperti dengan expect, zsh, socat, perl's IO::Pty...), maka itu akan lebih baik untuk menggunakannya untuk membuat pseudo-terminal untuk melampirkan sudoke (tapi bukan untuk I / O), dan digunakan sshtanpa -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).
requirettydi sudoers default-nya. Ini akan diperbaiki dalam rilis yang lebih baru