โดยทั่วไปฉันต้องทำสิ่งนี้:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
มันใช้งานไม่ได้ ฉันจะส่งตัวแปร env $ DUMMY ไปยัง su ได้อย่างไร -p ไม่ทำงานกับ -l
โดยทั่วไปฉันต้องทำสิ่งนี้:
DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'
มันใช้งานไม่ได้ ฉันจะส่งตัวแปร env $ DUMMY ไปยัง su ได้อย่างไร -p ไม่ทำงานกับ -l
คำตอบ:
คุณสามารถทำได้โดยไม่ต้องเรียกล็อกอินเชลล์:
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
หรือ:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
-pตัวเลือกในการsuออกคำสั่งรักษาตัวแปรสภาพแวดล้อม
-pเป็นตัวเลือกsuไม่ใช่sudoในกรณีนี้
-mเก็บรักษาตัวแปรส่วนอื่น ๆ บอกว่า-cอะไรแตกต่าง และเป็นหนึ่งในความคิดเห็นในคำตอบนี้วัน-E stackoverflow.com/questions/10488758/...
เคล็ดลับมือโปร: ไม่ต้องมีจริงๆเหตุผลที่ดีที่วิ่ง sudo susudo -u username commandเมื่อต้องการเรียกใช้คำสั่งเป็นผู้ใช้ที่แตกต่างกันการใช้งาน หากคุณต้องการเปลือกรากเรียกใช้หรือsudo -i sudo -lหากคุณเปิดใช้งานบัญชีรูทคุณสามารถทำงานsuคนเดียวได้ แต่sudo suไม่มีประโยชน์ และใช่ฉันรู้ว่าคุณเห็นมันทุกที่
ที่กล่าวว่าsudoมี-Eสวิตช์ที่จะรักษาสภาพแวดล้อมของเซสชันของผู้ใช้:
-E, --preserve-env
Indicates to the security policy that the user wishes to preserve
their existing environment variables. The security policy may
return an error if the user does not have permission to
preserve the environment.
ดังนั้นคุณจะต้องส่งออกตัวแปรของคุณก่อนแล้วจึงเรียกใช้sudo -E:
$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy
bash -cไม่จำเป็นต้อง อย่างไรก็ตามหากฉันรันsudo -Eu bob echo "$DUMMY"ตัวแปรจะถูกขยายก่อนรูทเชลล์จะถูกเรียกใช้ดังนั้นจึงไม่แสดงให้เห็นว่าคำสั่งใช้งานได้จริง:
$ sudo -u bob echo $DUMMY ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY' ## works as expected
D:dummy
env_keep บางทีอาจจะเป็นเช่นนี้sudoers Defaults env_keep += "DUMMY"
sudoสวดของ นอกจากนี้ยังยุ่งยากกว่าสำหรับตัวแปรเดี่ยว สิ่งนี้มีประโยชน์สำหรับบางสิ่งที่ควรส่งออกเสมอ
LD_PRELOAD LESSCHARDEFฉันไม่คิดว่าความสะดวกสบายน่าจะเป็นข้อโต้แย้งที่ชนะได้ที่นี่ ...
- E ทำงานให้ฉัน จากมนุษย์sudo-
-E, ระบุถึงนโยบายความปลอดภัยที่ผู้ใช้ต้องการให้บริการตัวแปรสภาพแวดล้อมที่มีอยู่ นโยบายความปลอดภัยอาจส่งคืนข้อผิดพลาดหากผู้ใช้ไม่ได้รับอนุญาตให้รักษาสภาพแวดล้อม--preserve-env
สิ่งต่อไปนี้เป็นโซลูชันที่ไม่จำเป็นต้องมีเพื่อเปลี่ยนนโยบายความปลอดภัย
ผมจะไม่สนใจsuส่วนหนึ่งที่เราสามารถใช้ตัวเลือกในการ--usersudo
เราต้องการที่จะผ่านตัวแปรสภาพแวดล้อมไปวิ่งผ่านcommand sudoอย่างไรก็ตามsudoจะไม่อนุญาตให้ส่งตัวแปรสภาพแวดล้อมไปยังคำสั่ง (มีเหตุผลด้านความปลอดภัยที่ถูกต้องสำหรับเรื่องนี้ตัวแปรบางตัวอาจเป็นอันตรายได้) เชลล์สามารถใช้เพื่อตั้งค่าตัวแปรสภาพแวดล้อมและsudoสามารถเรียกใช้เชลล์ด้วยสคริปต์ที่ส่งผ่านไปยังมัน ดังนั้นsudoให้เรียกใช้สคริปต์ที่ตั้งค่าตัวแปรสภาพแวดล้อม
var_a=someThing
var_b=someOtherThing
sudo bash -c "
export var_a=\"${var_a}\"
export var_b=\"${var_b}\"
the_command some_args
"
sudo -iu ec2-user echo $DUMMYอะไร