Bagaimana cara memodifikasi file '/ etc / sudoers' yang tidak valid?


238

Bagaimana cara saya mengedit file sudoers yang tidak valid? Itu melempar kesalahan di bawah ini dan itu tidak memungkinkan saya untuk mengedit lagi untuk memperbaikinya.

Inilah yang terjadi:

$ sudo visudo
>>> /etc/sudoers: syntax error near line 28 <<<
sudo: parse error in /etc/sudoers near line 28
sudo: no valid sudoers sources found, quitting

2
pertanyaan yang bagus mengingat halaman ini menciptakan kesalahan help.ubuntu.com/community/RootSudoTimeout

Jawaban:


361

Pada sistem Ubuntu modern (dan banyak distribusi GNU / Linux lainnya), memperbaiki sudoersfile yang rusak sebenarnya cukup mudah, dan tidak memerlukan boot ulang, menggunakan CD langsung, atau akses fisik ke mesin.

Untuk melakukan ini melalui SSH, masuk ke mesin dan jalankan perintah pkexec visudo. Jika Anda memiliki akses fisik ke mesin, SSH tidak perlu; cukup buka jendela Terminal dan jalankan pkexecperintah itu.

Dengan asumsi Anda (atau pengguna lain) berwenang untuk menjalankan program seperti rootdengan PolicyKit, Anda dapat memasukkan kata sandi, dan kemudian akan berjalan visudoseperti root, dan Anda dapat memperbaiki /etc/sudoers.

Jika Anda perlu mengedit salah satu file konfigurasi di /etc/sudoers.d(yang jarang terjadi dalam situasi ini, tetapi mungkin), gunakan .pkexec visudo -f /etc/sudoers.d/filename

Jika Anda memiliki situasi terkait di mana Anda harus melakukan perintah administrasi sistem tambahan sebagai root untuk memperbaiki masalah (juga tidak biasa dalam keadaan ini, tetapi umum terjadi pada orang lain), Anda dapat memulai dengan root shell interaktif pkexec bash. Secara umum, setiap perintah non-grafis yang Anda jalankan sudodapat dijalankan dengan pkexecsebagai gantinya.

(Jika ada lebih dari satu akun pengguna pada sistem yang diotorisasi untuk menjalankan program seperti rootpada PolicyKit, maka untuk tindakan tersebut, Anda akan diminta untuk memilih mana yang ingin Anda gunakan, sebelum diminta kata sandi Anda.)


Jika itu tidak berhasil - misalnya, jika tidak ada pengguna yang diizinkan untuk menjalankan program sebagai root melalui PolicyKit - maka boot dari live CD Ubuntu (seperti CD yang mungkin Anda gunakan untuk menginstal Ubuntu) dan pasang sistem file untuk sistem yang diinstal. Anda dapat melakukan ini dengan menjalankan sudo parted -luntuk melihat partisi Anda - mungkin hanya ada satu partisi ext4, dan itulah sistem file root.

Misalkan filesystem root sistem Ubuntu yang terinstal ada di / dev / sda1. Maka Anda bisa memasangnya dengan sudo mount /dev/sda1 /mnt. Kemudian Anda dapat mengedit file sudoers sistem yang diinstal dengan sudo nano -w /mnt/etc/sudoers. Atau, bahkan lebih baik, Anda dapat mengeditnya dengan

sudo visudo -f /mnt/etc/sudoers

(yang akan mencegah Anda menyimpan file sudoers dengan sintaks yang salah).


7
pkexec / usr / sbin / visudo mengerjakan debian 7
marinara

10
ASTAGA! Terima kasih banyak! Disimpan bacon saya. Menambahkan file seperti yang disarankan ke direktori etc / sudoers.d / MENGGUNAKAN REGULAR TEXT EDITOR (DON-T__D-O__T-HAT !!!). Kehilangan semua kemampuan untuk melakukan privilege yang ditinggikan, TERMASUK, mengedit file yang menyinggung. Ini membantu mengedit file. Aneh, saya harus mengedit / etc / sudoers terlebih dahulu, kemudian menemukan kesalahan di file lain dan membukanya untuk saya. BAHKAN WEIRDER, perintah di / etc / sudoers 'inlcudedir /etc/sudoers.d' dikomentari, dan masih termasuk di dalamnya.
Dennis

