ใน. zshrc ของฉันฉันมีคำสั่งที่เปิดใช้อินสแตนซ์ของโปรแกรมต่าง ๆ เช่น Mozilla Firefox และ Evolution เห็นได้ชัดว่าฉันไม่ต้องการที่จะเปิดพวกเขาเป็นรากดังนั้นฉันต้องการตรวจสอบว่าฉันเป็นรากก่อนที่จะเปิดพวกเขา ฉันจะทำสิ่งนี้ได้อย่างไร
ใน. zshrc ของฉันฉันมีคำสั่งที่เปิดใช้อินสแตนซ์ของโปรแกรมต่าง ๆ เช่น Mozilla Firefox และ Evolution เห็นได้ชัดว่าฉันไม่ต้องการที่จะเปิดพวกเขาเป็นรากดังนั้นฉันต้องการตรวจสอบว่าฉันเป็นรากก่อนที่จะเปิดพวกเขา ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
คุณสามารถใช้คำสั่งแบบมีเงื่อนไขเช่น:
PRGCMD="firefox"
PRGUSR="user"
if [[ $UID == 0 || $EUID == 0 ]]; then
# root
echo Running programm as User $PRGUSR
sudo -u $PRGUSR ${(z)PRGCMD}
else
${(z)PRGCMD}
fi
มันจะตรวจสอบครั้งแรกถ้าID ผู้ใช้จริงหรือรหัสผู้ใช้ที่มีประสิทธิภาพเป็นที่เป็นzero
root
ถ้าเป็นเช่นนั้นจะใช้sudo
เพื่อเรียกใช้โปรแกรมที่กำหนดไว้ในตัวแปรPRGCMD
เป็นผู้ใช้ definded PRGUSR
ในตัวแปร (คุณสามารถละเว้นบรรทัดนี้หากคุณต้องการข้อความเตือนเท่านั้น)
${(z)PRGCMD}
แยกคำราวกับว่าบรรทัดคำสั่ง zshในกรณีที่PRGCMD
มีช่องว่างเช่นพารามิเตอร์ไปยังโปรแกรม
ตัวแปรสั้น ๆ ซึ่งรันโปรแกรมเฉพาะที่ไม่ใช่รูทคือ: [[ $UID != 0 || $EUID != 0 ]] && firefox
นอกจากนี้คุณอาจต้องการรวม%#
ไว้ในพรอมต์ของคุณเพื่อให้คุณสามารถเห็นว่าเชลล์ปัจจุบันของคุณมีสิทธิ์ จากman zshmisc
:
%# A `#' if the shell is running with privileges, a `%' if not. Equivalent to `%(!.#.%%)'. The definition of `privileged', for these
purposes, is that either the effective user ID is zero, or, if POSIX.1e capabilities are supported, that at least one capability is
raised in either the Effective or Inheritable capability vectors.
รหัสตัดสินถ้าเปลือกทำงานที่มีสิทธิ์ (ที่กำหนดไว้ในprivasserted()
ในutils.c
) สามารถ IMHO ไม่สามารถทำได้ในรหัสเปลือกดังนั้นหากคุณต้องการพฤติกรรมเดียวกันแน่นอนมันอาจจะดีที่สุดที่จะแยกเอาท์พุทของ%#
การขยายตัวพรอมต์:
[[ $(print -P "%#") == '#' ]] && echo shell privileged || echo shell not privileged
%#
ขยายที่รวดเร็ว
print -P "%#"
แก้ปัญหาของคุณหรือไม่ :)
หากโย่โปรดพิจารณาที่จะยอมรับคำตอบของฉัน
[[ ${(%):-%#} = \# ]] && echo root