Làm thế nào phổ quát là sudo?


26

Tôi đã viết một số hướng dẫn về cách cài đặt một cái gì đó (liên quan đến TeX - nếu bạn không hỏi, tôi sẽ không làm hỏng ngày của bạn bằng cách cung cấp thêm chi tiết) và được sử dụng sudođể cài đặt toàn hệ thống. Ai đó đã nhận xét rằng họ không nghĩ rằng nó sudocó sẵn trên tất cả các bản phân phối Linux (hoặc Unix).

Có bản phân phối Unix nào không có sudo, và nếu vậy chúng là gì? Có một phổ thừa nhận "Đưa tôi superuser đặc quyền" lệnh đó trên tất cả các hệ thống?

Câu trả lời:


34

sudo không thể được coi là phổ quát:

  • Red Hat Enterprise Linux : sudođược cài đặt theo mặc định trên Red Hat Enterprise Linux và các dẫn xuất của nó, 1 nhưng nó chỉ cài đặt sẵn sàng để sử dụng trong RHEL 7 và mới hơn.

    Red Hat Enterprise Linux 7 đã thêm một tùy chọn mới vào màn hình cài đặt nơi bạn tạo người dùng không phải root đầu tiên , một hộp kiểm có nhãn "Tạo quản trị viên người dùng này". Mục đích của nó không được ghi lại trên trang đó của hướng dẫn cài đặt, nhưng một trong những tác dụng của nó là cho phép người dùng đó chạy bất kỳ lệnh nào thông qua sudo. Nó làm như vậy bằng cách thêm người dùng đó vào wheelnhóm, có thể chạy bất kỳ lệnh nào trong sudocấu hình gói chứng khoán .

    Red Hat Enterprise Linux 3 đến 6 cũng được cài đặt sudotheo mặc định, 2 nhưng cho đến RHEL 7, nó đã được cấu hình để chỉ rootcó thể chạy các lệnh thông qua nó. Cách dễ nhất để khắc phục điều này là thêm một hoặc nhiều người dùng vào wheelnhóm, sau đó chạy visudovới quyền root và bỏ %wheel ALL=(ALL)...dòng.

  • Debian : Kể từ Debian 9, một bản cài đặt tối thiểu bao gồm sudo.

    Trong Debian 7 và 8, bạn phải chọn gói " Tiện ích hệ thống tiêu chuẩn " được cài đặt trong khi cài đặt để có được sudo. Nếu bạn cài đặt sudotheo cách đó, trình cài đặt hệ điều hành sẽ tự động thêm người dùng không phải quản trị viên mà bạn đã tạo trước đó trong quá trình cài đặt vào sudonhóm, có quyền chạy tất cả các lệnh.

    Trong Debian 6 trở về trước, bạn phải cài đặt sudoqua apt-getsau khi cài đặt và định cấu hình bằng tay để cấp cho người dùng không phải root khả năng sử dụng nó.

  • FreeBSD : sudokhông được cài đặt theo mặc định trong FreeBSD. Bạn phải xây dựng nó từ Cổng.

  • NetBSD : Tương tự như FreeBSD.

  • OpenBSD : sudosử dụng phải được cài đặt theo mặc định trong OpenBSD, nhưng họ đã chuyển tới doasnhư của 5.8, phát hành vào tháng 10 năm 2015 . doastàu bị tắt theo mặc định.

    Để có được sudocác phiên bản hiện tại, bạn phải cài đặt nó từ kho lưu trữ gói. sudoGói của OpenBSD được cấu hình giống như trong RHEL 3 đến 6, do đó chỉ rootcó thể chạy các lệnh thông qua nó, mà không đánh bại mục đích của nó sudo. Nếu bạn đã thêm một rootngười không sử dụng trong khi cài đặt, nó đã được thêm vào wheelnhóm, vì vậy cách đơn giản nhất để làm cho sudohữu ích trên hệ thống OpenBSD là bỏ ghi chú %wheel ALL=(ALL)...qua dòng visudo.

  • Solaris : sudođược cài đặt theo mặc định trong Solaris 11, nhưng Solaris 10 trở lên sử dụng tương tự nhưng không hoàn toàn giống nhau pfexec.

    Bạn có thể nhận được sudocho các hệ thống cũ hơn, nhưng mặc định là vấn đề. Solaris 10 trở lên sẽ ở với chúng tôi trong nhiều năm, vì vậy nếu bạn có Solaris trong môi trường của mình và bạn không phải là người kiểm soát các hệ thống đó và vì vậy có thể đảm bảo sudolà có, bạn không thể tin vào điều đó.

