จะอนุญาตให้ผู้ใช้รักษาสภาพแวดล้อมด้วย sudo ได้อย่างไร?


17

ฉันพบข้อผิดพลาดต่อไปนี้พยายามอนุญาตให้ตัวแปรสภาพแวดล้อมบางอย่างผ่านไปยังสภาพแวดล้อมใหม่เมื่อทำงานsudo:

sudo: sorry, you are not allowed to preserve the environment

ข้อมูลบางอย่างที่อาจเป็นประโยชน์ในการแก้ไขข้อบกพร่อง:

[deploy@worker1 ~]$ sudo -l
    Matching Defaults entries for deploy on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
    XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, env_keep+="GIT_WORK_TREE GIT_DIR", !requiretty

User deploy may run the following commands on this host:
    (ALL) NOPASSWD: /usr/bin/git, (ALL) /etc/init.d/httpd*, (ALL) /sbin/service, (ALL) /usr/bin/make, (ALL) /bin/echo

ตัวอย่างการทำงานของฉัน:

[deploy@worker1 ~]$ export GIT_DIR="/home/ashinn/testing"
[deploy@worker1 ~]$ sudo -E sh -c 'echo "$GIT_DIR"'
sudo: sorry, you are not allowed to preserve the environment

ไฟล์ sudoers.d ของฉันสำหรับการกำหนดค่าเฉพาะนี้:

Defaults:deploy         env_keep += "GIT_WORK_TREE GIT_DIR", !requiretty
deploy  ALL=(ALL)       NOPASSWD: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

ฉันได้ลองเพิ่ม!env_resetในค่าเริ่มต้นแล้ว แต่ก็ยังล้มเหลวด้วยข้อผิดพลาดเดียวกัน ฉันรู้สึกว่าฉันอาจขาดอะไรบางอย่างที่เห็นได้ชัดและต้องการดวงตาที่สอง ฉันหายไปนี่อะไร


1
ฉันเชื่อว่าประมาณ 93% ของเราเข้าใจประเด็นคำถามของคุณ แต่คำสั่งตัวอย่างของคุณไม่ดีมาก  ถ้ามันไม่ล้มเหลวทันทีจะแสดงค่าล่วงหน้าเพราะเชลล์ขยายตัวแปรในบรรทัดคำสั่งก่อนที่จะถูกเรียกใช้ การทดสอบที่ดีกว่านั้นคือหรือหรือที่เรากำลังดูสภาพแวดล้อมของกระบวนการที่ทำงานพิเศษ sudo (option(s)) echo $GIT_DIRsudo$GIT_DIRsudosudo printenv GIT_DIRsudo env | grep GIT_DIRsudo sh -c 'echo "$GIT_DIR"'
G-Man กล่าวว่า 'Reinstate Monica'

ดูเพิ่มเติมคำถามนี้ในกองมากเกิน
Franklin Yu

คำตอบ:


27

คุณสามารถใช้SETENV"แท็ก" ในsudoersไฟล์ของคุณเช่นเดียวกับใน:

deploy  ALL=(ALL)       SETENV: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

หรือเพื่อรวมกับ NOPASSWD:

deploy  ALL=(ALL)       NOPASSWD:SETENV: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

ข้อความที่ตัดตอนมาที่เกี่ยวข้องจากชาย sudoers:

SETENV และ NOSETENV

แท็กเหล่านี้จะแทนที่ค่าของตัวเลือก setenv บนพื้นฐานต่อคำสั่ง โปรดทราบว่าหากตั้งค่า SETENV สำหรับคำสั่งผู้ใช้อาจปิดใช้งานตัวเลือก env_reset จากบรรทัดคำสั่งผ่านตัวเลือก -E นอกจากนี้ตัวแปรสภาพแวดล้อมที่ตั้งอยู่บนบรรทัดคำสั่งไม่อยู่ภายใต้ข้อ จำกัด ที่กำหนดโดยenv_check, หรือenv_delete env_keepดังนั้นผู้ใช้ที่เชื่อถือได้เท่านั้นจึงควรได้รับอนุญาตให้ตั้งค่าตัวแปรในลักษณะนี้ หากคำสั่งที่ตรงกันคือ ALL แท็ก SETENV จะบอกเป็นนัยสำหรับคำสั่งนั้น ค่าเริ่มต้นนี้อาจถูกแทนที่ด้วยการใช้แท็ก NOSETENV


1

อย่าระบุ-Eตัวเลือก ใช้-Eคุณกำลังบอกว่าตัวแปรสภาพแวดล้อมทั้งหมดสำหรับผู้ใช้deployควรได้รับการเก็บรักษาไว้ไม่เพียง แต่GIT_DIR

การทำงานsudo echo $GIT_DIRควรจะทำงานเพราะคุณได้เพิ่มGIT_DIRในenv_keepรายการ

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