จะแก้ไขไฟล์ '/ etc / sudoers' ไม่ถูกต้องได้อย่างไร


238

ฉันจะแก้ไขไฟล์ sudoers ที่ไม่ถูกต้องได้อย่างไร มันพ่นข้อผิดพลาดด้านล่างและไม่อนุญาตให้ฉันแก้ไขอีกครั้งเพื่อแก้ไข

นี่คือสิ่งที่เกิดขึ้น:

$ 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
คำถามที่ดีในการพิจารณาหน้านี้สร้างข้อผิดพลาดhelp.ubuntu.com/community/RootSudoTimeout

คำตอบ:


361

บนระบบ Ubuntu ที่ทันสมัย ​​(และการกระจาย GNU / Linux อื่น ๆ อีกมากมาย) การแก้ไขsudoersไฟล์ที่เสียหายนั้นค่อนข้างง่ายและไม่ต้องทำการรีบูตโดยใช้ CD สดหรือการเข้าถึงเครื่องจริง

การทำเช่นนี้ผ่านทาง SSH pkexec visudoเข้าสู่ระบบเครื่องและเรียกใช้คำสั่ง หากคุณมีสิทธิ์เข้าถึงเครื่อง SSH นั้นไม่จำเป็น เพียงเปิดหน้าต่าง Terminal และเรียกใช้pkexecคำสั่งนั้น

สมมติว่าคุณ (หรือบางส่วนของผู้อื่น) มีอำนาจที่จะเรียกใช้เป็นโปรแกรมrootที่มี PolicyKit คุณสามารถป้อนรหัสผ่านของคุณและจากนั้นมันจะทำงานvisudoเป็นและคุณสามารถแก้ไขปัญหาของคุณroot/etc/sudoers

หากคุณจำเป็นต้องแก้ไขไฟล์การกำหนดค่าใน/etc/sudoers.d(ซึ่งในเรื่องผิดปกติในสถานการณ์เช่นนี้ แต่เป็นไปได้) การใช้งานpkexec visudo -f /etc/sudoers.d/filename

หากคุณมีสถานการณ์ที่เกี่ยวข้องที่คุณต้องดำเนินการคำสั่งการบริหารระบบเพิ่มเติมเป็นรูทเพื่อแก้ไขปัญหา (เช่นเรื่องผิดปกติในสถานการณ์นี้ แต่พบได้ทั่วไปในคนอื่น) คุณสามารถเริ่มต้นรูทเชลล์แบบโต้ตอบpkexec bashได้ โดยทั่วไปแล้วคำสั่งที่ไม่ใช่กราฟิกใด ๆ ที่คุณเรียกใช้sudoสามารถเรียกใช้ได้ด้วยpkexecแทน

(หากมีบัญชีผู้ใช้มากกว่าหนึ่งบัญชีในระบบที่ได้รับอนุญาตให้เรียกใช้โปรแกรมเช่นเดียวrootกับ PolicyKit จากนั้นสำหรับการกระทำเหล่านี้คุณจะถูกขอให้เลือกบัญชีที่คุณต้องการใช้ก่อนที่จะถูกถามรหัสผ่านของคุณ)


หากไม่ได้ผล - ตัวอย่างเช่นหากไม่มีผู้ใช้ที่ได้รับอนุญาตให้เรียกใช้โปรแกรมเป็นรูทผ่าน PolicyKit - จากนั้นให้บูตจากซีดีสดของ Ubuntu (เช่นซีดีที่คุณอาจเคยติดตั้ง Ubuntu) และติดตั้งระบบไฟล์สำหรับ ติดตั้งระบบ คุณสามารถทำได้โดยการเรียกใช้sudo parted -lเพื่อดูพาร์ติชันของคุณ - อาจมีเพียงหนึ่งพาร์ติชัน ext4 และนั่นคือระบบไฟล์รูท

