Làm cách nào để sửa đổi tệp '/ etc / sudoers' không hợp lệ?


238

Làm cách nào để chỉnh sửa tệp sudoers không hợp lệ? Nó đưa ra lỗi bên dưới và nó không cho phép tôi chỉnh sửa lại để sửa nó.

Đây là những gì xảy ra:

$ 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
câu hỏi rất hay xem xét trang này tạo ra rằng lỗi help.ubuntu.com/community/RootSudoTimeout

Câu trả lời:


361

Trên hệ thống Ubuntu hiện đại (và nhiều bản phân phối GNU / Linux khác), việc sửa sudoerstệp bị hỏng thực sự khá dễ dàng và không yêu cầu khởi động lại, sử dụng đĩa CD trực tiếp hoặc truy cập vật lý vào máy.

Để thực hiện việc này thông qua SSH, hãy đăng nhập vào máy và chạy lệnh pkexec visudo. Nếu bạn có quyền truy cập vật lý vào máy, SSH là không cần thiết; chỉ cần mở một cửa sổ Terminal và chạy pkexeclệnh đó .

Giả sử bạn (hoặc một số người dùng khác) được ủy quyền để chạy các chương trình như rootvới PolicyKit, bạn có thể nhập mật khẩu của mình và sau đó nó sẽ chạy visudonhư rootvà bạn có thể sửa lỗi của mình /etc/sudoers.

Nếu bạn cần chỉnh sửa một trong các tệp cấu hình trong /etc/sudoers.d(không phổ biến trong tình huống này, nhưng có thể), hãy sử dụng .pkexec visudo -f /etc/sudoers.d/filename

Nếu bạn có một tình huống liên quan trong đó bạn phải thực hiện các lệnh quản trị hệ thống bổ sung dưới dạng root để khắc phục sự cố (cũng không phổ biến trong trường hợp này, nhưng phổ biến ở những người khác), bạn có thể bắt đầu một trình bao gốc tương tác với pkexec bash. Nói chung, bất kỳ lệnh phi đồ họa nào bạn chạy cùng sudocó thể được chạy bằng pkexecthay thế.

(Nếu có nhiều tài khoản người dùng trên hệ thống được ủy quyền để chạy các chương trình như rootvới PolicyKit, thì đối với bất kỳ hành động nào, bạn sẽ được yêu cầu chọn tài khoản nào bạn muốn sử dụng, trước khi được hỏi mật khẩu.)


Nếu điều đó không hoạt động - ví dụ: nếu không có người dùng nào được phép chạy chương trình với quyền root thông qua PolicyKit - thì hãy khởi động từ đĩa CD trực tiếp Ubuntu (như CD mà bạn có thể đã sử dụng để cài đặt Ubuntu) và gắn hệ thống tệp cho lắp đặt hệ thống. Bạn có thể làm điều này bằng cách chạy sudo parted -lđể xem các phân vùng của mình - có thể chỉ có một phân vùng ext4 và đó là hệ thống tập tin gốc.

Giả sử hệ thống tập tin gốc của hệ thống Ubuntu đã cài đặt là trên / dev / sda1. Sau đó, bạn có thể gắn kết với nó sudo mount /dev/sda1 /mnt. Sau đó, bạn có thể chỉnh sửa tệp sudoers của hệ thống đã cài đặt với sudo nano -w /mnt/etc/sudoers. Hoặc, thậm chí tốt hơn, bạn có thể chỉnh sửa nó với

sudo visudo -f /mnt/etc/sudoers

(sẽ ngăn bạn lưu tệp sudoers với cú pháp không chính xác).


7
pkexec / usr / sbin / visudo đã làm việc trên debian 7
marinara

10
CÔ GÁI! Cảm ơn rất nhiều! Cứu lấy thịt xông khói của tôi. Đã thêm một tệp như được đề xuất vào etc / sudoers.d / thư mục SỬ DỤNG EDITOR REGULAR TEXT (DON-T__D-O__T-HAT !!!). Mất tất cả khả năng để thực hiện các đặc quyền nâng cao, BAO GỒM, chỉnh sửa tệp vi phạm. Điều này đã giúp chỉnh sửa các tập tin. Thật kỳ lạ, trước tiên tôi phải chỉnh sửa / etc / sudoers, sau đó nó tìm thấy các lỗi trong tệp khác và mở nó cho tôi. NGAY LẬP TỨC, lệnh trong / etc / sudoers 'inlcudedir /etc/sudoers.d' đã được nhận xét và nó vẫn bao gồm nó.
Dennis

