วิธีการส่งผ่านตัวแปรสภาพแวดล้อมเพื่อ sudo su


30

โดยทั่วไปฉันต้องทำสิ่งนี้:

DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'

มันใช้งานไม่ได้ ฉันจะส่งตัวแปร env $ DUMMY ไปยัง su ได้อย่างไร -p ไม่ทำงานกับ -l


เกี่ยวกับsudo -iu ec2-user echo $DUMMYอะไร
muru

1
เป็นไปได้ที่ซ้ำกันของวิธีการทำ `sudo 'รักษา $ PATH?
kenorb

คำตอบ:


39

คุณสามารถทำได้โดยไม่ต้องเรียกล็อกอินเชลล์:

sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'

หรือ:

sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'

-pตัวเลือกในการsuออกคำสั่งรักษาตัวแปรสภาพแวดล้อม


3
ฉันคิดว่า "-E" รักษาตัวแปรสภาพแวดล้อมsudo.ws/man/sudo.man.html
Andy

1
@ แอนดี้ แต่มักถูกห้ามโดยการกำหนดค่า sudo
Gilles 'หยุดความชั่วร้าย'

@cuonglm - ขอบคุณ วิธีนี้ใช้ได้ผล ไม่ควรเรียกชื่อล็อกอินเชลล์
Umang

1
@kenorb: ไม่-pเป็นตัวเลือกsuไม่ใช่sudoในกรณีนี้
cuonglm

มีเธรดอื่น ๆ ที่บอกว่า-mเก็บรักษาตัวแปรส่วนอื่น ๆ บอกว่า-cอะไรแตกต่าง และเป็นหนึ่งในความคิดเห็นในคำตอบนี้วัน-E stackoverflow.com/questions/10488758/...
Vishrant

49

เคล็ดลับมือโปร: ไม่ต้องมีจริงๆเหตุผลที่ดีที่วิ่ง 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

2
วิธีที่ดีกว่าที่จะรักษาตัวแปรสภาพแวดล้อมคือการเพิ่มเข้าไปในenv_keep บางทีอาจจะเป็นเช่นนี้sudoers Defaults env_keep += "DUMMY"
lcd047

@ lcd047 แต่ที่จะรักษาสภาพแวดล้อมสำหรับทุกsudoสวดของ นอกจากนี้ยังยุ่งยากกว่าสำหรับตัวแปรเดี่ยว สิ่งนี้มีประโยชน์สำหรับบางสิ่งที่ควรส่งออกเสมอ
terdon

ใช่มันเป็นการแลกเปลี่ยนที่ดี แต่ไม่ใช่ว่าทุกตัวแปรสภาพแวดล้อมจะเป็นอันตรายอย่างเท่าเทียมกัน มีความแตกต่างที่สำคัญระหว่างการดำเนินการมากกว่าเป็นและถือมากกว่าLD_PRELOAD LESSCHARDEFฉันไม่คิดว่าความสะดวกสบายน่าจะเป็นข้อโต้แย้งที่ชนะได้ที่นี่ ...
lcd047

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

7

- E ทำงานให้ฉัน จากมนุษย์sudo-

-E, ระบุถึงนโยบายความปลอดภัยที่ผู้ใช้ต้องการให้บริการตัวแปรสภาพแวดล้อมที่มีอยู่ นโยบายความปลอดภัยอาจส่งคืนข้อผิดพลาดหากผู้ใช้ไม่ได้รับอนุญาตให้รักษาสภาพแวดล้อม--preserve-env


น่าเสียดายที่มันจะทำงานได้ก็ต่อเมื่อผู้ดูแลระบบของคุณไม่ได้ จำกัด คุณไม่ให้ใช้ -E
TorstenS

0

สิ่งต่อไปนี้เป็นโซลูชันที่ไม่จำเป็นต้องมีเพื่อเปลี่ยนนโยบายความปลอดภัย

ผมจะไม่สนใจ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
"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.