สมมติว่าระบบไฟล์รูทของระบบ Ubuntu ติดตั้งอยู่บน / dev / sda1 sudo mount /dev/sda1 /mntจากนั้นคุณสามารถติดตั้งด้วย จากนั้นคุณสามารถแก้ไข sudoers sudo nano -w /mnt/etc/sudoersไฟล์ระบบที่ติดตั้งด้วย หรือดีกว่านั้นคุณสามารถแก้ไขได้ด้วย

sudo visudo -f /mnt/etc/sudoers

(ซึ่งจะป้องกันคุณจากการบันทึกไฟล์ sudoers ด้วยไวยากรณ์ที่ไม่ถูกต้อง)


7
pkexec / usr / sbin / visudo ทำงานบน debian 7
marinara

10
ศักดิ์สิทธิ์วัว! ขอบคุณมาก! บันทึกเบคอนของฉัน เพิ่มไฟล์ตามที่แนะนำใน / etc sudoers.d / directory โดยใช้ TEXT EDITOR (DON-T__D-O__T-HAT !!!) สูญเสียความสามารถในการทำสิทธิ์ยกระดับทั้งหมดรวมถึงแก้ไขไฟล์ที่กระทำผิด สิ่งนี้ช่วยแก้ไขไฟล์ แปลก แต่ฉันต้องแก้ไข / etc / sudoers ก่อนจากนั้นก็พบข้อผิดพลาดในไฟล์อื่นและเปิดไฟล์นั้นให้ฉัน EVEN WEIRDER คำสั่งในไฟล์ / etc / sudoers 'inlcudedir /etc/sudoers.d' ถูกคอมเม้นต์ไว้และยังรวมอยู่ด้วย
Dennis

4
@Dennis ค่อนข้างสับสน#includeคำสั่งในsudoersไฟล์จะได้รับการปฏิบัติเป็นพิเศษ; ผู้นำ#ไม่ทำให้ส่วนที่เหลือของบรรทัดถูกตีความว่าเป็นความคิดเห็นในกรณีนั้น ตามที่ได้man sudoersกล่าวไว้: "เครื่องหมายปอนด์ ('#') ใช้เพื่อระบุความคิดเห็น (ยกเว้นว่าเป็นส่วนหนึ่งของ #include directive หรือยกเว้น ... " ดูเพิ่มเติมvisudo: #includedir sudoers.d (เก็บถาวรจากlzone.de/ บล็อก ).
Eliah Kagan

5
ผู้ใช้ของฉันคือ sudoer แต่ฉันได้ข้อผิดพลาดนี้: ข้อผิดพลาดรันคำสั่งเป็นผู้ใช้อื่น: ไม่ได้รับอนุญาต
SUB

2
ใน Ubuntu 16.04 pkexec visudoขอรหัสผ่านซึ่งไม่ยอมรับรหัสผ่านที่ถูกต้อง มันโยนข้อผิดพลาด "AUTHENTICATION FAILED"
Juha Untinen

54

ใช้visudoเพื่อแก้ไขไฟล์ sudoers ของคุณเสมอห้ามแก้ไขด้วยตัวคุณเองโดยตรง มันจะป้องกันไม่ให้คุณบันทึกลงดิสก์เว้นแต่จะมีการตรวจสอบ



4
มันจะไม่ป้องกันภัยพิบัติ มันง่ายพอที่จะปฏิเสธตัวเองอย่างถูกต้อง
Joshua

visudo สามารถใช้โดย scritps ได้หรือไม่? ถ้าเป็นเช่นนั้นได้อย่างไร
Lukas

ฉันไม่ได้ติดตั้ง visudo ดังนั้นฉันจึง pkexec เป็นกลุ่ม จากนั้นจะแสดงรายการผู้ใช้และถามรหัสผ่าน เมื่อฉันให้รหัสผ่านมันจะพ่นข้อผิดพลาดเป็น "ข้อผิดพลาดในการดำเนินการคำสั่งในฐานะผู้ใช้อื่น: ไม่ได้รับอนุญาต" กรุณาช่วย
Shyamkkhadka

24

พิมพ์ใน:

pkexec visudo

จากนั้นเปลี่ยนบรรทัดสุดท้าย

#includedir /etc/sudoers

ไปที่:

#includedir /etc/sudoers.d

มันควรจะแก้ปัญหาของคุณ


2
ฉันสังเกตเห็นว่าการลบส่วนนำ#จาก#includedirสาเหตุข้อผิดพลาดทางไวยากรณ์นั้น#เป็นส่วนหนึ่งของคำสั่งอย่างน้อยใน Ubuntu 12.10
SAFX

1
นั่นเพิ่งช่วยฉันปวดหัวมากมาย ขอบคุณ a :):
Addo Solutions

1
ฉันไม่ได้ติดตั้ง visudo ดังนั้นฉันจึง pkexec เป็นกลุ่ม จากนั้นจะแสดงรายการผู้ใช้และถามรหัสผ่าน เมื่อฉันให้รหัสผ่านมันจะพ่นข้อผิดพลาดเป็น "ข้อผิดพลาดในการดำเนินการคำสั่งในฐานะผู้ใช้อื่น: ไม่ได้รับอนุญาต" กรุณาช่วย
Shyamkkhadka

11

หากคนอื่นเช่นฉันไม่ได้ติดตั้งpkexecหรือไม่สามารถเรียกใช้ vi, visudo, nano หรือโปรแกรมแก้ไขอื่น ๆ เพื่อเปลี่ยนไฟล์ sudoers คุณสามารถมั่นใจได้กับกระบวนการนี้ .. ฉันได้รับการบันทึกด้วย:

  • รีบูต
  • กดปุ่ม Shift ค้างไว้ในขณะที่บูตเพื่อให้มีตัวเลือกสำหรับโหมดการกู้คืน (ป้อน)
  • ป้อนบรรทัดคำสั่งเป็น root (ตัวเลือกสุดท้ายที่สองที่เมนูด้วงของฉัน)
  • ประกอบอุปกรณ์การบู๊ตใหม่สำหรับ rw และใช้ exec ที่เหมาะสมสำหรับผู้ใช้และแก้ไขไฟล์

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

แก้ไขข้อผิดพลาดนั้นและมีความสุข :)


ในขณะที่วิธีการแก้ปัญหา pkexec แนะนำโดย @ eliah-kagan ดูเหมือนจะง่ายขึ้น แต่นี่เป็นวิธีที่เป็นสากลมากขึ้น บนเครื่องของฉันปรากฎว่าไม่มีการติดตั้ง pkexec และแน่นอนว่าฉันไม่สามารถติดตั้งได้เพราะ sudo apt apt-get pkexec ติดตั้งไม่ได้ผล
running.t

นอกจากนี้ภายในวิธีการนี้ผมจะใช้แทนvisudo nano /etc/sudoers
pa4080

7

หากคุณทำsudoersไฟล์ของคุณยุ่งเหยิงคุณจะต้อง:

  • รีบูตเข้าสู่โหมดการกู้คืน (กดปุ่ม Escape ระหว่างการบู๊ตเลือกตัวเลือกโหมดการกู้คืนบนหน้าจอด้วง)
  • เลือกตัวเลือก 'เปิดใช้งานเครือข่าย' (หากคุณไม่ติดตั้งระบบไฟล์ของคุณเป็นแบบอ่านอย่างเดียวใครจะรู้)
  • เลือกตัวเลือก 'Drop to root shell'
  • เรียกใช้visudoแก้ไขไฟล์ของคุณ
  • รีบูทด้วยตัวเลือกด้วงปกติ

แหล่งที่มา: - http://mario.net.au/content/recover-etcsudoers-ubuntu-1204


สวัสดีมันลบไฟล์ iptables ของระบบที่มีอยู่หรือไม่?
Shyamkkhadka

6

ไม่มีอะไรผิด #include sudoer.d การลบ #include sudoer.d จะไม่สร้างความแตกต่าง

แต่โปรดตรวจสอบว่าคุณไม่มีข้อผิดพลาดทางไวยากรณ์ ฉันมีปัญหาเดียวกัน แต่และใช้เวลาหลายชั่วโมงในการแก้ไขและเพียงแค่คิดว่ามันเป็นข้อผิดพลาดทางไวยากรณ์ อ้างอิงถึงคู่มือและทำให้ถูกต้อง