Hệ thống càng cũ, cơ hội càng không có sudo. Mặc dù đã sudorất cũ nhưng nó đã không bắt đầu trở nên phổ biến cho đến giữa những năm 2000. Các hệ thống cũ hơn rất khó có thể có sudo. Các hộp Unix có xu hướng sống lâu, vì vậy không thể tưởng tượng được rằng bạn vẫn sẽ chạy trên một hệ thống như vậy ngày nay.

Tôi chỉ dựa vào sudocác hệ thống mà cá nhân tôi quản lý hoặc các hệ thống như Ubuntu, macOS hoặc openSuSE theo cách duy nhất để có được quyền root, theo mặc định.

sugần với lệnh "lấy cho tôi siêu người dùng" hơn sudo, nhưng sau đó bạn có các hệ thống như Ubuntu và macOS nơi tài khoản root bị khóa theo mặc định đặc biệt để buộc bạn sử dụng sudothay vì su. Vì vậy, bạn cũng không thể gọi suphổ quát.


Chú thích :

  1. CentOS, Oracle Linux, Linux khoa học ...

  2. Có, ngay cả trong cài đặt tối thiểu.


9

sudolà một tiện ích có sẵn trên hầu hết các hệ thống Linux.
Tuy nhiên, nó không được gói theo mặc định trong tất cả các bản phát hành. Mặc dù vậy, tất cả các distro chính đều được gói theo mặc định.

Các bản phân phối Linux như Arch Linux, Gentoo, LFS, v.v ... cho phép người dùng hoàn toàn có thể tùy chỉnh không có sudo theo mặc định.

Trên Arch Linux, hệ thống cơ sở không đi kèm với sudocài đặt. Người dùng phải tự tải xuống sudovà chỉnh sửa tệp sudoers.
Ditto cho Gentoo và LFS. Tôi không biết bất kỳ bản phân phối chính nào khác mà không có sudo.

Và không, tôi không nghĩ rằng có tồn tại bất cứ thứ gì phổ quát hơn là sudocấp các đặc quyền siêu người dùng. Đó là, ngoài việc thực sự đăng nhập bằng root.


1
sudocó thể được gói trên hầu hết các bản phát hành, nhưng không phải tất cả chúng đều cấu hình mọi người dùng có khả năng chạy nó.
jsbillings

Một điểm tốt khác. Phụ thuộc vào những gì các tập tin sudoers nói.
darnir

7

Phân phối được sử dụng rộng rãi nhất, Ubuntu, sử dụng sudolàm phương pháp được đề xuất để trở thành root (khi sử dụng dòng lệnh - người dùng dính vào GUI sẽ nhận được lời nhắc mật khẩu mà không hiểu hoặc quan tâm đến những gì xảy ra trong trình duyệt). Các bản phân phối khác có thể hoặc không thể khuyến khích việc cài đặt sudo và thậm chí có thể hoặc không gửi nó. Mặt khác, sucó sẵn ở mọi nơi và có thể sử dụng được trên hầu hết các hệ thống ngoại trừ những hệ thống chỉ sudokhả dụng vì người dùng sẽ không có mật khẩu gốc.

Giữa susudo, bạn sẽ bao gồm hầu hết tất cả người dùng của bạn. Vài kỳ lạ, những người cần califehoặc ophay pfexecbiết phải làm gì rồi. Ngay cả khi họ không làm như vậy, một hệ thống sử dụng không có khả năng sucũng không sudocó tệp ở những nơi xa lạ và đủ những điều bạn chưa từng nghĩ rằng hướng dẫn của bạn có thể sẽ không hoạt động.


6

Để trả lời câu hỏi của bạn, chính xác nhất, không sudođược coi là phổ quát. Thực ra toàn bộ khái niệm 'phổ quát', thường là cá trích đỏ. Điều này đặc biệt đúng, liên quan đến khả năng tương thích chéo. Một khi bạn ném vào vô số phiên bản phần mềm khác nhau, tính phổ quát sẽ trở nên phi thực tế. Viết kịch bản tự nhiên là thực dụng, nếu nó mang tính mô phạm, việc viết các kịch bản di động thực tế là không thể.

