ไม่พบคำสั่งเมื่อใช้ sudo


52

มีคำถามสองสามข้อเกี่ยวกับเว็บไซต์ที่ดูเหมือนว่าเกี่ยวข้องกับปัญหาของฉัน แต่ฉันไม่สามารถหาวิธีแก้ปัญหาได้

ระบบปฏิบัติการของฉันคือ Ubuntu 12.04 ฉันmvnติดตั้ง/tools/noarch/apache-maven-3.1.1แล้วและฉันได้เพิ่มบรรทัดต่อไปนี้ในตอนท้ายของฉัน/etc/profile:

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

source /etc/profileหลังจากนั้นฉันดำเนินการ

ตอนนี้ปัญหาของฉันคือเมื่อฉันเรียกใช้mvn --versionคำสั่งที่ประสบความสำเร็จและmvnปฏิบัติการพบว่าในขณะที่ถ้าผมดำเนินการ: ฉันจะได้รับการส่งออก:sudo mvn --version sudo: mvn: command not foundฉันรู้ว่าPATHอาจแตกต่างกันเมื่อฉันรันคำสั่งด้วยsudoและนั่นคือสาเหตุที่ฉันลองทำสิ่งนี้:

$>sudo echo $PATH
/tools/noarch/apache-maven-3.1.1/bin:... some other stuff ...

สิ่งที่ฉันพยายามอีกประการหนึ่งคือการดำเนินการแล้วพิมพ์sudo su - mvn --versionในกรณีนี้mvnจะพบว่าประสบความสำเร็จและคำสั่งประสบความสำเร็จ เกิดขึ้นที่นี่คืออะไร?


คำตอบ:


37

$PATH ประเมินโดยเชลล์ดังนั้นเช็คของคุณจึงไม่ทำงานอย่างที่คุณคาดไว้

/etc/sudoersมีการกำหนดค่าเพื่อแทนที่ของคุณPATHด้วยค่าเริ่มต้น

sudoไม่ได้โหลดสภาพแวดล้อมที่เปลือกเข้าสู่ระบบก่อนที่จะดำเนินคำสั่งเพื่อให้เริ่มต้นPATHจากการ/etc/sudoersถูกนำมาใช้ ไม่เปิดเปลือกเข้าสู่ระบบที่เกี่ยวข้องกับการโหลดsu - /etc/profileดูman bashส่วนภาวนา

เพียงแค่เอาการตั้งค่าในPATH มันเป็นกฎที่มีแนวโน้มที่เรียกว่า/etc/sudoerssecure_path


CentOS

ใน CentOS คุณสามารถเพิ่มPATHไปยังDefaults env_keepส่วน:

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY PATH"

ขอบคุณสำหรับคำตอบ มันแก้ปัญหาได้ แต่ฉันชอบคำแนะนำการแก้ปัญหาในอีกสองคำตอบเพราะมันทำการเปลี่ยนแปลงเฉพาะสำหรับ maven ไม่ใช่สำหรับคำสั่งทั้งหมดใน PATH ของฉัน
izomorphius

FYI: โปรดทราบการอัปเดตคำตอบของฉัน
kriegaex

วิธีการดำเนินการ sudo sudo: ./<some_binary>: command not foundไบนารีในไดเรกทอรีปัจจุบัน ฉันใช้ Arch Linux
Necktwi

47

ให้sudoปัจจุบันของคุณPATHด้วย:

sudo env "PATH=$PATH" your_command

คำตอบที่ยอดเยี่ยมซึ่งไม่ต้องการแก้ไขการตั้งค่าใด ๆ ให้ผู้โทรทำทุกอย่างที่จำเป็น ฉันจะใช้-Eตัวเลือกเพิ่มเติมเพื่อรักษาสภาพแวดล้อมที่เหลือ อันที่จริงมันมีประโยชน์มากที่สามารถใส่ไว้ในสคริปต์ / alias / function เพื่อใช้งานง่าย ฉันจะเพิ่มนี่เป็นคำตอบที่แยกต่างหาก - แต่ความรุ่งโรจน์ที่ @opyate!
Tom