ตัวอย่างเช่นสมมติว่าชื่อผู้ใช้ของคุณคือ: ดอลลี่ฉันใช้สิ่งต่อไปนี้ซึ่งผิด

 dolly ALL = (ALL) ALL NO PASSWD: ALL

ไวยากรณ์ที่ถูกต้องคือ

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

หรือ

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

หวังว่านี่จะช่วยได้


วิธีที่ดีกว่าการตรวจสอบให้แน่ใจว่าคุณไม่มีข้อผิดพลาดทางไวยากรณ์คือใช้เสมอvisudoเมื่อแก้ไขไฟล์เหล่านี้ซึ่งทำให้แน่ใจว่าคุณไม่มีข้อผิดพลาดทางไวยากรณ์สำหรับคุณก่อนที่จะแก้ไขไฟล์ visudoไม่ได้เป็นเพียงสำหรับการแก้ไข/etc/sudoers--it /etc/sudoers.dยังจะสร้างและแก้ไขไฟล์ใน มันจะทำงานร่วมกับโปรแกรมแก้ไขข้อความที่คุณต้องการ ดูmanpageสำหรับรายละเอียด
Eliah Kagan

สำหรับการอนุญาตที่เฉพาะเจาะจงโปรดทราบว่านี่เป็นประโยชน์สำหรับคำสั่ง / แอพที่ง่ายมากเพราะแอพที่ซับซ้อนพอสมควร (รวมถึงthunderbirdซึ่งไม่ควรเรียกใช้ในฐานะรูทอยู่ดี) จะช่วยให้ผู้ใช้เข้าถึงระบบได้อย่างเต็มประสิทธิภาพ แม้แต่ฟังก์ชั่นการทำงานที่เรียบง่ายดูเหมือนเปิดประตูสู่การเข้าถึงรูททั้งหมด ตัวอย่างเช่นผู้ใช้ที่สามารถเรียกใช้โปรแกรมที่สามารถบันทึกไฟล์ไปยังตำแหน่งโดยพลการในขณะที่รูทสามารถเข้าถึงรูทแบบเต็ม (พวกเขาสามารถติดตั้งของตัวเอง/etc/sudoersหรือถ้าข้อ จำกัด ทางไวยากรณ์ป้องกันไม่ให้พวกเขาสามารถติดตั้งเอง/etc/crontab)
Eliah Kagan

3

