Cách truyền bí danh qua sudo


32

Tôi có một bí danh truyền một số tham số cho một công cụ mà tôi thường sử dụng. Đôi khi tôi chạy như chính mình, đôi khi theo sudo. Thật không may, tất nhiên, sudo không nhận ra bí danh.

Có ai có một gợi ý về cách vượt qua bí danh?

Trong trường hợp này, tôi có một loạt các tùy chọn cho perl khi tôi gỡ lỗi:

alias pd='perl -Ilib -I/home/myuser/lib -d'

Đôi khi, tôi phải gỡ lỗi các công cụ của mình dưới dạng root, vì vậy, thay vì chạy:

pd ./mytool --some params

Tôi cần phải chạy nó dưới sudo. Tôi đã thử nhiều cách:

sudo eval $(alias pd)\; pd ./mytool --some params
sudo $(alias pd)\; pd ./mytool --some params
sudo bash -c "$(alias pd)\; pd ./mytool --some params"
sudo bash -c "$(alias pd); pd ./mytool --some params"
sudo bash -c eval\ "$(alias pd)\; pd ./mytool --some params"
sudo bash -c eval\ "'$(alias pd)\; pd ./mytool --some params'"

Tôi đã hy vọng một cách hay, ngắn gọn để đảm bảo rằng bí danh pd hiện tại của tôi đã được sử dụng đầy đủ (trong trường hợp tôi cần phải điều chỉnh nó sau), mặc dù một số nỗ lực của tôi không ngắn gọn. Phương án cuối cùng của tôi là đưa nó vào một kịch bản shell và đặt nó ở đâu đó mà sudo sẽ có thể tìm thấy. Nhưng bí danh đôi khi rất tiện dụng, vì vậy nó là phương sách cuối cùng.

Câu trả lời:


50

Một giải pháp rất thanh lịch có thể được tìm thấy trong Archlinux-Wiki:

alias sudo='sudo '
# whitespace ---^

hoạt động để vượt qua tất cả các bí danh để sudo.

Nguồn: http://wiki.archlinux.org/index.php/Sudo#Passing_aliases


16
Đây là một mẹo hay! Đối với những người tò mò, lời giải thích từ phần bí danh trong trang bash:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
Russell Davis

1
Đây thực sự nên là câu trả lời được chấp nhận.
Adrian Frühwirth

Thật là xấu hổ khi điều này không hoạt động cho các chức năng.
Ciro Santilli 心 心

2
Lưu ý: Giả sử bạn cần phải chuyển một tùy chọn sang sudomột lần nữa, trong khi muốn giữ sudothủ thuật thông qua đó cùng một lúc. Thậm chí điều này có thể được thực hiện: để sử dụng lại các tùy chọn, sử dụng \sudo. Dấu gạch chéo ngược sẽ ghi đè bí danh. (Nhiều người dường như không biết về điều đó). Bằng cách này, bạn có thể ( nguy hiểm! ) Thậm chí xóa các tệp mà không có bất kỳ cảnh báo nào , ghi đè lên alias rm='rm -i'thông thường được chỉ định trong .bash-aliases, chỉ bằng cách nhập \rm file-to-delete.
cú pháp

11

Tôi không thực sự rõ ràng về những gì bạn đang cố gắng làm. Tôi có thể thấy hai cách:

Đúng cách

alias pd='sudo perl -Ilib -I/home/myuser/lib -d'

Sau đó, việc thực thi pd ./mytoolsẽ thực thi lệnh gỡ lỗi của bạn dưới dạng root nhưng vẫn bảo toàn các lợi ích của sudo (đường dẫn kiểm toán, không hoạt động trong shell root).

Thí dụ:

insyte $ bí danh sid = 'sudo id'
nội bộ $ sid
uid = 0 (root) gid = 0 (root) nhóm = 0 (root)

Cách dễ dàng

Thêm bí danh vào root .bashrcvà sử dụng sudo -ibất cứ khi nào bạn sudo để root.

