ทำไม sudo ไม่สนใจชื่อแทน


22

ฉันใช้ Ubuntu 10.04 และฉันใช้upstartสำหรับการจัดการภูต แอปพลิเคชันองค์กรของฉันทำงานเป็น daemon และต้องทำงานเป็น root เนื่องจากสิทธิ์ต่างๆ เช่น:

sudo start my-application-long-ID
sudo stop my-application-long-ID
etc

ฉันอยากจะแนะนำการaliasย่อคำสั่งเหล่านี้เป็นสิ่งที่ต้องการ:

alias startapp='sudo start my-application-long-ID'

และเรียกใช้เป็นstartappและใช้งานได้ แต่ฉันไม่ต้องการมี sudo ในนามแฝง

alias startapp='start my-application-long-ID'

เมื่อไม่ได้ทำงานโดยใช้กลับsudo startappsudo: startapp: command not found

อย่างไรก็ตามเมื่อฉันเพิ่มนามแฝง:

alias sudo='sudo '

sudo startapp ตอนนี้ใช้ได้ แต่ฉันยังสงสัยว่าทำไม sudo ไม่สนใจชื่อแทน


วิ่งของคุณsource ~/.bashrcหรือไม่ อัปเดตไฟล์. bashrc และทำให้นามแฝงใหม่พร้อมใช้งานหรือไม่
มนู

@ manu ใช่ฉันทำแล้ว
สัตว์สะเทินน้ำสะเทินบก

คำตอบ:


35

ผมเห็นด้านล่างนี้ข้อมูลจากที่นี่

เมื่อใช้ sudo ให้ใช้ alias ส่วนขยาย (มิฉะนั้น sudo จะข้ามนามแฝงของคุณ)

alias sudo='sudo '

เหตุผลที่ว่าทำไมมันไม่ทำงานจะมีการอธิบายที่นี่

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


6

นามแฝงและฟังก์ชั่นที่กำหนดไว้ในเปลือก Sudo เป็นโปรแกรมภายนอก ดังนั้น sudo จึงไม่เห็นนามแฝงฟังก์ชันหรือเชลล์บิลด์อินคำสั่งจากภายนอกเท่านั้น

นามแฝงมีความหมายว่าเป็นชื่อคำสั่งทางเลือกดังนั้นเชลล์จะขยายเฉพาะในตำแหน่งคำสั่งเท่านั้นไม่ใช่เมื่อพวกเขาขัดแย้งกับคำสั่ง Zsh รองรับนามแฝงระดับโลกซึ่งขยายได้ทุกที่ในบรรทัดคำสั่งและใช้งานได้ดีที่สุดเนื่องจากมีความเสี่ยงที่จะขยายไปโดยไม่ตั้งใจแม้ในบริบทที่นามแฝงไม่สมเหตุสมผล

คุณสามารถบอก sudo sudo sh -c '…shell command here…'เพื่อเรียกเปลือก: นามแฝงปกติของคุณจะไม่สามารถใช้ได้ภายในคำสั่งเชลล์นั้นอย่างไรก็ตามเนื่องจากปกติแล้วพวกเขาจะถูกเก็บไว้ในไฟล์เช่น~/.bashrcหรือ~/.zshrcที่ถูกอ่านโดยเชลล์แบบโต้ตอบเท่านั้น

alias sudo='sudo 'ตามที่เสนอโดย Rameshsudoทำให้เปลือกเพื่อขยายนามแฝงหลัง


1
ใช้alias sudo='sudo 'งานได้กับ ZSH ด้วยหรือไม่
CMCDragonkai


1

วิธีแก้ปัญหาสำหรับผู้ใช้ zsh

ใน bash และ zsh การสิ้นสุดนามแฝงด้วยช่องว่างจะทำให้เชลล์เปลี่ยนชื่อแทนคำถัดไป สิ่งนี้ทำให้นามแฝงขยายดังต่อไปนี้myalias