เมื่อฉันพยายามเรียกใช้คำสั่งนี้ฉันจะได้รับenv: cmd: No such file or directory- ความคิดใด ๆ ที่เป็นเช่นนั้น
Andy

2
@Andy แทนที่ cmd ด้วยคำสั่งจริงของคุณ
opyate

วิธีการดำเนินการ sudo sudo: ./<some_binary>: command not foundไบนารีในไดเรกทอรีปัจจุบัน ฉันใช้ Arch Linux
Necktwi

12

อธิบายอย่างละเอียดเกี่ยวกับคำตอบของ @ opyate ฉันใช้เชลล์สคริปต์ต่อไปนี้ (ซึ่งอาจมีชื่อว่าmysudoเป็นต้น):

#!/bin/bash
sudo -E env "PATH=$PATH" "$@"
  • -Eบอกsudoให้รักษาสภาพแวดล้อม
  • env "PATH=$PATH"ถูกขยายออกไปนอกsudoสายทำให้ภายนอกPATHมีอยู่sudoด้วย (นี่คือสิ่งที่จำเป็นนอกเหนือจาก-Eที่PATHมักจะได้รับการดูแลเป็นพิเศษนอกเหนือจากการรักษาสภาพแวดล้อมทั้งหมดที่ได้รับ)
  • "$@"ผ่านการขัดแย้งสคริปต์ของเราได้รับไปยังsudoบรรทัด

บันทึกสคริปต์ในไฟล์ในไดเรกทอรีในPATH, ให้+xสิทธิ์, และvoilà


นี่เป็นวิธีที่ดีกว่าสำหรับผู้ที่ไม่ต้องการแก้ไขไฟล์ที่มีอยู่
qaisjp

4

เนื่องจากคำตอบปัจจุบันค่อนข้างคลุมเครือการตั้งค่าเฉพาะใน/etc/sudoersการเปลี่ยนเส้นทางของคุณคือsecure_path:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

คุณสามารถแก้ไขได้ด้วยsudo visudoหรือเพิ่มไดเรกทอรีที่คุณต้องการ:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin

2

ฉันมีปัญหาเดียวกันเมื่อครั้งแรกที่ผมติดตั้งMaven ปัญหาได้รับการแก้ไขหลังจากที่ฉันเพิ่มสองบรรทัด

export M2_HOME=/tools/noarch/apache-maven-3.1.1
export PATH=$M2_HOME/bin:$PATH

ถึงสี่ไฟล์:

/root/.bashrc
/root/.profile

และสำหรับผู้ใช้ปัจจุบัน ( mehranคือชื่อผู้ใช้ Ubuntu ของฉัน):

/home/mehran/.bashrc
/home/mehran/.profile

1

คุณต้องแก้ไขตัวแปร PATH ของรูทเหมือนกับที่คุณทำเองเช่นโดยเพิ่มสองบรรทัดเหล่านี้ในโปรไฟล์ของ sudo ซึ่งอยู่ใน /root/.bashrc จากนั้นจึงส่งมา


1
ฉันแก้ไข /root/.bashrc แล้ว แต่ไม่สามารถหาแหล่งได้: sudo source /root/.bashrcได้รับ: sudo: source: command not foundและหากไม่มีการsudoขออนุญาตฉันก็ปฏิเสธ (ตามที่คาดไว้) ฉันเชื่อว่าการเริ่มต้นเทอร์มินัลใหม่ในทางทฤษฎีควรทำเช่นเดียวกันกับแหล่งที่มา แต่หลังจากเริ่มต้นเทอร์มินัลใหม่sudo mvn --versionก็ยังไม่พบสิ่งใดเลย
izomorphius

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