GNU/Linux >> Belajar Linux >  >> Linux

Ssh – Perlu Tty Untuk Menjalankan Sudo Jika Saya Bisa Sudo Tanpa Kata Sandi?

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).


Linux
  1. Bagaimana Cara Menjalankan Program Tertentu Sebagai Root Tanpa Prompt Kata Sandi?

  2. Mengizinkan Pengguna Menggunakan Sudo Tanpa Kata Sandi?

  3. Ubah Kata Sandi Root Dengan Sudo, Tanpa Su?

  1. Bagaimana cara meneruskan kata sandi ke su/sudo/ssh tanpa mengesampingkan TTY?

  2. Bagaimana saya bisa melakukan `git pull` tanpa memasukkan kembali kata sandi SSH saya?

  3. sudo tanpa kata sandi saat masuk dengan kunci pribadi SSH

  1. Ssh – Bagaimana Menjalankan Ssh-add Secara Otomatis, Tanpa Prompt Kata Sandi?

  2. Jalankan ifconfig tanpa sudo

  3. Cara mengeksekusi perintah ssh dari jarak jauh perintah sudo tanpa kata sandi