Một vài điều về sudo command

Chắc hẳn khi dùng Ubuntu, chúng ta ai cũng đã từng gặp phải lỗi kinh điển “Permission denied”. Lúc đó, mặc định với 99% người đang sử dụng Ubuntu là sử dụng lệnh sudo để giải quyết vấn đề, mọi vấn đề được giải quyết 1 cách đơn giản. Trong bài viết tới mình giới thiệu về lệnh sudo này mà chúng ta vẫn sử dụng hằng ngày nhé :D.

0. Tổng quan

Lệnh sudo, theo hướng dẫn từ trang man page, nó được sử dụng để thực thi một lệnh như một người dùng khác.

Detail: http://manpages.ubuntu.com/manpages/xenial/man8/sudo.8.html

2. sudo visudo?

Đây là cách để chúng ta thực hiện các cấu hình với lệnh sudo. Trong file này sẽ cấu hình được các lệnh sử dụng sudo, NOPASSWD hoặc có thể cấu hình thời gian phiên làm việc với lệnh sudo. Chi tiết như thế nào thì mình trình bày chi tiết trong từng phần nhé.

3. What is a sudo session?

Một phiên làm việc với lệnh sudo sẽ có thời gian là 15 phút theo mặc định. Bạn có thể tùy chỉnh nó lên bao nhiêu phút là tùy bạn :D

1
sudo visudo

Sau đó tìm tới dòng:
1
Defaults env_reset

Và tùy chỉnh thời gian mà bạn muốn:
1
Defaults env_reset,timestamp_timeout=[new-value]

[new-value] ở đây là số phút mà bạn muốn cài đặt cho mỗi phiên sử dụng lệnh sudo. Ví dụ nếu bạn muốn cài đặt mỗi phiên sudo là 40 phút.
1
Defaults env_reset,timestamp_timeout=40

Easy nhỉ :D. Nếu bạn muốn mỗi lần sử dụng sudo đều phải nhập mật khẩu, hãy set giá trị này về 0. Trong trường hợp bạn muốn mỗi phiên thời gian sử dụng sudo là vô tận, set giá trị này về -1. Tuy nhiên hãy chú ý khi set về -1 vì nó gây điểm yếu cho hệ thống của bạn.

4. The sudo password

Mỗi khi sử dụng lệnh sudo, bạn phải nhập mật khẩu. Tuy nhiên không có bất cứ gì show mật khẩu cho bạn, nếu bạn thấy điều đó là khó chịu, bạn có thể setup để mỗi lần nhập mật khẩu sẽ show lên.

Bạn hãy tìm tới dòng:

1
Defaults        env_reset

Và thay thế nó là:
1
Defaults        env_reset,pwfeedback

Và kết quả là:

5. No Password

Đôi khi việc gõ mật khẩu khi sử dụng sudo gây bất tiện cho bạn (nhưng hãy lưu ý, nó là bảo mật nhé, việc sử dụng No Password này không khuyến khích, chỉ nên sử dụng cho lệnh không quan trọng hoặc trong shell script), một số cách sau sẽ giúp bạn sử dụng sudo mà không cần mật khẩu.

Cách 1: Set thời gian session trong file cấu hình.

Cách này đã được đề cập ở trên, set thời gian session sử dụng sudo command về -1. Cách này cực kì nguy hiểm vì nó sẽ áp dụng cho mọi scripts sử dụng sudo

Một cách khác mà bạn có thể sử dụng là Cách 2

Cách 2: Sử dụng ngoại lệ.

Ban có thể tạo một vài ngoại lệ trong file cấu hình sudo command không sử dụng mật khẩu với nội dung như sau

1
YOUR_USER_NAME ALL=(ALL:ALL) NOPASSWD:/abs/path/to/your/script

Với

  • YOUR_USER_NAME là username của bạn, có thể xem bằng cách sử dụng lệnh whoami hoặc who
  • /abs/path/to/your/script: đường dẫn sử dụng command của bạn

Xem xét ví dụ sau mỗi khi bạn muốn sử dụng

1
sudo apt-get update

mà không cần nhập mật khẩu. Đầu tiên hãy mở file cấu hình của lệnh sudo lên:
1
sudo visudo

Và thêm dòng
1
minhnv ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt-get update

OK rồi đó, đơn giản nhể :D. Việc cấu hình như thế này sẽ cho phép bạn chọn được những lệnh nào là “NOPASSWD”.

Cách này hiệu quả khi bạn sử dụng sudo trong các shell script. Hãy thử xem xét trường hợp máy bạn cài cả nginxapache2, và nginx sẽ luôn được khởi động ưu tiên apache2. Bạn cần viết 1 shell script để ưu tiên apache2 hơn (tắt nginx và bật apache2). Vấn đề là 2 lệnh

1
2
service stop nginx
service start apache2

này lại yêu cầu quyền root, vì vậy bạn cần cấu hình nó trong file /etc/sudoers kia :D
1
2
minhnv ALL=(ALL:ALL) NOPASSWD:/usr/bin/service start
minhnv ALL=(ALL:ALL) NOPASSWD:/usr/bin/service stop

Rồi ngon, giờ triển với shell script thôi nào
1
2
3
#!/bin/sh

sudo service nginx stop && sudo service apache2 start

Finish!!!

Tài liệu tham khảo

Author

Ming

Posted on

2020-01-09

Updated on

2021-04-10

Licensed under

Comments