วิธีส่งนามแฝงผ่าน sudo


32

ฉันมีนามแฝงที่ส่งผ่านพารามิเตอร์บางอย่างไปยังเครื่องมือที่ฉันใช้บ่อย บางครั้งฉันวิ่งเป็นตัวเองบางครั้งภายใต้ sudo น่าเสียดายที่ sudo ไม่รู้จักนามแฝง

ใครบ้างมีคำใบ้เกี่ยวกับวิธีการส่งนามแฝงผ่าน?

ในกรณีนี้ฉันมีตัวเลือกมากมายสำหรับ perl เมื่อฉันกำลังดีบั๊ก:

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

บางครั้งฉันต้องแก้จุดบกพร่องเครื่องมือของฉันเป็นรูทดังนั้นแทนที่จะรัน:

pd ./mytool --some params

ฉันต้องใช้มันภายใต้ sudo ฉันได้ลองหลายวิธี:

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'"

ฉันหวังว่าจะเป็นวิธีที่กระชับและกระชับเพื่อให้แน่ใจว่านามแฝง pd ปัจจุบันของฉันถูกใช้อย่างสมบูรณ์ (ในกรณีที่ฉันต้องบิดมันในภายหลัง) แม้ว่าความพยายามของฉันจะไม่รัดกุมก็ตาม ทางเลือกสุดท้ายของฉันคือการใส่มันลงในเชลล์สคริปและทำให้บางที่ sudo หาเจอ แต่นามแฝงนั้นมีประโยชน์มากในบางครั้งดังนั้นจึงเป็นทางเลือกสุดท้าย

คำตอบ:


50

มากทางออกที่สวยงามสามารถพบได้ใน ArchLinux-วิกิพีเดีย:

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

sudoทำงานเพื่อผ่านนามแฝงทั้งหมดเพื่อ

ที่มา: http://wiki.archlinux.org/index.php/Sudo#Passing_aliases


16
นี่เป็นเคล็ดลับที่ยอดเยี่ยม! สำหรับการอยากรู้อยากเห็นคำอธิบายจากส่วนนามแฝงใน manpage ทุบตีไปนี้:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
รัสเซลเดวิส

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับจริงๆ
Adrian Frühwirth

มันเป็นความอัปยศที่มันใช้ไม่ได้กับฟังก์ชั่น
Ciro Santilli 新疆改造中心法轮功六四事件

2
หมายเหตุ: หากคุณจำเป็นต้องส่งตัวเลือกให้sudoอีกครั้งในขณะที่ต้องการเก็บเลเวลนั้นไว้ให้sudoพร้อมในขณะเดียวกัน แม้เรื่องนี้จะสามารถทำได้: \sudoใช้ตัวเลือกอีกครั้งการใช้งาน แบ็กสแลชจะแทนที่นามแฝง (หลายคนดูเหมือนจะไม่รู้เรื่องนั้น) วิธีนี้คุณสามารถ ( อันตราย! ) แม้จะลบไฟล์โดยไม่ต้องใด ๆเตือนเอาชนะalias rm='rm -i'ระบุทั่วไปในเพียงโดยการพิมพ์.bash-aliases \rm file-to-delete
ไวยากรณ์

11

ฉันไม่ชัดเจนในสิ่งที่คุณพยายามจะทำ ฉันเห็นสองวิธี:

ทางที่ถูก

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

จากนั้นการดำเนินการpd ./mytoolจะดำเนินการตามคำสั่งการดีบักของคุณในฐานะ root แต่ยังคงรักษาประโยชน์ของ sudo ไว้ (หลักฐานการตรวจสอบไม่ใช่การทำงานของรูทเชลล์)

ตัวอย่าง:

insyte $ alias sid = 'sudo id'
แทรก $ sid
uid = 0 (root) gid = 0 (root) groups = 0 (root)

วิธีที่ง่าย

เพิ่มนามแฝงไปที่รูท.bashrcและใช้sudo -iทุกครั้งที่คุณ sudo ถึงรูท

root # echo 'alias fb = "echo foo bar"' >> /root/.bashrc
root # exit
ทางออก
insyte $ sudo -i
root # fb
foo bar

4

เพียงแค่มีสองนามแฝงและใช้ตัวแปร

ฉันไม่เห็นเหตุผลในการใช้awkหรือcutยกเว้นว่าจะมีการกำหนดชื่อแทนหลักเพียงครั้งเดียวเพื่อให้สามารถแก้ไขได้ง่ายขึ้น หากเป็นกรณีนี้ก็ใช้งานได้:

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

นี่คือฟังก์ชั่นง่าย ๆ ในการสร้างชื่อแทนคู่เช่นชื่อด้านบน:

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

ใช้:

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

ตอนนี้คุณมีpdและspdบวกและ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

ฉันหวังว่าฉันสามารถทำเครื่องหมายคำตอบสองคำว่า "ถูกต้อง" เมื่อรวมวิธีที่ถูกต้องจากInsyte 's, um, โพสต์ที่ชาญฉลาดเข้ากับโซลูชัน awk (หรือ cut) จากBill Weissฉันได้มากับสิ่งนี้:

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

ตอนนี้ฉันจะไปและใส่สิ่งนี้ลงในฟังก์ชั่นเชลล์ใน. bashrc ของฉันหรือบางอย่างจากนั้นสร้างนามแฝงทั้งหมดของฉันที่ฉันต้องการเรียกใช้เป็นรูท

ปรับปรุง : การปรับเปลี่ยนเล็กน้อยของฟังก์ชันแบบง่าย ๆของDennis Williamsonเพื่อให้ใช้งานง่ายขึ้น:

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

หมายความว่าฉันต้องใส่ "s" ต่อหน้าคำสั่งทั้งหมด แทน:

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