root # echo 'alias fb = "echo foo bar"' >> /root/.bashrc
thoát # gốc
lối thoát hiểm
nội bộ $ sudo -i
gốc # fb
thanh foo

4

Chỉ cần có hai bí danh và sử dụng một biến

Tôi không thấy lý do sử dụng awkhoặc cuttrừ khi chỉ xác định bí danh cốt lõi một lần để dễ sửa đổi hơn. Nếu đó là trường hợp, thì điều này hoạt động:

# ... in .bashrc ...
pd='perl -Ilib -I/home/myuser/lib -d'
alias pd="$pd"
alias spd="sudo $pd"

Đây là một hàm đơn giản để tạo các cặp bí danh như ở trên:

mkap () {
    alias $1=$2
    alias s$1="sudo $2"
}

Để sử dụng:

mkap pd 'perl -Ilib -I/home/myuser/lib -d'
mkap ct 'cat'

Bây giờ bạn có pdspdcộng ctsct.

$ ct /etc/shadow
cat: /etc/shadow: Permission denied
$ sct /etc/shadow
[sudo] password for dennis:
root:[censored]...
$ alias
alias ct='cat'
alias pd='perl -Ilib -I/home/myuser/lib -d'
alias sct='sudo cat'
alias spd='sudo perl -Ilib -I/home/myuser/lib -d'

4

Tôi ước tôi có thể đánh dấu hai câu trả lời là "chính xác". Kết hợp đúng cách từ bài viết sâu sắc, sâu sắc của Insyte , với giải pháp awk (hoặc cắt) từ Bill Weiss , tôi đã nghĩ ra điều này:

alias spd="sudo $(alias pd | cut -d\' -f2)"

Bây giờ tôi sẽ chỉ đi và đặt cái này vào một hàm shell trong .bashrc hoặc thứ gì đó, rồi tạo các phiên bản "s" của tất cả các bí danh mà tôi muốn chạy với quyền root.

Cập nhật : sửa đổi một chút chức năng đơn giản của Dennis Williamson để làm cho nó dễ sử dụng hơn một chút:

 salias()
 {
   local a c
   a=$(echo "$1" | cut -f1 -d=)
   c=$(echo "$1" | cut -f2- -d=)
   alias $a="$c"
   alias s$a="sudo $c"
 }

Điều này có nghĩa là tôi chỉ cần đặt "s" trước toàn bộ lệnh. Thay vì:

alias pd='perl -Ilib -I/home/myuser/lib -d'

Tôi chỉ cần thêm s ở phía trước.

salias pd='perl -Ilib -I/home/myuser/lib -d'

Và tôi đã xong. Chắc chắn, máy tính làm việc nhiều hơn một chút, nhưng đó là những gì máy tính dành cho. :-)

Cảm ơn!


Bạn có thể (hoặc có thể) đánh dấu những thứ được chấp nhận, giống như đánh dấu chúng đúng :)
Bill Weiss

Phải - Tôi muốn đánh dấu hai câu trả lời là đúng :-P
Tanktalus

3
Tại sao câu trả lời của Slizzered? alias sudo="sudo "hoạt động hoàn hảo.
trusktr


3

Sẽ không dễ dàng hơn nếu chỉ đơn giản là hack một tập lệnh bao gồm các tùy chọn của bạn, sau đó đặt nó ở đâu đó trong một trong các thư mục là đường dẫn cho tài khoản và root thông thường? Nó thực sự sẽ không mất nhiều kịch bản.

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*

Nó thực sự phải là "$ @" thay vì $ *, và đó là một phần lý do tôi thường cố gắng tránh nó. ;-) Nó hoạt động, nó chỉ lãng phí một loạt không gian đĩa liên quan đến những gì nó chứa.
Tanktalus

3

Điều này là thô, nhưng nó hoạt động ở đây:

houdini@clanspum:~/ > alias fb
fb='echo foo bar'
houdini@clanspum:~/ > alias fb | awk -F\' '{print $2}'
echo foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}')"
foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}') a b c"
foo bar a b c
houdini@clanspum:~/ > fb
foo bar
houdini@clanspum:~/ > fb a b c
foo bar a b c

