Nếu bạn thực sự muốn thực hiện công việc, bạn có thể định nghĩa một hàm shell được gọi là chạy shell gốc mới khi chạy theo cách đó và chỉ chạy lệnh thông thường khác.sudo cd directory
bash
sudo
sudo
Như được trình bày trong các câu trả lời khác, hầu hết người dùng sẽ không muốn làm điều đó, nhưng thay vào đó sẽ muốn:
- Chạy
sudo -s
hoặc sudo -i
nếu bạn muốn có một vỏ đăng nhập (hãy nhớ rằng một tác động của sudo -i
là bắt đầu bạn trong thư mục gốc của root) hoặc sudo bash
nếu bạn muốn buộc bash
hoặc có thể chuyển các tùy chọn cho trình bao.
- Chạy trong vỏ mới.
cd directory
- Thực hiện bất kỳ hành động nào (khác) cần được thực hiện như root trong shell mới.
- Sau khi hoàn thành, chạy
exit
để rời khỏi vỏ mới. Điều quan trọng là đừng quên điều này, bởi vì bạn không muốn thực hiện nhiều hành động như root hơn bạn dự định!
Vì vậy, nếu bạn muốn, thì bạn có thể viết hàm shell (hoặc tập lệnh) thực hiện hai hành động đầu tiên khi sudo
được theo sau cd
và chỉ chạy sudo
bình thường. Vui lòng không sử dụng điều này như một cách thay thế để tìm hiểu lý do tại sao sudo cd
không thành công , bởi vì nếu bạn không hiểu chuyện gì đang xảy ra, thì bạn có thể sẽ rất bối rối khi ở trong một vỏ mới (và bạn có thể không hiểu bất kỳ thông báo lỗi nào xảy ra).
Đây là một cách để viết một hàm shell như vậy, nó cũng nhắc nhở bạn rằng bạn đang ở trong một shell mới và bạn nên exit
thoát khỏi nó khi bạn kết thúc. (Nhắc nhở Đó có thể sẽ hữu ích cho người sử dụng bất kỳ trình độ kỹ năng, bởi vì người ta không nói chung là quen với việc trong một vỏ mới khi một chạy sudo
mà không cần -s
, -i
hoặc tên của một vỏ thực tế là một cuộc tranh cãi.)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
sudo bash -c '
if cd -- "$2"; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
else
command sudo "$@"
fi
}
Bạn có thể đặt cái này vào trong ~/.bashrc
, mặc dù đây là một cách đủ kỳ lạ để sử dụng sudo
mà đôi khi bạn chỉ muốn bật nó. Trong trường hợp đó, tốt hơn là đặt nó trong tập tin riêng của mình. Nếu bạn tạo một tệp được gọi sudo.bash
trong thư mục chính của mình với các nội dung đó, thì bạn có thể sudo
cung cấp chức năng có sẵn - để nó sẽ chạy thay vì sudo
lệnh thông thường - bằng cách chạy . ~/sudo.bash
. Điều đó có hiệu lực trong lớp vỏ hiện tại và lớp vỏ con của nó, nhưng không phải là lớp vỏ khác. Vì lý do tương tự mà các tệp như .bashrc
không thể thực thi được, đừng đánh dấu sudo.bash
thực thi bằng chmod
. Đây thực sự là một thư viện, chứ không phải là một kịch bản shell độc lập. Nếu bạn đã làmchạy nó dưới dạng shell script, nó sẽ xác định hàm ... nhưng chỉ trong shell chạy script, không dành cho bạn như người gọi. (Tất nhiên, bạn có thể viết một kịch bản cho việc này, điều đó không xảy ra là cách tiếp cận tôi đã thực hiện ở đây.)
Để kiểm tra và xem nếu sudo
hiện tại được định nghĩa là hàm shell và để xem định nghĩa hiện tại của nó nếu nó là một, hãy chạy type sudo
. Để vô hiệu hóa (nghĩa là xác định) chức năng một khi nó được xác định, hãy chạy unset -f sudo
. Để tự chạy sudo
lệnh thông thường trực tiếp ngay cả khi hàm shell được xác định, hãy chạy command sudo
. Tuy nhiên, lưu ý rằng bạn không phải làm điều đó, bởi vì sudo
hàm này thực sự tự thực hiện bất cứ khi nào có nhiều hơn hoặc ít hơn hai đối số được truyền cho nó hoặc đối số đầu tiên được truyền cho nó là bất cứ điều gì ngoài cd
. Đó là lý do tại sao bạn vẫn có thể sử dụng nó theo cách thông thường mà mọi người sử dụng sudo
.
Cũng lưu ý rằng hàm shell được hiển thị ở trên vẫn không cho phép bạn chuyển các đối số khác sang sudo
, nhưng điều đó sẽ ngăn nó xử lý cd
đặc biệt . Chạy đặc biệt không được hỗ trợ, mặc dù bạn có thể mở rộng chức năng shell để hỗ trợ trường hợp đó. Cũng không phải . Vỏ mà nó tạo ra tương tự như những gì bạn nhận được với . Mã không thực sự chạy , nhưng sử dụng , vì vậy tùy chọn hoạt động đúng. Nó thực sự chạy hai lần khi bạn vượt qua và một đối số thư mục cho nó (và không có lần nào khác). Khi bạn chạy , đầu tiên, nó tách ra một bash shell riêng biệt từ cái bạn đang chạy chức năng trong và thay đổi thư mục. Nếu thành công, nó sẽ thay thếsudo -u user cd directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
bash shell đó với một cái tương tác mới mà bạn có thể sử dụng.
Dưới đây là một ví dụ về cách chức năng shell đó tự động "thực hiện đúng". Lưu ý rằng sudo ls -A /root
cư xử bình thường. Chỉ khi tôi cố gắng vào cd
một thư mục với sudo
một shell mới được tạo và tôi mới được nhắc nhở rõ ràng về những gì đang xảy ra.
ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude .bashrc .config .emacs.d .nano .rpmdb
.bash_history .cache .dbus .local .profile
ek@Io:~$ sudo -k # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$
Nếu bạn cố gắng chuyển sudo cd
đến một thư mục mà bạn không thể thay đổi thành gốc, thì bạn sẽ nhận được thông báo lỗi:
ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$
Tôi đã sử dụng sudo -k
ở giữa các yêu cầu trong các ví dụ trên để cho thấy rằng nó xác thực bạn là root trước khi thử thay đổi thư mục. Nhưng bạn không thực sự phải tự chạy sudo -k
. Vì hàm shell chỉ là một trình bao bọc mỏng cho sudo
lệnh thực , bộ đệm của thông tin đăng nhập của bạn và các sudo
hành vi phổ biến khác vẫn hoạt động bình thường.
Mặc dù nó hoạt động tốt và khá gọn gàng, tôi thừa nhận rằng việc che giấu sudo
lệnh thực sự với một chức năng cùng tên là siêu kỳ lạ. Hầu hết người dùng có thể sẽ chỉ muốn thực hiện các bước sudo -s
, chính họ. Nhưng trong trường hợp bất cứ ai cũng muốn điều này - và cũng để chứng minh rằng nó có thể - nó đây.cd directory
ls -l
trong các thư mục chính nó.