Có hai phần cho câu trả lời: !!
vàsudo
!!
là một phần chức năng của shell (trong trường hợp Ubuntu có lẽ là bash, nhưng các shell khác như zsh hoặc csh cũng hỗ trợ điều này) được gọi là "mở rộng lịch sử". Nó hoạt động theo cách tương tự như các bản mở rộng khác trong đó phần vỏ mở rộng 'trình giữ chỗ' thành một tập hợp các từ. Mặc dù foo*
sẽ được mở rộng thành một danh sách tất cả các tệp bắt đầu bằng 'foo', !!
được mở rộng đến nội dung của dòng lệnh trước đó.
$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar
Giống như các bản mở rộng khác, điều này được thực hiện hoàn toàn bằng shell, vì vậy nếu bạn gõ !!
sau một số lệnh khác, lệnh này không biết rằng có một !!
, nhưng sẽ chỉ nhìn thấy dòng lệnh trước đó. (Không giống như các bản mở rộng khác, việc mở rộng lịch sử xảy ra trước khi một lệnh được lưu trong lịch sử, đó là thay vì !!
dòng lệnh được thay thế sẽ được lưu vào lịch sử.)
Các sudo
lệnh cho phép thực hiện lệnh như một người dùng khác, với điều kiện các điều khoản ar do chính sách bảo mật (mặc định được cấu hình trong /etc/sudoers
).
Theo mặc định, mật khẩu gốc vẫn chưa được đặt trong Ubuntu. Để thực hiện các tác vụ quản trị hệ thống, người dùng đã tạo trong khi cài đặt được cấp quyền sudo. Người dùng này hiện có thể thực thi bất kỳ lệnh nào trên shell dưới dạng root, chỉ bằng cách thêm trước sudo
. Một số chương trình GUI cũng sử dụng cơ chế sudo, ví dụ như quản lý gói.
Lý do tại sao sudo
có thể thực thi các lệnh khác với quyền root (hoặc người dùng khác) là vì nhị phân sudo ( /usr/bin/sudo
) có bit setuid được đặt trong quyền của nó và thuộc về root. Bất kỳ (nhị phân) thực thi nào với bit setuid được chạy đều có quyền của chủ sở hữu. Điều này có nghĩa là sudo chạy hiệu quả với quyền root bất kể người dùng nào thực sự gọi nó. Chỉ có chính sách bảo mật nội bộ của sudo quản lý người dùng nào được phép những gì và ngăn người dùng tùy tiện làm những việc tùy tiện.
Vì vậy, trong trường hợp sudo !!
này có nghĩa là
$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo !!
về cơ bản là giống hệt với
$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo mount /dev/sdb1 /mnt
chỉ cần gõ ít hơn. Trong cả hai trường hợp, sudo chỉ nhìn thấy mount /dev/sdb1 /mnt
và chạy nó với quyền root.