วิธีที่จะทำให้ `sudo 'รักษา $ PATH ได้อย่างไร


123

ฉันต้องการเรียกใช้โปรแกรมที่ติดตั้งบน / opt / godi / sbin (ไดเรกทอรีที่กำหนดเอง) หากฉันเพิ่มไดเรกทอรีนั้นลงใน PATH ของฉันโดยเพิ่มบรรทัดต่อไปนี้ลงในไฟล์. bashrc ของฉัน

export PATH=$PATH:/opt/godi/bin:/opt/godi/sbin

จากนั้นฉันสามารถลองเรียกใช้คำสั่งได้ดี (ยกเว้นว่ามันล้มเหลวเพราะมันต้องการ sudo) อย่างไรก็ตามเมื่อฉันพยายามใช้ sudo:

sudo godi_console

ฉันได้รับข้อผิดพลาดดังต่อไปนี้

sudo: godi_console: command not found

การตรวจสอบตัวแปร PATH หลังจากใช้ sudo เผยให้เห็นว่ามันไม่รวม PATH เดียวกันกับที่ฉันเป็นผู้ใช้ปกติ:

$ sudo sh
# echo $PATH                 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

ทำไม PATH ถึงไม่เหมือนกัน? ฉันกำลังทำอะไรผิดหรือเปล่า? ฉันใช้ Debian Jessie และโชคไม่ดีที่ฉันไม่สามารถแก้ไขปัญหานี้ได้ด้วยการส่งผ่าน sudo ลิงก์สัมบูรณ์ไปยัง godi_console เนื่องจาก godi_console นั้นขึ้นอยู่กับเส้นทางที่ถูกตั้งค่าอย่างถูกต้อง


2
ลองsudo -E godi_consoleดู -Eหมายถึง "รักษาสิ่งแวดล้อม"
D_Bye

5
@D_Bye นั้นจะไม่ทำงานหากsecure_pathและ / หรือ env_reset มีการกำหนดค่าเช่นในกรณีที่มีsudoการปรับใช้จำนวนมากเช่นบน Debian
Stéphane Chazelas

@ StephanChazelas ขอบคุณสำหรับข้อมูล - ฉันไม่ได้ใช้ Debian ดังนั้นบางทีฉันควรจะเก็บเงียบ!
D_Bye


คำถามที่เกี่ยวข้องเกี่ยวกับการsuไม่ได้sudoเป็นunix.stackexchange.com/questions/460478
JdeBP

คำตอบ:


149

คุณสามารถทำได้:

sudo env "PATH=$PATH" godi_console

ในฐานะที่เป็นมาตรการรักษาความปลอดภัยใน Debian /etc/sudoersมีsecure_pathตัวเลือกที่กำหนดเป็นค่าที่ปลอดภัย

โปรดทราบว่า:

sudo "PATH=$PATH" godi_console

ไหนsudoถือว่าข้อโต้แย้งที่มีนำ=ตัวละครที่ได้รับมอบหมายเป็นตัวแปรสภาพแวดล้อมด้วยตัวเองก็จะทำงานที่ทำงานgodi_consoleกับคุณ $PATH (เมื่อเทียบกับที่secure_path) ในสภาพแวดล้อมของมัน แต่จะไม่ส่งผลกระทบต่อsudoของเส้นทางการค้นหาสำหรับปฏิบัติการเช่นนั้นจะไม่ช่วยในการหาว่าsudogodi_console


5
ฉันชอบคำตอบนี้ดีที่สุดเพราะหลีกเลี่ยงต้องเปลี่ยนการตั้งค่าทั่วโลก (เช่นรักษาหลักการของสิทธิพิเศษน้อยที่สุด)
Alois Mahdal

5
sudo "PATH=$PATH" godi_console ไม่ทำงานใน CentOs7 โดยวิธี ต้องการ env
Hakan Baba

1
@ StéphaneChazelas sudo "PATH=$PATH" godi_consoleเคยทำงานจริงๆเหรอ? sudoยอมรับVAR=valueข้อโต้แย้งที่มีผลต่อสภาพแวดล้อมของคำสั่งมันจะทำงาน แต่แตกต่างจากในenvหรือbash, sudoดูเหมือนจะไม่ปล่อยให้เรื่องนี้ส่งผลกระทบต่อวิธีการที่มันเงยหน้าขึ้นมองคำสั่ง ฉันเพิ่งทดสอบสิ่งนี้ (เมื่อเร็ว ๆ นี้) บน Ubuntu 16.04 แต่ฉันพยายามเพิ่มexempt_groupตัวเลือกให้sudoers(สำหรับการทดสอบ - ฉันไม่ได้คิดว่านี่เป็นวิธีแก้ปัญหา!) และผลลัพธ์ก็สว่างไสว คำสั่งของแบบฟอร์มPATH="$PATH" sudo some-commandเริ่มทำงาน แต่แบบฟอร์มเหล่านั้นsudo PATH="$PATH" some-command ยังไม่ทำงาน
Eliah Kagan

2
@ballsatballsdotballs เนื่องจากนามแฝงนั้นควรส่งผลกระทบต่อเชลล์แบบโต้ตอบของคุณเท่านั้นจึงน่าจะไม่เป็นอันตราย
Stéphane Chazelas

2
ฉันเพิ่งสร้างนามแฝงที่เรียกว่า psudo สำหรับกรณีประเภทนี้โดยที่: alias psudo = "sudo env \" PATH = $ PATH \ "" จากนั้นการใช้ sudo ปกติของฉันจะไม่ได้รับผลกระทบ
mikeTronix

46

คุณยังสามารถตั้งค่า PATH เริ่มต้นที่ /etc/sudoers

แก้ไขไฟล์โดยใช้ visudo

และอัปเดตบรรทัดเป็นสิ่งที่คุณต้องการ: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin


18

SUDO กำลังทำตัวแปร env รีเซ็ตตามค่าเริ่มต้น

ลองดูคู่มือและตัวเลือกที่เรียกว่า env_reset

คุณต้องปิดการใช้งานใน / etc / sudoers


5
เย็น! ในอูบุนตูคุณสามารถมองเห็นและแสดงความคิดเห็นในส่วนของ secure_path และ env_reset ทำให้ระบบมีความปลอดภัยน้อยลงมากดังนั้นระวัง
RawwrBag

การปิดใช้งานenv_resetดูเหมือนจะไม่ส่งผลกระทบต่อsudoพฤติกรรมของเส้นทาง w / r / t PATH
Zanna

5

งานนี้:

sudo $(which your_command)

ตัวอย่างการเรียกgpsสคริปต์ของฉันซึ่งแสดงรายการกระบวนการของ Nvidia GPU:

$ sudo gps
sudo: gps: command not found
$ sudo $(which gps)
  PID TTY          TIME CMD
 9922 tty7     02:42:47 Xorg

คำอธิบาย:

$ set -x;sudo $(which gps);set +x
++ which gps
+ sudo /home/xyztuv/myScripts/shl/gps
  PID TTY          TIME CMD
 9922 tty7     02:42:39 Xorg
+ set +x


1

สิ่งนี้ได้ผล:

sudo "PATH=$PATH" [your command]

อย่าเปลี่ยน $ PATH ด้วยค่าพา ธ ของคุณคุณแค่เขียนด้วยวิธีนี้

ตัวอย่าง: $ sudo env "PATH=$PATH" ant -f webAppConfig.xml regenWebAppConf....


0

อาจไม่ใช่สิ่งที่ OP ต้องการอย่างแน่นอน แต่สิ่งนี้อาจช่วยได้:

sudo -u the_user PATH=$PATH:/opt/godi/bin sh -c 'echo $PATH'

สิ่งนี้จะเปลี่ยน PATH ภายในคำสั่ง sudoed

แก้ไข: ฉันไม่แน่ใจว่าสิ่งที่ฉันหมายถึงนี้เพราะข้างต้นเป็นเรื่องไร้สาระมาก ใช้สิ่งต่อไปนี้แทน:

sudo -u the_user sh -c 'PATH=$PATH:/opt/godi/bin echo $PATH'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.