Saya mencoba untuk mengkompilasi beberapa sumber menggunakan makefile. Dalam makefile ada sekelompok perintah yang harus berlari sebagai sudo
.
Ketika saya menyusun sumber-sumber dari terminal semua berjalan baik-baik saja dan membuat berhenti pertama kali sudo
perintah berlari menunggu password. Setelah saya ketik kata sandi anda, membuat resume dan melengkapi.
Tapi aku akan ingin untuk dapat menyusun sumber-sumber di NetBeans. Jadi, saya memulai sebuah proyek dan menunjukkan netbeans di mana untuk menemukan sumber-sumber, tapi ketika saya mengkompilasi proyek ini memberikan error:
sudo: no tty present and no askpass program specified
Pertama kalinya hits sudo
perintah.
Saya telah mencari masalah di internet dan semua solusi yang saya temukan titik ke satu hal: menonaktifkan password untuk user ini. Karena pengguna yang dimaksud di sini adalah akar. Saya tidak ingin melakukan itu.
Apakah ada solusi lain?
Pemberian pengguna untuk menggunakan perintah tersebut tanpa meminta password harus menyelesaikan masalah. Pertama buka shell console dan ketik:
sudo visudo
Kemudian edit file tersebut untuk menambahkan ke akhir:
username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
misalnya
john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop
akan memungkinkan pengguna john
sudo poweroff
, mulai
dan stop
tanpa diminta untuk password.
Terlihat di bagian bawah layar untuk penekanan tombol yang anda butuhkan untuk digunakan dalam visudo - ini bukan vi dengan cara - dan keluar tanpa menyimpan pada tanda pertama dari masalah. Peringatan kesehatan: merusak file ini akan memiliki konsekuensi serius, edit dengan hati-hati!
Coba:
NOPASSWD
line untuk semua perintah, yang saya maksud:jenkins ALL=(ALL) NOPASSWD: ALL
sudoers
file.Yang bekerja untuk saya (Ubuntu 14.04).
Setelah semua alternatif, saya menemukan:
sudo -S <cmd>
- S (stdin) pilihan penyebab sudo untuk membaca password dari standar input, bukan dari perangkat terminal.
Perintah di atas masih membutuhkan password untuk masuk. Untuk menghapus memasukkan password secara manual, dalam kasus-kasus seperti jenkins, perintah ini bekerja:
echo <password> | sudo -S <cmd>
sudo
secara default akan membaca password dari terminal terpasang. Masalah anda adalah bahwa tidak ada terminal yang terpasang saat ini adalah lari dari netbeans konsol. Jadi anda harus menggunakan cara alternatif untuk memasukkan password: yang disebut askpass program.
The askpass program ini bukan program tertentu, tapi setiap program yang dapat meminta password. Misalnya dalam sistem saya x11-ssh-askpass
bekerja dengan baik.
Dalam rangka untuk melakukan itu anda harus menentukan program apa yang digunakan, baik dengan variabel lingkungan SUDO_ASKPASS
atau di sudo.conf
file (lihat man sudo
untuk rincian).
Anda dapat memaksa sudo
untuk menggunakan askpass program dengan menggunakan opsi -A
. Secara default akan menggunakannya hanya jika tidak ada aplikasi yang terpasang terminal.
Untuk Ubuntu 16.04 pengguna
Ada file yang harus anda baca dengan:
cat /etc/sudoers.d/README
Menempatkan suatu file dengan mode 0440 di /etc/sudoers.d/myuser dengan konten berikut:
myuser ALL=(ALL) NOPASSWD: ALL
Harus memperbaiki masalah.
Jangan lupa untuk:
chmod 0440 /etc/sudoers.d/myuser
Jika kebetulan anda datang ke sini karena anda dapat't sudo di Ubuntu yang datang dengan Windows10
Edit /etc/hosts file dari Windows (dengan Notepad), it'll berada di: %localappdata\lxss\jika anda ingin membangun\etc
, tambahkan 127.0.0.1 WINDOWS8
, hal ini akan menyingkirkan kesalahan pertama yang dapat't menemukan host.
Untuk menyingkirkan tidak tty hadir
kesalahan, selalu melakukan sudo -S <command>
Login ke linux. Kebakaran perintah berikut. Hati-hati, seperti editing sudoer adalah proposisi berisiko.
$ sudo visudo
Sekali vi editor terbuka membuat perubahan berikut:
Default requiretty
jenkins ALL=(ALL) NOPASSWD: ALL
Dalam Jenkins:
echo '<your-password>' | sudo -S command
Misalnya:-
echo '******' | sudo -S service nginx restart
Anda dapat menggunakan Masker Password Plugin untuk menyembunyikan kata sandi
Ini bekerja untuk saya:
echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
di mana anda pengguna "myuser"
untuk gambar Docker, yang hanya akan:
RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
Pastikan perintah yang anda're sudo mkdir adalah bagian dari
JALAN`.
Jika anda memiliki satu (atau beberapa, tetapi tidak SEMUA) perintah sudoers
entri, anda'll mendapatkan sudo: tidak ada tty hadir dan tidak askpass program yang ditentukan
ketika perintah ini bukan bagian dari jalan anda (dan path lengkap tidak ditentukan).
Anda dapat memperbaikinya dengan menambahkan perintah ke JALAN
atau memanggil dengan path absolut, yaitu
sudo /usr/sbin/pustaka gdk
Bukan
sudo pustaka gdk
Perintah sudo
gagal karena mencoba untuk meminta pada root password dan tidak ada pseudo-tty dialokasikan (seperti's bagian dari script).
Anda perlu log-in sebagai root untuk menjalankan perintah ini atau set-up 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 anda milik user admin
kelompok (atau roda
).
Idealnya (lebih aman) itu akan membatasi hak akses root hanya untuk perintah tertentu yang dapat ditetapkan sebagai %admin ALL=(ALL) NOPASSWD:/path/ke/program
Saya pikir saya dapat membantu seseorang dengan kasus saya.
Pertama, saya mengubah pengaturan pengguna pada /etc/sudoers
mengacu pada jawaban di atas. Tapi Itu masih tidak't bekerja.
myuser ALL=(ALL) NOPASSWD: ALL
%mygroup ALL=(ALL:ALL) ALL
Dalam kasus saya, myuser
di mygroup
.
Dan saya didn't perlu kelompok. Jadi, dihapus garis itu.
(Seharusnya't menghapus baris yang seperti saya, hanya menandai komentar.)
myuser ALL=(ALL) NOPASSWD: ALL
Ia bekerja!
Menjalankan shell script yang berisi perintah sudo di dalamnya dari jenkins mungkin tidak berjalan seperti yang diharapkan. Untuk memperbaiki ini, ikuti bersama
Langkah-langkah sederhana:
Pada sistem berbasis ubuntu, jalankan " $ sudo visudo "
ini akan membuka /etc/sudoers file.
Jika anda jenkins pengguna sudah di file tersebut, kemudian ubah ke tampilan seperti ini:
jenkins ALL=(ALL) NOPASSWD: ALL
simpan file
Peluncuran anda jenkins pekerjaan
anda seharusnya melihat pesan kesalahan itu lagi :)
Saya mendapatkan error ini karena saya terbatas saya pengguna hanya executable tunggal 'systemctl' dan telah terkonfigurasi dengan visudo file.
Berikut ini's apa yang saya punya:
jenkins ALL=NOPASSWD: systemctl
Namun, anda perlu menyertakan path lengkap untuk eksekusi, bahkan jika itu adalah pada jalur anda secara default, misalnya:
jenkins ALL=NOPASSWD: /bin/systemctl
Hal ini memungkinkan saya jenkins pengguna untuk me-restart layanan tetapi tidak memiliki akses root penuh
Untuk referensi, dalam kasus orang lain yang mengalami masalah yang sama, saya terjebak selama satu jam baik dengan ini kesalahan yang seharusnya tidak terjadi karena saya menggunakan NOPASSWD parameter.
Apa yang saya TIDAK tahu adalah bahwa sudo mungkin menimbulkan kesalahan yang sama persis pesan ketika tidak ada tty dan perintah pengguna mencoba untuk memulai adalah bukan bagian dari yang diperbolehkan perintah di /etc/sudoers file.
Berikut contoh sederhana dari saya isi file dengan masalah saya:
bguser ALL = NOPASSWD: \
command_a arg_a, \
command_b arg_b \
command_c arg_c
Ketika bguser akan mencoba untuk memulai "sudo command_b arg_b" tanpa tty (bguser digunakan untuk beberapa daemon), maka ia akan mengalami kesalahan "tidak ada tty hadir dan tidak askpass program tertentu".
Mengapa?
Karena koma yang hilang pada akhir baris di /etc/sudoers file...
(Saya bahkan bertanya-tanya apakah ini adalah perilaku yang diharapkan dan bukan bug di sudo sejak pesan kesalahan yang benar untuk kasus seperti shoud be "Maaf, pengguna bguser tidak diperbolehkan untuk melaksanakan dll.")
Kesalahan ini dapat juga muncul ketika anda mencoba untuk menjalankan sebuah perintah terminal (yang membutuhkan root password) dari beberapa non-shell script, misal sudo ls
(di backticks) dari program Ruby. Dalam hal ini, anda dapat menggunakan Berharap utilitas (http://en.wikipedia.org/wiki/Expect) atau alternatif.
Misalnya, di Ruby untuk mengeksekusi sudo ls
tanpa sudo: tidak ada tty hadir dan tidak askpass program yang ditentukan
, anda dapat menjalankan ini:
require 'ruby_expect'
exp = RubyExpect::Expect.spawn('sudo ls', :debug => true)
exp.procedure do
each do
expect "[sudo] password for _your_username_:" do
send _your_password_
end
end
end
[ini menggunakan salah satu alternatif untuk Berharap TCL ekstensi: ruby_expect gem].
Pilihan lain, tidak didasarkan pada NOPASSWD:
Tidak ada yang mengatakan apa yang bisa menyebabkan kesalahan ini, dalam kasus migrasi dari satu host ke yang lain, ingat tentang memeriksa hostname di file sudoers:
Jadi, ini adalah saya /etc/sudoers config
User_Alias POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL
jika itu doesn't pertandingan
uname -a
Linux other_hostname 3.10.17 #1 SMP Wed Oct 23 16:28:33 CDT 2013 x86_64 Intel(R) Core(TM) i3-4130T CPU @ 2.90GHz GenuineIntel GNU/Linux
maka akan muncul error ini:
tidak ada tty hadir dan tidak askpass program yang ditentukan