Thông thường tôi đánh giá môi trường thực thi dự định của mình, Bản phân phối Linux bán hiện đại, tôi mong đợi trình bao POSIX với các Ứng dụng GNU phổ biến. Đối với các tập lệnh có thể chạy bên ngoài Linux, tôi chỉ mong đợi tiêu chuẩn POSIX đầy đủ. Rõ ràng nhiều tập lệnh dành riêng cho Linux, hoặc dành riêng cho bản phân phối, do đó thường thu hẹp phạm vi tính di động.

Để giải quyết trường hợp kịch bản cụ thể của bạn,

#!/bin/sh


## Exit Point
die() {
    [ -n "$2" ] && echo "$2"
    exit $1
}


## Require SuperUser Execution, Otherwise Re-Execute
[ `id -u` -ne 0 ] && {

    command -v lsb_release > /dev/null && {
        DISTRO="`lsb_release -is`"
        [ "$DISTRO" = "Ubuntu" ] && SUPERUSER='sudo'
    }
    SUPERUSER="${SUPERUSER:-su}"

    case "$SUPERUSER" in
        su)
            su -c "$0"
            ;;
        sudo)
            sudo "$0"
            ;;
    esac
}

## Require SuperUser Execution
[ `id -u` -ne 0 ] && die 78




echo 'Script Executed by UID'
id -u




## Clean Up
die 0

kịch bản được dán đó là lời khen của POSIX shell, tôi luôn viết Dash tương thích.


Nhưng không kịch bản của bạn yêu cầu sudo được cài đặt? Có cách nào chúng ta có thể có được quyền truy cập siêu người dùng mà không cần sử dụng sudo không? Thông qua kịch bản đơn giản?
darnir

@darnir: Không, tập lệnh đã dán không cần sudophải cài đặt. Nó yêu cầu thực thi siêu người dùng và có thể sử dụng sudonếu có sẵn. Nếu sudokhông có sẵn, thì tập lệnh phải được chạy như người dùng root, hoặc nó sẽ die.
JM Becker

@darnir: Ngoài ra thực sự không có gì gọi là "kịch bản đơn giản". Hầu hết mọi thứ, ngoại trừ shell dựng sẵn, được thực hiện thông qua các nhị phân thông thường. Đó là toàn bộ điểm của vỏ, để gọi các lệnh khác, cho dù là tương tác hay tự động. Đây là đặc điểm xác định, tách vỏ khỏi các ngôn ngữ lập trình mục đích chung. Vì vậy, bất kể bạn có được superuser như thế nào, bạn thực hiện nó thông qua các lệnh bên ngoài ..., giả sử bạn không mã hóa với các giao diện kernel thô.
JM Becker

1
@varesa: Thú vị là Ubuntu hoàn toàn ngược lại với cấu hình mặc định sudo / su. Bạn có thể kiểm tra những quyền sudo nào mà người dùng có sẵn, bằng cách thực thisudo -l . Thật không may, nó không thể sử dụng được trong tình huống này, vì nó có thể yêu cầu nhập mật khẩu. Suy nghĩ về điều này cẩn thận hơn, tôi thực sự nghĩ rằng toàn bộ khái niệm có thể đạt được tốt nhất thông qua một bài kiểm tra phân phối. Sử dụng su -ctrừ khi chạy một sudistro bị tắt mặc định, trong trường hợp đó là sử dụng sudo su -c. Như những người khác đã đề cập, tốt nhất là để lại độ cao siêu người dùng cho người dùng, tôi sẽ xem xét bất kỳ kịch bản nào xung quanh một cách thuận tiện.
JM Becker

1
@varesa: Tôi đã cập nhật tập lệnh đã dán, để giảm cơ hội sử dụng tập lệnh chưa được định cấu hình sudo. Điều này sẽ thực thi đúng trong hầu hết các distro, giả sử mặc định su/ sudocấu hình. Tôi biết một Ubuntu đã lỗi thời, trước đó lsb_release, sẽ cần được xử lý ... Nhưng đây thực sự chỉ là một ví dụ và rõ ràng có thể được mở rộng.
JM Becker
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.