TL; DR: Bạn có thể sử dụng sudo -i
để chạy một hàm được xác định /root/.bashrc
(nhưng không phải là bí danh) và cũng có quyền truy cập vào các biến được xuất từ tệp đó:
đối số lệnh sudo -i
Tuy nhiên, bí danh không hoạt động ở đó, nhưng bạn có thể dễ dàng chuyển đổi chúng thành các chức năng nếu bạn muốn cung cấp chúng cho sudo -i
.
Đọc để phân tích đầy đủ và biết thêm chi tiết.
Có một vài vấn đề ở đây, một số về cách thức hoạt động của sudo và một số cách thức hoạt động của bash ...
Theo mặc định, sudo
sẽ chỉ tìm kiếm các lệnh và sẽ bỏ qua trình bao, vì vậy chỉ cần chạy sudo ll
sẽ chỉ hoạt động nếu có một ll
tệp thực thi trong một trong các thư mục trong $PATH
. Vì vậy, để sử dụng bí danh (hoặc hàm), bạn cần đảm bảo một shell được gọi như một phần của quy trình.
Một cách sẽ là chạy một cái gì đó như sudo sh
hoặc sudo bash
, mặc dù hiện đại sudo
(tôi đang thử nghiệm điều này trên sudo 1.8.19p1) có các tùy chọn -s
và-i
cho mục đích đó.
Vì vậy, một lần thử sẽ là một cái gì đó giống như sudo -s ll
(tương đương với sudo bash -c 'll'
, giả sử bạn $SHELL
là Bash, dường như là trường hợp dựa trên những rcfile
gì bạn đã đề cập.) Nhưng điều đó cũng không hoạt động, vì nó khởi động vỏ trong một không tương tác, chế độ không đăng nhập, không đọc bất kỳ tệp khởi động nào của nó. Về cơ bản, nó giống như khi bạn viết một kịch bản shell và sử dụng #!/bin/bash
để chạy nó. Các bí danh (và chức năng) bạn có trong~/.bashrc
tệp không thể truy cập được từ tập lệnh đó ...
Vì vậy, tiếp theo là -i
tùy chọn, tạo ra một vỏ đăng nhập. Điều đó hứa hẹn hơn, vì nó sẽ đọc các tệp khởi động của bạn! Tuy nhiên, sudo -i ll
(tương đương sudo bash -l -c 'll'
) vẫn sẽ không hoạt động. Vì vậy, làm thế nào là có thể, cho nó đã đọc định nghĩa củall
bí danh?
Vâng, lời giải thích tiếp theo ở đây là, theo mặc định, bash sẽ không mở rộng bí danh, ngoại trừ khi shell tương tác ... Shell này bắt đầu bởi sudo -i
(hoặc bash -l
) là một vỏ đăng nhập , nhưng vẫn không tương tác.
Vì vậy, bước tiếp theo là để có được một vỏ tương tác , sau đó hoạt động :
sudo bash -i -c 'll'
(Có cả đăng nhập và tương tác cũng tốt, tất nhiên, bash -l -i -c ...
sẽ hoạt động.)
Một cách khác là tiếp tục sử dụng shell đăng nhập (không tương tác) nhưng yêu cầu rõ ràng để mở rộng bí danh, vì vậy điều này cũng sẽ hoạt động:
sudo bash -l -O expand_aliases -c 'll'
(Trường hợp bash tương tác không cần shell đăng nhập , vì điều đó đủ để đọc các tệp khởi tạo, nhưng cái này cần -l
đọc chúng.)
Đây là những dòng lệnh khá dài ... Và chúng cũng yêu cầu bạn trích dẫn toàn bộ lệnh shell, vì vậy nếu bạn gọi một bí danh bằng các đối số, bạn sẽ phải biến tất cả thành một chuỗi ... Vì vậy, đó là loại vụng về sử dụng ...
Lưu ý rằng trước đó tôi đã nói về bí danh và chức năng ... Đó là mục đích, vì các chức năng thực sự thuận tiện hơn rất nhiều ở đây. Bạn không cần bất cứ điều gì đặc biệt (chẳng hạn như có vỏ tương tác hoặc đặt tùy chọn cụ thể) để thực thi các chức năng trên vỏ, miễn là bạn tìm nguồn cung cấp định nghĩa của chúng.
Vì vậy, nếu bạn xác định ll
là hàm thay vì bí danh, bạn có thể sử dụng trực tiếp với -i
phím tắt của sudo :
sudo -i ll
Và nếu bạn có một dòng lệnh dài hơn, với các đối số, bạn cũng có thể chuyển chúng trực tiếp tại đây:
sudo -i ll -C -R /etc
(So sánh với sudo bash -i -c 'll -C -R /etc'
.)
Các chức năng cũng linh hoạt hơn rất nhiều và thường dễ bảo trì hơn ... Thông thường dễ dàng chuyển đổi bí danh thành một chức năng, lưu ý duy nhất là luôn luôn sử dụng "$@"
khi bạn muốn thực hiện các đối số bổ sung (thường là vào cuối của bí danh.)
Ví dụ: bí danh này:
alias ll='ls $LS_OPTIONS -l'
Có thể được chuyển thành chức năng này:
ll () {
ls $LS_OPTIONS -l "$@"
}
Họ, cho hầu hết các mục đích, tương đương. Và, như đã đề cập trước đó, chức năng nên được truy cập trực tiếp từ đó sudo -i
, vì vậy đó là phần thưởng bổ sung.
Tôi hy vọng bạn tìm thấy câu trả lời và giải thích này hữu ích!
/root/.bashrc
thực sự những gì Q đặt sau là bí danh từ tệp này - điều này là không thể đối với điều này - unix.stackexchange.com/questions/1496/ .