ฉันแค่เพิ่ม s ไว้ข้างหน้า

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

และฉันก็ทำเสร็จแล้ว แน่นอนว่าคอมพิวเตอร์ใช้งานได้มากกว่าเดิมเล็กน้อย แต่นั่นก็เป็นสิ่งที่คอมพิวเตอร์ใช้ :-)

ขอบคุณ!


คุณสามารถ (หรือควรจะสามารถ) สิ่งที่ทำเครื่องหมายว่าได้รับการยอมรับซึ่งเป็นชนิดเช่นการทำเครื่องหมายให้พวกเขาแก้ไข :)
บิลไวส์

ขวา - ฉันต้องการที่จะทำเครื่องหมายสองคำตอบที่ถูกต้องเป็น :-P
Tanktalus

3
ทำไมไม่ตอบ Slizzered? alias sudo="sudo "ทำงานได้สมบูรณ์แบบ
trusktr


3

การแฮ็คสคริปต์ที่มีตัวเลือกของคุณนั้นง่ายกว่าหรือไม่แล้ววางไว้ที่ใดที่หนึ่งในโฟลเดอร์ที่เป็นเส้นทางสำหรับบัญชีและรูทปกติ มันจะไม่ใช้สคริปต์มากนัก

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

จริงๆแล้วมันต้องเป็น "$ @" แทนที่จะเป็น $ * และนั่นเป็นส่วนหนึ่งของเหตุผลที่ฉันพยายามหลีกเลี่ยง ;-) มันใช้งานได้มันเปลืองเนื้อที่ดิสก์จำนวนมากเมื่อเทียบกับที่มีอยู่
Tanktalus

3

หยาบ แต่ใช้งานได้ที่นี่:

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

ฉันวางโซลูชันที่ไม่สมบูรณ์ที่นี่จากนั้นแก้ไขเพื่อแก้ไข อันปัจจุบันถูกต้อง upvote อิสระที่จะเป็นคนแรกที่จะแสดงความคิดเห็นอธิบายสิ่งที่เกิดขึ้นที่นี่ :)
บิลไวส์

ฉันหวังว่าวิธีที่ง่ายกว่า awk แต่ความหวัง! = ความจริงบางครั้ง ;-) เห็นได้ชัดว่า "cut -f2 -d \ '" จะใช้ได้เช่นเดียวกับ awk และสั้นกว่านิดหน่อย
Tanktalus

ใช่ตัดจะทำงานฉันมักจะลืมมัน
Bill Weiss

3

เพิ่มคำนำหน้า "sudo"ไปยังนามแฝงและคำสั่งที่เลือกจากภายใน~/.bashrcดังนี้:

#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;

ไม่ทำงาน - นั่นคือสิ่งที่ฉันเริ่มต้น คุณลองหรือยัง
Tanktalus

แนวคิดที่ดี ฉันคิดว่าalias sudo="sudo "ง่ายกว่า
trusktr

3

เมื่อโพสต์ไม่กี่ครั้งให้ทำใน '.bashrc':

alias sudo = 'sudo'

เหตุผลที่อธิบายใน 'man bash' และ 'help alias':

alias: alias [-p] [name [= value] ... ] กำหนดหรือแสดงนามแฝง

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

คุณต้องการสิ่งนี้:

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

ฉันอาจจะผิด แต่ ISTR ที่bash -i(i = interactive) นั้นเป็น v4.0 เท่านั้น ดังนั้นบนเซิร์ฟเวอร์รุ่นเก่าที่ยังคงbashทำงาน v3 อยู่สิ่งนี้น่าจะล้มเหลวมากที่สุด แต่พิสูจน์ว่าฉันผิดทุกคนไปข้างหน้า;)
syntaxerror

@syntaxerror - คุณจำผิด -iคือ Bourne shell โปรดดู: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
geocar

ว้าวไม่ได้คาดหวังว่าจะได้รับคำตอบเร็ว ๆ นี้สำหรับโพสต์เก่าอายุ 6 ปีขึ้นไป ... ทำไมใช่ฉันอาจสับสนด้วย#!/bin/bash -iหลังจาก shebang ซึ่งเห็นได้ชัดว่าไม่เหมือนกัน (?) ตัดเรื่องยาวสั้นใช้historyในbashสคริปต์ (และไม่ได้อยู่ใน "ชีวิต" บรรทัดคำสั่ง) จะต้องมี-iตัวเลือกซึ่งผมก็ไม่สามารถที่จะได้รับการทำงานบนเซิร์ฟเวอร์ที่มี "เท่านั้น" bashv3 ติดตั้ง และนั่นคือความจริง
ไวยากรณ์

1

ฉันไม่รู้ว่ามันเป็นสิ่งที่ฉลาดที่สุดที่ต้องทำในกล่องผลิต แต่ในท้องถิ่นฉันใช้

alias sudo="sudo -E"

ตัวเลือก-E ( รักษาสภาพแวดล้อม ) จะแทนที่ตัวเลือก env_reset ใน sudoers (5) มันจะใช้ได้เฉพาะเมื่อคำสั่งที่ตรงกันมีแท็ก SETENV หรือตัวเลือก setenv ตั้งอยู่ใน sudoers (5)


-1

คุณสามารถเพิ่มนามแฝงใน. bashrc ของรูทหรือเพียงแค่รัน. bashrc ผ่าน sudo ก่อนคำสั่งของคุณ?

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

1
อืมสิ่งนี้ก็ใช้งานไม่ได้ด้วยซ้ำ จริงๆแล้วมันค่อนข้างใกล้เคียงกับบางสิ่งที่ฉันได้ลองด้านบน แต่อยู่ไกลจากไวยากรณ์เชลล์ / sudo จริง
Tanktalus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.