4
@Dennis Một cách khó hiểu, các #includechỉ thị trong sudoerscác tệp được xử lý đặc biệt; hàng đầu #không làm cho phần còn lại của dòng được hiểu là một nhận xét, trong trường hợp đó. Như đã man sudoersnói: "Dấu thăng ('#') được sử dụng để biểu thị một nhận xét (trừ khi đó là một phần của chỉ thị #include hoặc trừ khi ..." Xem thêm visudo: #includedir sudoers.d (được lưu trữ từ lzone.de/ blog ).
Eliah Kagan

5
Người dùng của tôi là sudoer nhưng tôi đã gặp lỗi này: Lỗi khi thực thi lệnh với tư cách người dùng khác: Không được ủy quyền
SuB

2
Trong Ubuntu 16.04, pkexec visudoyêu cầu mật khẩu, không chấp nhận mật khẩu chính xác. Nó đưa ra một lỗi "AUTHENTICATION FAILED".
Juha Untinen

54

Luôn luôn sử dụng visudođể chỉnh sửa tập tin sudoers của bạn, không bao giờ tự mình chỉnh sửa nó. Nó sẽ ngăn bạn lưu nó vào đĩa trừ khi nó xác nhận.


17
nhận thức muộn là 20/20
code_monk

4
Nó sẽ không ngăn chặn thảm họa. Nó đủ dễ để từ chối chính mình.
Joshua

Visudo có thể được sử dụng bởi scritps? Nếu vậy thì thế nào?
Lukas

Tôi chưa cài đặt visudo. Vì vậy, tôi đã làm pkexec vim. Sau đó, nó hiển thị danh sách người dùng và yêu cầu mật khẩu. Khi tôi cung cấp mật khẩu, nó sẽ báo lỗi là "Lỗi khi thực thi lệnh với tư cách người dùng khác: Không được ủy quyền". Xin hãy giúp đỡ
Shyamkkhadka

24

Gõ vào:

pkexec visudo

Sau đó thay đổi dòng cuối cùng

#includedir /etc/sudoers

Đến:

#includedir /etc/sudoers.d

Nó sẽ giải quyết vấn đề của bạn.


2
Tôi đã nhận thấy rằng việc loại bỏ hàng đầu #khỏi các #includedirlỗi cú pháp, #là một phần của chỉ thị, ít nhất là trên Ubuntu 12.10.
SAFX

1
Điều đó chỉ giúp tôi tiết kiệm rất nhiều đau đầu. Cảm ơn rất nhiều :)
Giải pháp Addo

1
Tôi chưa cài đặt visudo. Vì vậy, tôi đã làm pkexec vim. Sau đó, nó hiển thị danh sách người dùng và yêu cầu mật khẩu. Khi tôi cung cấp mật khẩu, nó sẽ báo lỗi là "Lỗi khi thực thi lệnh với tư cách người dùng khác: Không được ủy quyền". Xin hãy giúp đỡ
Shyamkkhadka

11

nếu bất kỳ ai khác như tôi không cài đặt pkexec hoặc không thể chạy vi, visudo, nano hoặc bất kỳ trình chỉnh sửa nào khác để thay đổi tệp sudoers, bạn có thể chắc chắn với quy trình này .. Tôi đã được lưu với điều này:

  • khởi động lại
  • giữ phím shift trong khi khởi động để có tùy chọn cho chế độ phục hồi (nhập nó)
  • nhập dòng lệnh dưới dạng root (tùy chọn cuối cùng thứ hai trong menu grub của tôi)
  • nhắc lại thiết bị khởi động cho rw và áp dụng exec ngay cho người dùng và chỉnh sửa tệp

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

sửa lỗi đó và hạnh phúc :)


