sudo: tidak ada tty sekarang dan tidak ada program askpass yang ditentukan

73

Saat mencoba menjalankan biner jarak jauh menggunakan sudopada kotak jarak jauh:

ssh remotehost "sudo ./binary"

Saya melihat kesalahan ini:

sudo: tidak ada tty sekarang dan tidak ada program askpass yang ditentukan

Bagaimana saya bisa mengatasi ini?

EDIT ini pasti bukan duplikat dari pertanyaan yang disarankan seperti itu. Jawabannya sama sekali tidak relevan. Bahkan, perubahan-perubahan pada file sudoers sudah diterapkan ke host jarak jauh.

Drew Noakes
sumber

Jawaban:

78

Cara sederhana adalah menentukan -t:

ssh -t remotehost "sudo ./binary"

Dari halaman manual:

Paksa alokasi pseudo-tty. Ini dapat digunakan untuk menjalankan program berbasis layar yang sewenang-wenang pada mesin jarak jauh, yang bisa sangat berguna, misalnya saat mengimplementasikan layanan menu. Opsi -t ganda memaksa alokasi tty, bahkan jika ssh tidak memiliki tty lokal.

Saya tidak bisa menjelaskan dengan tepat mengapa ini bekerja, dan mungkin ada cara yang lebih baik. Saya ingin mendengarnya jika demikian :)

@psusi menjelaskan mengapa ini berfungsi dalam komentar di bawah.

Drew Noakes
sumber
14
Ini berfungsi karena sudomemerlukan tty untuk meminta kata sandi, dan ketika menentukan perintah untuk dijalankan ssh, itu tidak mengalokasikannya secara default karena ini biasanya digunakan untuk menjalankan perintah non-interaktif yang dapat mentransfer data biner, yang dapat meningkatkan tty .
psusi
@psusi Apakah Anda tahu jawaban untuk pertanyaan terkait ini? unix.stackexchange.com/questions/110841
trusktr
Ada juga -tt, diperlukan ketika melewati perintah menggunakan heredoc
Rufus
26

Pertanyaan:

Bagaimana saya bisa mengatasi ini?

sudo: no tty present and no askpass program specified

Jawaban Alternatif

Sebagai alternatif, cobalah:

sudo -S ./binary

Ini mengarahkan sudo untuk membaca kata sandi dari input standar, stdin.

Skenario di mana ini Membantu

Di lingkungan chroot, jawaban lain ini mungkin tidak berfungsi dengan benar ... mungkin karena:

  1. / etc / shadow vs / etc / passwd konflik tidak memungkinkan pengguna untuk memasukkan kata sandi.
  2. Dalam lingkungan chroot-ed, akses ke tty1 dapat menjadi sedikit glitchy, dan ctrl-alt f2 - hingga tty2 tidak layak, karena merupakan tty dari lingkungan non-chroot-ed.

Sebagai contoh: Secara manual menginstal / memperbaiki linux atau bootloader, menggunakan lingkungan chroot, (seperti Archlinux dan arch-chroot).

elika kohen
sumber
Saya mendapatkan sudo: ./binary: perintah tidak menemukan kesalahan ketika saya menjalankan sudo -S ./binary, apa yang menyebabkannya?
Ajit Goel
5

Anda perlu menentukan terminal / aplikasi yang akan membaca kata sandi. Ada dua varian:

  1. export SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass
  2. vim /etc/sudoers (Default visiblepw)
pengguna282246
sumber
11
Apakah lebih baik tidak digunakan visudodaripada vim /etc/sudoersmenghindari berpotensi mengunci diri Anda dari mesin Anda karena telah membuat kesalahan dalam pengeditan Anda?
Drew Noakes
2

Gagal, karena sudomencoba untuk meminta kata sandi root dan tidak ada pseudo-tty yang dialokasikan.

Anda harus masuk sebagai root atau mengatur aturan berikut di /etc/sudoers (atau sudo visudo:):

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

Kemudian pastikan bahwa pengguna Anda milik admingrup (atau wheel).

kenorb
sumber
sementara ini tidak benar (tidak ada bukti yang diberikan untuk ini, dan pengguna dalam grup admin dengan kode itu dalam sistem centos dan ubuntu masih mendapatkan kesalahan), itu adalah tip yang bagus untuk membuat ulang grup dan aturan berdasarkan grup-grup untuk tugas yang meningkat
MrMesees
2

Anda juga dapat membuat file seperti "sudo_shutdown" di /etc/sudoers.d, dengan konten:

# Allow admins to shutdown without pass
%adm ALL=(ALL) NOPASSWD: /sbin/shutdown

Ini memungkinkan pengguna yang ada di grup adm untuk mematikan tanpa kata sandi.

Peter
sumber
3
Apakah Anda bermaksud mengedit ini untuk membahas "no tty present"
Penatua Geek
2

Dalam kasus saya, saya telah menerima kesalahan ini karena saya tidak menentukan perintah yang ingin saya gunakan sebagai root di sudoers

Sesuatu seperti

/etc/sudoers.d/myuser:

myuser ALL=(root) NOPASSWD: \
    /bin/ls -la

bekerja untukku

GarouDan
sumber