4
@ Dennis Agak membingungkan, #includearahan dalam sudoersfile diperlakukan secara khusus; pemimpin #tidak menyebabkan sisa kalimat ditafsirkan sebagai komentar, dalam hal ini. Seperti yang man sudoersdikatakan: "Tanda pound ('#') digunakan untuk menunjukkan komentar (kecuali jika itu adalah bagian dari #include directive atau kecuali ..." Lihat juga visudo: #includedir sudoers.d (diarsipkan dari lzone.de/ blog )
Eliah Kagan

5
Pengguna saya sudoer tetapi saya mendapat kesalahan ini: Kesalahan mengeksekusi perintah sebagai pengguna lain: Tidak diotorisasi
SuB

2
Di Ubuntu 16.04, pkexec visudominta kata sandi, yang tidak menerima kata sandi yang benar. Itu melempar kesalahan "OTENTIKASI GAGAL".
Juha Untinen

54

Selalu gunakan visudountuk mengedit file sudoers Anda, jangan pernah mengeditnya sendiri secara langsung. Ini akan mencegah Anda menyimpannya ke disk kecuali itu divalidasi.


17
hindsight adalah 20/20
code_monk

4
Itu tidak akan mencegah bencana. Cukup mudah untuk menyangkal diri Anda secara sah.
Joshua

Bisakah visudo digunakan oleh scritps? Jika ya, bagaimana caranya?
Lukas

Saya tidak memasang visudo. Jadi saya melakukan pkexec vim. Kemudian ditampilkan daftar pengguna dan meminta kata sandi. Ketika saya memberikan kata sandi, itu melempar kesalahan sebagai "Perintah eksekusi kesalahan sebagai pengguna lain: Tidak diotorisasi". Tolong bantu
Shyamkkhadka

24

Ketikkan:

pkexec visudo

Kemudian ubah baris terakhir

#includedir /etc/sudoers

Untuk:

#includedir /etc/sudoers.d

Itu harus menyelesaikan masalah Anda.


2
Saya perhatikan bahwa menghapus yang memimpin #dari #includedirpenyebab kesalahan sintaks, #adalah bagian dari arahan, setidaknya di Ubuntu 12.10.
SAFX

1
Itu baru saja menyelamatkan saya dari sakit kepala. Terima kasih banyak :)
Solusi Addo

1
Saya tidak memasang visudo. Jadi saya melakukan pkexec vim. Kemudian ditampilkan daftar pengguna dan meminta kata sandi. Ketika saya memberikan kata sandi, itu melempar kesalahan sebagai "Perintah eksekusi kesalahan sebagai pengguna lain: Tidak diotorisasi". Tolong bantu
Shyamkkhadka

11

jika orang lain seperti saya tidak memiliki pkexec diinstal, atau tidak dapat menjalankan vi, visudo, nano atau editor lain untuk mengubah file sudoers Anda dapat yakin dengan proses ini .. Saya diselamatkan dengan ini:

  • reboot
  • tahan tombol shift saat booting untuk memiliki opsi untuk mode pemulihan (masukkan)
  • masukkan baris perintah sebagai root (opsi terakhir kedua di menu grub saya)
  • remount perangkat boot untuk rw, dan terapkan exec tepat untuk pengguna, dan edit file

    mount -n -o remount,rw /
    chmod u+x /etc/sudoers
    nano /etc/sudoers
    

memperbaiki kesalahan itu dan bahagia :)


Sementara solusi pkexec yang disarankan oleh @ eliah-kagan tampaknya lebih mudah, yang ini lebih universal. Di komputer saya ternyata tidak ada pkexec yang terinstal dan tentu saja saya tidak bisa menginstalnya karena sudo apt-get install pkexec entah bagaimana tidak berfungsi.
running.t