Trong khi giải pháp pkexec được đề xuất bởi @ eliah-kagan dường như dễ dàng hơn, thì giải pháp này phổ biến hơn. Trên máy của tôi, hóa ra là không có pkexec được cài đặt và tất nhiên tôi không thể cài đặt nó vì sudo apt-get install pkexec bằng cách nào đó không hoạt động.
chạy.t

Cũng trong cách tiếp cận này, tôi sẽ sử dụng visudothay thế nano /etc/sudoers.
pa4080

7

Nếu bạn làm hỏng sudoerstập tin của mình , bạn sẽ cần:

  • Khởi động lại vào chế độ phục hồi (nhấn thoát trong khi khởi động, chọn tùy chọn chế độ khôi phục trên màn hình grub)
  • Chọn tùy chọn 'Kích hoạt mạng' (nếu bạn không hệ thống tệp của bạn sẽ được gắn kết ở chế độ chỉ đọc. Ai biết)
  • Chọn tùy chọn 'Drop to root shell'
  • chạy visudo, sửa tập tin của bạn
  • Khởi động lại với tùy chọn grub bình thường

nguồn: - http://mario.net.au/content/recover-etcsudoers-ubuntu-1204


Xin chào, nó có xóa iptables, tập tin của hệ thống hiện tại không?
Shyamkkhadka

6

Không có gì sai #include sudoer.d xóa #include sudoer.d sẽ không tạo ra bất kỳ sự khác biệt.

Nhưng hãy chắc chắn rằng bạn không có bất kỳ lỗi cú pháp nào. Tôi đã có vấn đề tương tự nhưng và đã dành hàng giờ để sửa chữa và chỉ cần tìm ra chúng là lỗi cú pháp. Tham khảo hướng dẫn và làm cho họ đúng.

Ví dụ: Nói tên người dùng của bạn là: dolly Tôi đã sử dụng sau đây là sai

 dolly ALL = (ALL) ALL NO PASSWD: ALL

cú pháp đúng là

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

hoặc là

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

hi vọng điêu nay co ich


Cách tiếp cận tốt hơn là đảm bảo bạn không có lỗi cú pháp là luôn luôn sử dụng visudokhi chỉnh sửa các tệp này, điều này đảm bảo bạn không có lỗi cú pháp cho bạn, trước khi nó sửa đổi tệp. visudokhông chỉ để chỉnh sửa /etc/sudoers- nó cũng sẽ tạo và chỉnh sửa các tập tin trong /etc/sudoers.d. Nó cũng sẽ làm việc với bất kỳ trình soạn thảo văn bản nào bạn muốn. Xem trang hướng dẫn để biết chi tiết.
Eliah Kagan

Đối với việc cấp phép cụ thể, xin lưu ý rằng điều này chỉ hữu ích cho các lệnh / ứng dụng rất đơn giản, bởi vì bất kỳ ứng dụng nào đủ phức tạp (bao gồm thunderbird, không bao giờ được chạy dưới dạng root) sẽ cung cấp cho người dùng quyền truy cập toàn bộ hệ thống khi chạy bằng root. Ngay cả chức năng có vẻ đơn giản cũng mở ra cánh cửa để truy cập root đầy đủ. Ví dụ: người dùng có thể chạy chương trình có thể lưu tệp vào một vị trí tùy ý vì root có thể có quyền truy cập root đầy đủ (họ có thể tự cài đặt /etc/sudoershoặc nếu giới hạn cú pháp ngăn chặn điều đó, họ có thể tự cài đặt /etc/crontab).
Eliah Kagan

3

chạy chế độ phục hồi sau đó gõ này

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

chỉ có nhóm người dùng và người dùng mới nên đọc privateelege


3

Bạn cũng có thể đăng nhập bằng root trên ttybảng điều khiển với Ctrl+ Fn( Fntừ 1 đến 6) và chạy visudo.


2

Bạn cũng có thể chỉnh sửa mục khởi động của mình trong khi ở chế độ grub.

Đơn giản chỉ cần khởi động lại máy tính của bạn và chờ grub hiển thị. Sau đó nhấn "e" trên mục "Ubuntu" để chỉnh sửa nó.