Tôi đã dán một giải pháp không đầy đủ ở đây, sau đó chỉnh sửa để sửa chữa. Một trong những hiện tại là đúng. Một lời giới thiệu miễn phí cho người đầu tiên bình luận giải thích những gì đang diễn ra ở đây :)
Bill Weiss

Tôi đã hy vọng một cách đơn giản hơn awk, nhưng hy vọng! = Thực tế đôi khi ;-) Rõ ràng, "cut -f2 -d \ '" sẽ hoạt động tốt như awk, và ngắn hơn một chút.
Tanktalus

Vâng, cắt sẽ làm việc, tôi luôn quên nó.
Bill Weiss

3

Thêm tiền tố "sudo" vào các bí danh AND được chọn từ bên trong của bạn ~/.bashrcnhư vậy:

#a regular alias
alias pd='perl -Ilib -I/home/myuser/lib -d'

#sudofy (command id, alias pd - add others to this list)
for cmd in id pd;
      do alias "s$cmd"="sudo $cmd";
done;

Điều đó không hiệu quả - đó là nơi tôi bắt đầu. Bạn đã thử à?
Tanktalus

Khái niệm tốt đẹp. Tôi nghĩ alias sudo="sudo "là dễ dàng hơn mặc dù.
trusktr

3

Như đã đăng một vài lần, hãy làm trong '.bashrc':

bí danh sudo = 'sudo'

Lý do tại sao được giải thích trong 'man bash' và 'help alias':

bí danh: bí danh [-p] [name [= value] ...] Xác định hoặc hiển thị bí danh.

Without arguments, `alias' prints the list of aliases in the reusable
form `alias NAME=VALUE' on standard output.

Otherwise, an alias is defined for each NAME whose VALUE is given.
**A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.**

1

Bạn muốn một cái gì đó như thế này:

(alias; echo "exec < /dev/tty") | sudo bash  -i

Tôi có thể sai, nhưng ISTR rằng bash -i(i = tương tác) chỉ là v4.0. Vì vậy, trên một máy chủ cũ hơn vẫn bashchạy v3, điều này rất có thể sẽ thất bại. Nhưng hãy chứng minh tôi sai, bất cứ ai, hãy tiếp tục;)
cú pháp

@syntaxerror - Bạn nhớ nhầm. -ilà vỏ Bourne, xem: pubs.opengroup.org/onlinepub/009695399/utilities/sh.html
geocar

Ồ, không mong nhận được hồi âm sớm cho một bài viết cũ hơn 6 tuổi ... Tại sao có, tôi có thể đã nhầm lẫn nó #!/bin/bash -isau shebang, dường như không giống (?). Để cắt một đoạn ngắn câu chuyện dài, sử dụng historytrong một bashkịch bản (và không phải trên "sống" dòng lệnh) sẽ đòi hỏi sự -ilựa chọn, mà tôi đã không thể có được làm việc trên một máy chủ với "chỉ" bashv3 cài đặt. Và đó là sự thật.
cú pháp

1

Tôi không biết nếu đó là điều khôn ngoan nhất để làm trên hộp sản xuất nhưng tôi sử dụng tại địa phương

alias sudo="sudo -E"

Tùy chọn -E ( bảo vệ môi trường ) sẽ ghi đè tùy chọn env_reset trong sudoers (5)). Nó chỉ khả dụng khi lệnh khớp có thẻ SETENV hoặc tùy chọn setenv được đặt trong sudoers (5).


-1

Bạn có thể thêm bí danh vào .bashrc của root hay chỉ thực thi .bashrc thông qua sudo trước lệnh của bạn?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)

1
Ừm, điều này thậm chí gần như không hoạt động. Nó thực sự khá gần với một số điều tôi đã thử ở trên, nhưng khác xa với cú pháp shell / sudo thực tế.
Tanktalus
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.