Juga dalam pendekatan ini saya akan menggunakan visudosebagai gantinya nano /etc/sudoers.
pa4080

7

Jika Anda mengacaukan sudoersfile Anda, Anda harus:

  • Reboot ke mode pemulihan (tekan escape saat boot, pilih opsi mode pemulihan pada layar grub)
  • Pilih opsi 'Aktifkan jaringan' (jika Anda tidak, sistem file Anda akan dipasang sebagai hanya-baca. Siapa yang tahu)
  • Pilih opsi 'Jatuhkan ke root shell'
  • jalankan visudo, perbaiki file Anda
  • Reboot dengan opsi grub normal

sumber: - http://mario.net.au/content/recover-etcsudoers-ubuntu-1204


Hai, apakah itu menghapus iptables, file dari sistem yang ada?
Shyamkkhadka

6

Tidak ada yang salah #sertakan sudoer.d menghapus #sertakan sudoer.d tidak akan membuat perbedaan.

Tetapi pastikan Anda tidak memiliki kesalahan sintaksis. Saya memiliki masalah yang sama tetapi menghabiskan waktu berjam-jam untuk memperbaikinya dan baru tahu bahwa itu adalah kesalahan sintaksis. Rujuk ke manual dan perbaiki.

Misalnya Katakanlah nama pengguna Anda: dolly saya gunakan berikut yang salah

 dolly ALL = (ALL) ALL NO PASSWD: ALL

sintaks yang benar adalah

dolly ALL = (ALL) ALL //give permission to everything, not good

atau

dolly ALL=(ALL) NOPASSWD:/usr/bin/thurderbird //good, give specific permission

semoga ini membantu


Pendekatan yang lebih baik daripada memastikan Anda tidak memiliki kesalahan sintaks adalah selalu menggunakan visudoketika mengedit file-file ini, yang memastikan Anda tidak memiliki kesalahan sintaksis untuk Anda, sebelum memodifikasi file. visudotidak hanya untuk mengedit - /etc/sudoersitu juga akan membuat dan mengedit file dalam /etc/sudoers.d. Ini juga akan bekerja dengan editor teks apa pun yang Anda inginkan. Lihat halaman manual untuk detailnya.
Eliah Kagan

Sedangkan untuk memberikan izin khusus, harap dicatat bahwa ini hanya berguna untuk perintah / aplikasi yang sangat sederhana, karena aplikasi apa pun yang cukup kompleks (termasuk thunderbird, yang seharusnya tidak pernah dijalankan sebagai root) akan secara efektif memberikan pengguna akses sistem penuh ketika dijalankan sebagai root. Bahkan fungsionalitas yang tampaknya sederhana membuka pintu untuk akses root penuh. Misalnya, pengguna yang dapat menjalankan program yang dapat menyimpan file ke lokasi arbitrer karena root dapat memperoleh akses root penuh (mereka dapat menginstal sendiri /etc/sudoers, atau jika batasan sintaksis mencegahnya, mereka dapat menginstal sendiri /etc/crontab).
Eliah Kagan

3

jalankan recovery mode lalu ketik ini

