โดยทั่วไปฉันต้องทำสิ่งนี้:
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 su
sudo -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
ส่วนหนึ่งที่เราสามารถใช้ตัวเลือกในการ--user
sudo
เราต้องการที่จะผ่านตัวแปรสภาพแวดล้อมไปวิ่งผ่าน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
อะไร