เรียกใช้โหมดการกู้คืนจากนั้นพิมพ์สิ่งนี้

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/*

เฉพาะกลุ่มและผู้ใช้รูทเท่านั้นที่ควรอ่าน privelege


3

นอกจากนี้คุณยังสามารถเข้าสู่ระบบเป็นรากบนttyคอนโซลด้วยCtrl+ Fn( Fn1-6) visudoและเรียกใช้


2

คุณสามารถแก้ไขรายการบูตในด้วงได้เช่นกัน

เพียงรีบูทพีซีของคุณและรอให้ด้วงแสดง จากนั้นกด "e" บนรายการ "Ubuntu" เพื่อแก้ไข

ค้นหาบรรทัดที่มี "linux =" หรือ "kernel =" และเพิ่ม "single" ไปยังท้ายบรรทัดนั้น

จากนั้นกด F10 เพื่อบูตรายการบูตที่ปรับเปลี่ยนชั่วคราวนี้ สิ่งนี้จะให้เชลล์ (โดยไม่มี GUI) ที่มีสิทธิ์รูทและคุณสามารถแก้ไขไฟล์ sudoers ด้วย s.th เช่น nano / etc / sudoers กลับสู่สถานะก่อนหน้า

จากนั้นเริ่มต้นใหม่และทำมัน


2
pkexec visudo

จากนั้นคืนความผิดพลาดของคุณ


1
ไม่จำเป็นต้องใช้ pkexec
Braiam

@Braiam visudoต้องถูกเรียกใช้ในฐานะรูท ถ้าsudoไม่ทำงานpkexecบางครั้งก็ทำ นี่คือคำตอบก่อนหน้าของฉันที่ครอบคลุม... แต่มันเป็นคำตอบที่ถูกต้องvisudoด้วยตัวเอง (เมื่อไม่ได้รันในฐานะรูท) จะไม่ทำงานและอาจมีค่าในคำตอบที่ถูกต้องคำตอบสั้น ๆ แม้ว่าคำแนะนำจะทับซ้อนกับคำตอบอื่น แน่นอนถ้าหนึ่งจะเข้าสู่โหมดการกู้คืนที่เปลือกรากแล้วค่าsudoมิได้เป็นสิ่งจำเป็นสำหรับคำสั่งเช่นvisudo pkexecบางทีนั่นอาจเป็นสิ่งที่คุณหมายถึง ...
Eliah Kagan

0

ใน Ubuntu 16.04 ทำงานบน VirtualBox (ไม่ควรสร้างความแตกต่าง) วิธีการข้างต้นไม่ได้ผลสำหรับฉัน (แถวไม่ถูกต้องในตอนท้ายของไฟล์) ทำงานอะไร:

  1. รีสตาร์ท VirtualBox
  2. ปล่อยให้มันบูตตามปกติจนกว่าจะขอชื่อผู้ใช้และรหัสผ่านของคุณในคอนโซล
  3. เข้าสู่ระบบตามปกติด้วยชื่อผู้ใช้ของคุณ
  4. จากนั้นเมื่อคุณลงเอยในคอนโซล (หากกล่องของคุณไม่บูตเป็น GUI) เพียงแค่ให้คำสั่งsu -แล้วให้รหัสผ่านชื่อผู้ใช้ของคุณเอง
  5. ตอนนี้มันควรจะจบลงในทันทีroot@ubuntu-xenial:~#ถ้า/etc/sudoersมันไม่ได้หักหรือเปล่า ไม่แน่ใจว่าจะเกิดอะไรขึ้นในกรณีนั้น
  6. จากนั้นคุณสามารถเรียกใช้visudoและแก้ไขไฟล์ได้
  7. จากนั้นCtrl + Xจะแจ้งให้บันทึกบัฟเฟอร์ที่แก้ไข กดYและEnter
  8. รีสตาร์ทกล่องและควรใช้งานได้ทันที

ในกรณีที่คุณ/etc/sudoersว่างเปล่าหรือขาดหายไปและคุณสามารถแก้ไขได้นี่คือเนื้อหาของฉัน:

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

ขั้นตอนที่ 4 ของคุณไม่สมเหตุสมผลจะใช้งานได้เฉพาะเมื่อรหัสผ่านรูทของคุณเหมือนกับผู้ใช้ปกติของคุณ
รด

ซึ่งเป็นเรื่องธรรมดาใน VM ท้องถิ่น
Juha Untinen

0

แนวปฏิบัติที่ดี: หน้าต่างเทอร์มินัลสำรองและเรียกใช้ที่sudo suนั่น ในอีก termianl ให้เรียกใช้ visudo หรือ sudo vim / etc / sudoers หากมีสิ่งใดผิดพลาดให้กลับไปที่เทอร์มินัลหนึ่งแล้วแก้ไขไฟล์ คุณอาจถามว่าทำไมไม่เรียกใช้sudo suมาก่อนvisudoในเทอร์มินัลเดียว วิธีนี้ใช้ได้เช่นกัน แต่มีความเสี่ยงสูงกว่าที่คุณจะปิดเครื่องก่อนที่คุณจะรู้


-1

มีวิธีแก้ปัญหาที่ง่ายกว่า หากไม่มีการรีบูทโหมดการกู้คืนหรือpkgexec( pkgexecไม่ทำงานและไม่ทราบสาเหตุหรือวิธีที่ฉันควรใช้) เพียงทำ:

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

แล้วแก้ไขข้อผิดพลาดทางไวยากรณ์!


downvote คืออะไร ทำงานอย่างสมบูรณ์แบบสำหรับฉัน
rien333
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.