Tìm kiếm một dòng có "linux =" hoặc "kernel =" và chỉ cần thêm một "đơn" vào cuối dòng đó.

Sau đó nhấn F10 để khởi động mục khởi động được sửa đổi tạm thời này. Điều này sẽ cung cấp cho bạn một shell (không có GUI) với quyền root và bạn có thể chỉnh sửa tệp sudoers bằng s.th. như nano / etc / sudoers trở lại trạng thái trước đó.

Sau đó khởi động lại và nó được thực hiện.


2
pkexec visudo

sau đó hoàn nguyên sai lầm của bạn


1
không cần thiết phải sử dụng pkexec
Braiam

@Braiam visudophải được chạy dưới quyền root. Nếu sudokhông làm việc, pkexecđôi khi không. Điều này được bao phủ bởi câu trả lời trước đó của tôi ... nhưng nó là một câu trả lời đúng, visudotự nó (khi không chạy bằng root) sẽ không hoạt động và có thể có giá trị trong các câu trả lời chính xác, ngắn gọn ngay cả khi các đề xuất của chúng trùng lặp đáng kể với các câu trả lời khác. Tất nhiên, nếu một đi vào chế độ phục hồi, đó là một vỏ rễ và sau đó không phải sudovà cũng không visudocần thiết cho các lệnh thích pkexec. Có lẽ đó là những gì bạn muốn nói ...
Eliah Kagan

0

Trong Ubuntu 16.04 chạy trên VirtualBox (không nên tạo sự khác biệt), các phương pháp trên không hoạt động với tôi (hàng không hợp lệ ở cuối tệp). Những gì đã làm việc là:

  1. Khởi động lại VirtualBox
  2. Hãy để nó khởi động bình thường, cho đến khi nó hỏi tên người dùng và mật khẩu của bạn trong bảng điều khiển
  3. Đăng nhập bình thường với tên người dùng của bạn
  4. Sau đó, khi bạn kết thúc trong bảng điều khiển (với điều kiện hộp của bạn không khởi động vào GUI), chỉ cần đưa ra lệnh su -và sau đó cung cấp mật khẩu tên người dùng của riêng bạn.
  5. Bây giờ nó sẽ kết thúc root@ubuntu-xenial:~#nhanh chóng, nếu /etc/sudoerskhông quá hỏng hoặc trống. Không chắc chắn những gì sẽ xảy ra trong trường hợp đó.
  6. Sau đó, bạn có thể chỉ cần chạy visudovà sửa tệp.
  7. Sau đó Ctrl + Xvà nó sẽ nhắc Lưu bộ đệm đã sửa đổi. Báo chí YEnter
  8. Khởi động lại hộp và nó sẽ hoạt động ngay bây giờ.

Trong trường hợp của bạn /etc/sudoerstrống hoặc thiếu một cái gì đó, và bạn có thể chỉnh sửa nó, thì đây là nội dung của tôi:

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

Bước 4 của bạn không có ý nghĩa, nó chỉ hoạt động khi mật khẩu gốc của bạn giống với người dùng bình thường của bạn.
alfred

Điều này rất phổ biến trong một VM cục bộ.
Juha Untinen

0

Thực hành tốt: một cửa sổ thiết bị đầu cuối dự phòng và chạy sudo suở đó. Trên một termianl khác chạy visudo hoặc sudo vim / etc / sudoers. Nếu có gì sai, quay trở lại terminal one và sửa file. Bạn có thể hỏi, tại sao không chạy sudo sutrước visudotrong một thiết bị đầu cuối? Điều này cũng hoạt động, nhưng có nguy cơ cao hơn bạn đóng thiết bị đầu cuối trước khi bạn biết nó.


-1

Có một cách giải pháp đơn giản hơn. Không khởi động lại, chế độ phục hồi hoặc pkgexec( pkgexeckhông hoạt động và không biết tại sao hoặc làm thế nào tôi nên sử dụng nó), chỉ cần làm:

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

Và sau đó chỉ cần sửa lỗi cú pháp!


Điều gì với downvote? Làm việc hoàn hảo cho tôi.
rien333
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.