alias 'sudo=sudo '
sudo myalias

น่าเสียดายที่สิ่งนี้แตกต่างกันเมื่อคุณมีมากกว่าหนึ่งคำในนามแฝงของคุณ (เช่นsudo -u someoneอย่างไรก็ตามคุณสามารถใช้คุณลักษณะ "นามแฝงส่วนกลาง" ของ zsh เพื่อขยายนามแฝงด้วยตนเองได้ทุกที่ในคำสั่ง

alias -g '$= '

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

% alias myalias=echo
% sudo -u someone myalias foo
sudo: myalias: command not found
% sudo -u someone $ myalias foo
foo

คุณสามารถใช้$หลาย ๆ ครั้งในหนึ่งบรรทัดคำสั่งหากคุณมีการซ้อนคำสั่งที่ซับซ้อน ฉันพบว่ามีประโยชน์มากพอที่จะมีตำแหน่งถาวรใน zshrc ของฉันอย่างไรก็ตามนามแฝงนั้นง่ายพอที่จะให้คำจำกัดความเมื่อคุณต้องการใช้


0

ฉันเพิ่งให้คำตอบทางเลือกที่นี่โดยไม่ต้องนิยามใหม่sudoด้วยนามแฝง

ในกรณีของคุณมันจะเป็น:

type -a startapp | grep -o -P "(?<=\`).*(?=')" | xargs sudo 

ทั้งหมดในหนึ่งบรรทัดไม่มีกระสุนพิเศษไม่มีนามแฝงนิยามใหม่ ;-)


โอ้เดี๋ยวก่อน - ฉันเข้าใจแล้ว - คุณกำลังใช้xargsเพื่อตัดคำพูดและ grep เพื่อนำ=หน้า ค่อนข้างฉลาด แต่อาจไม่จำเป็น eval "sudo $(alias aliasname | cut -d= -f2-)"น่าจะดีกว่า - xargsจะไม่สามารถจัดการคำพูดได้อย่างถูกต้องและอาจมีมากกว่าหนึ่งคำ=ในนั้น
mikeserv

@mikeserv ฉันขอโทษคุณไม่ได้รับมัน ;-) xargsไม่ได้ตัดคำพูด มันเป็น grep ที่ใช้คำสั่งที่ถูกแก้ไขจากระหว่างเครื่องหมายคำพูด คุณจะรู้ว่าผลตอบแทนบางอย่างเช่นtype -a alias_name alias_name is aliased to command_within_quotesโดยวิธีที่ฉันได้ลองใช้คำสั่งของคุณและไม่ทำงานบน ubuntu ของฉัน: มันเป็นการกลับมาที่type -aแตกต่างกันระหว่างเวอร์ชั่นของ linux หรือไม่ (ฉันสงสัยมัน)
loves.by.Jesus

ฉันรู้สิ่งที่typeไม่ - bashใน คุณเข้าใจไหมว่าคำพูดนั้นเพิ่มขึ้นเป็นสองเท่าใช่มั้ย คุณลองใช้ด้วยชื่อแทนที่มีคำพูดคำเดียวหรือไม่? อย่างไรก็ตามคุณต้องเกี่ยวกับสิ่งที่ฉันไม่ได้ทำงาน - คุณต้องการอย่างใดอย่างหนึ่งหรือeval "sudo sh -c "$(... eval "'sudo $(alias alias_name| cut -d\' -f2-)"สิ่งนั้นคือaliases ถูกจัดแจงไว้ล่วงหน้าโดยทั่วไปevals - aliasยูทิลิตี้นั้นจะส่งออกเนื้อหาของพวกเขาเพื่อที่จะสามารถนำกลับไปใช้กับเชลล์ได้อย่างปลอดภัย ฉันเดาว่าคุณxargsใช้งานแล้วเพื่อทำให้ช่องว่างแบนขึ้น? แค่ระวังให้ดีใช่ไหม
mikeserv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.