chown -R root: root /etc/sudoers.d
chmod u = rwx, g = rx, o = rx /etc/sudoers.d/
chmod u = r, g = r, o = /etc/sudoers.d/*

hanya grup dan root pengguna yang seharusnya membaca hak istimewa


3

Anda juga dapat masuk sebagai root pada ttykonsol dengan Ctrl+ Fn( Fndari 1 hingga 6) dan jalankan visudo.


2

Anda dapat mengedit entri boot Anda saat di grub juga.

Cukup reboot komputer Anda, dan tunggu sampai grub muncul. Kemudian tekan "e" pada entri "Ubuntu" untuk mengeditnya.

Cari baris dengan "linux =" atau "kernel =" dan cukup tambahkan "tunggal" di akhir baris itu.

Kemudian tekan F10 untuk mem-boot entri boot yang dimodifikasi sementara ini. Ini akan memberi Anda shell (tanpa GUI) dengan hak root dan Anda dapat mengedit file sudoers dengan s.th. seperti nano / etc / sudoers kembali ke keadaan sebelumnya.

Kemudian reboot dan selesai.


2
pkexec visudo

kemudian kembalikan kesalahan Anda


1
tidak perlu menggunakan pkexec
Braiam

@Braiam visudoharus dijalankan sebagai root. Jika sudotidak berhasil, pkexecterkadang berhasil. Ini dicakup oleh jawaban saya sebelumnya ... tetapi itu adalah jawaban yang benar, visudodengan sendirinya (ketika tidak dijalankan sebagai root) tidak akan berfungsi, dan mungkin ada nilai dalam jawaban yang benar dan singkat bahkan ketika rekomendasi mereka tumpang tindih dengan jawaban lainnya. Tentu saja, jika seseorang masuk ke mode pemulihan, itu adalah shell root dan kemudian tidak perlu sudoatau visudotidak perlu untuk perintah seperti pkexec. Mungkin itu yang Anda maksud ...
Eliah Kagan

0

Di Ubuntu 16.04 berjalan di VirtualBox (seharusnya tidak membuat perbedaan), metode di atas tidak bekerja untuk saya (baris tidak valid di akhir file). Apa yang berhasil adalah:

  1. Mulai ulang VirtualBox
  2. Biarkan boot secara normal, sampai ia meminta nama pengguna & kata sandi Anda di konsol
  3. Login secara normal dengan nama pengguna Anda
  4. Kemudian ketika Anda berakhir di konsol (asalkan kotak Anda tidak bisa boot ke GUI), cukup berikan perintah su -dan kemudian berikan kata sandi nama pengguna Anda sendiri.
  5. Sekarang seharusnya berakhir di root@ubuntu-xenial:~#prompt, jika /etc/sudoerstidak terlalu rusak atau kosong. Tidak yakin apa yang akan terjadi dalam kasus itu.
  6. Kemudian Anda cukup menjalankan visudodan memperbaiki file.
  7. Kemudian Ctrl + Xdan itu akan meminta untuk Simpan buffer yang dimodifikasi. Tekan YdanEnter
  8. Mulai ulang kotak dan itu seharusnya berfungsi sekarang.

Jika Anda /etc/sudoerskosong atau melewatkan sesuatu, dan Anda dapat mengeditnya, maka inilah isinya:

Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

root ALL=(ALL:ALL) ALL

%admin ALL=(ALL) ALL

%sudo ALL=(ALL:ALL) ALL

Langkah 4 Anda tidak masuk akal, itu hanya berfungsi ketika kata sandi root Anda sama dengan pengguna normal Anda.
alfred

Yang sangat umum di VM lokal.
Juha Untinen

0

Praktik yang baik: jendela terminal cadangan dan jalankan di sudo susana. Pada termianl lain jalankan visudo atau sudo vim / etc / sudoers. Jika ada masalah, kembali ke terminal satu dan perbaiki file. Anda mungkin bertanya, mengapa tidak berjalan sudo susebelumnya visudodi satu terminal? Ini juga berfungsi, tetapi memiliki risiko lebih tinggi Anda menutup terminal sebelum Anda menyadarinya.


-1

Ada solusi cara yang lebih sederhana. Tanpa reboot, mode pemulihan, atau pkgexec( pkgexectidak berfungsi dan tidak tahu mengapa atau bagaimana saya harus menggunakannya), cukup lakukan:

su root # switch to root user, without using sudo (which is broken at this point)
your_favorite_editor /etc/sudoers # e.g. nano

Dan kemudian perbaiki kesalahan sintaks!


Ada apa dengan downvote? Bekerja dengan sempurna untuk saya.
rien333
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.