sudo: source: ไม่พบคำสั่ง


54

ฉันได้อัปเดตโปรไฟล์เริ่มต้นบางส่วนสำหรับการทุบตีและจากบทเรียนที่ฉันติดตามฉันสามารถโหลดโปรไฟล์ใหม่ด้วยการตั้งค่าสภาพแวดล้อมใหม่โดยใช้:

source /etc/bash.bashrc

สิ่งเดียวคือ - ตัวแปรสภาพแวดล้อมใหม่พร้อมใช้งานสำหรับผู้ใช้ปัจจุบันของฉันเท่านั้น - และถูกละเว้นเมื่อฉันใช้ sudo พวกเขาพร้อมที่จะ sudo เมื่อฉันปิดเซสชันเทอร์มินัลของฉันและเข้าร่วมอีกครั้ง

เมื่อฉันพยายามใช้:

sudo source /etc/bash.bashrc

ฉันได้รับข้อผิดพลาด:

sudo: source: command not found

มีวิธีง่าย ๆ ในการโหลดการตั้งค่าโปรไฟล์ bash ใหม่สำหรับ sudo โดยไม่ต้องปิดเครื่องและรีสตาร์ทหรือไม่?

- เริ่มแรกฉันใช้สคริปต์ตัวติดตั้งซึ่งอ้างอิงตัวแปร ฉันพบว่าในขณะที่พวกเขาสามารถเข้าถึงตัวแปรเมื่อฉันเรียกใช้สคริปต์โดยตรง (แม้ว่าสิ่งนี้จะทำให้เกิดปัญหาในภายหลังด้วยการสร้างไดเรกทอรีตามที่ฉันต้องการเพื่อรูท) การเรียกใช้สคริปต์การติดตั้งโดยใช้ sudo จะไม่เกิดขึ้น

ฉันพิสูจน์โดยการทดสอบด้วยคำสั่งง่ายๆเหล่านี้:

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

อันแรกจะเอาท์พุทค่าของตัวแปร แต่อันที่สองจะไม่เอาท์พุทอะไรเลย


คุณลองใช้ตัวแปรจาก sudo อย่างไร โปรดทราบว่าถ้าคุณใช้ "sudo command $ variable" มันจะแทนที่ตัวแปรจากเชลล์ของคุณไม่ใช่จากสภาพแวดล้อมของ sudo
João Pinto

คำตอบ:


72

ปัญหาคือว่าsourceเป็นคำสั่งในตัว bash (ไม่ใช่โปรแกรมเหมือนlsหรือgrep) ฉันคิดว่าวิธีหนึ่งคือการเข้าสู่ระบบเป็น root แล้วรันคำสั่งแหล่งที่มา

sudo -s
source /etc/bash.bashrc

3
คุณพูดถูกแล้วว่าปัญหาคือsourceเปลือกหอยอยู่ในตัว sudo suเป็นวิธีแปลก ๆ ที่จะพูด - ดีกว่าที่จะบอกว่าsudo -sเป็นวิธีของ sudo ว่า "เริ่มเชลล์เป็นผู้ใช้นี้" เวอร์ชันหนึ่งบรรทัดของคุณจะไม่ทำงานเนื่องจากคำสั่งแต่ละคำสั่งในนั้นรันโดยเชลล์ผู้ใช้หลักในกระบวนการย่อยแยกต่างหาก
poolie

1
ขวา. บวกทุบตีอ่าน / etc / bashrc ในเวลาเข้าสู่ระบบ ดังนั้นคุณอาจใช้ 'su' ด้วยสวิตช์ -, -l หรือ --login เพื่อให้ได้สภาพแวดล้อมของผู้ใช้นั้น: 'sudo su -' เป็น root หรือ 'su - $ username' เพื่อเป็นผู้ใช้รายอื่น

ตัวอย่าง "หนึ่งบรรทัด" จะไม่ทำงานเพราะsuเริ่มเชลล์ใหม่และ "source" จะทำงานหลังจากสิ้นสุดเท่านั้น ตัวอย่างแรกใช้งานได้ก็ต่อเมื่อบรรทัดที่สองใช้ภายในรูทเชลล์
loevborg

sudo -ssudo suไม่ดีกว่า มันจะไม่มีผลกระทบใด ๆ
loevborg

1
sudo -sมีผลคล้ายกันในการเริ่มต้นเชลล์ แต่สำหรับฉันดูเหมือนว่าไม่เหมาะสมที่จะสแต็กสองคำสั่ง "กลายเป็นผู้ใช้อื่น" เมื่อหนึ่งจะทำ
poolie

14

ปัญหาไม่ได้sourceเป็นคำสั่ง shell builtin ความจริงที่ว่ามันเป็นสิ่งที่ทำให้คุณเกิดcommand not foundข้อผิดพลาดจริง ๆแต่ก็ไม่ได้หมายความว่ามันจะทำงานได้ถ้าเป็นเช่นนั้น

ปัญหาที่แท้จริงคือการทำงานของตัวแปรสภาพแวดล้อม และพวกเขาทำงานเช่นนี้ทุกครั้งที่มีการเริ่มกระบวนการใหม่หากไม่มีสิ่งใดเกิดขึ้นกระบวนการนี้จะสืบทอดสภาพแวดล้อมของพาเรนต์ เนื่องจากสิ่งนี้การใช้ subshell (เช่นการพิมพ์bashภายในอินสแตนซ์ bash) และการดูผลลัพธ์ของenvควรให้ผลลัพธ์ที่คล้ายกันมากกว่าพาเรนต์

อย่างไรก็ตามเนื่องจากวิธีการsudoทำงาน (ตามที่ระบุไว้ใน manpage ของมัน) sudo พยายามที่จะตัดสภาพแวดล้อมของผู้ใช้และสร้างสภาพแวดล้อม "เริ่มต้น" สำหรับผู้ใช้ supplanting ดังนั้นการเรียกใช้คำสั่งจะดำเนินการราวกับว่าผู้ใช้ที่เรียกใช้มัน รับผู้ใช้โทร (ซึ่งเป็นพฤติกรรมที่คาดหวัง) และทำให้การทำงานเป็นหอยโข่งsudo nautilusควรเปิดโฟลเดอร์ที่โฟลเดอร์และไม่/root/home/yourusername

ดังนั้น:

ทำสิ่งที่ต้องการsudo source script.shแล้วsudo commandถึงแม้ว่ามันจะทำงานก็จะไม่ประสบความสำเร็จในการตั้งค่าตัวแปรใด ๆ sudo commandในภายหลัง

เพื่อที่จะผ่านตัวแปรสภาพแวดล้อมที่คุณสามารถบอก sudo เพื่อรักษาสิ่งแวดล้อม (ผ่าน-Eสวิทช์และมีสิทธิ์ที่เหมาะสมใน sudoers ไฟล์ของคุณ) และ / sudo VAR1=VALUE1 VAR2=VALUE2 commandหรือการตั้งค่าสำหรับคำสั่งเป็น


4

การใช้การทดแทนกระบวนการทุบตีคุณสามารถทำได้:

source <(sudo cat /etc/bash.bashrc)

1
สิ่งนี้จะช่วยในการเริ่มต้นรูทเชลล์ด้วยการตั้งค่าใหม่ซึ่ง OP ต้องการทำอะไร?
muru

1
OP ได้ถามถึงวิธีการ "... โหลดโปรไฟล์ใหม่ ... " จากเชลล์ซึ่งจำเป็นต้องใช้sudoเพื่อเข้าถึงโปรไฟล์ ข้างต้นเป็นวิธีการนำเข้าโปรไฟล์ในขณะที่หลีกเลี่ยงsudo: source: command not foundปัญหาที่กล่าวถึง
TomDotTom

"สิ่งเดียวคือ - ตัวแปรสภาพแวดล้อมใหม่พร้อมใช้งานสำหรับผู้ใช้ปัจจุบันของฉันเท่านั้น - และถูกเพิกเฉยเมื่อฉันใช้ sudo"
muru

3

ดังที่Marcos กล่าวว่าปัญหาหลักของคุณที่นี่คือsourceคำสั่ง shell builtin ที่มีผลต่อกระบวนการเชลล์ที่ทำงานอยู่เท่านั้น

ทางออกที่ง่ายคือการเริ่มเชลล์ใหม่เป็นรูทและ bash จะอ่านโดยอัตโนมัติ/etc/bash.bashrcเมื่อเริ่มทำงาน นั่นง่ายเหมือนแค่พูด

sudo bash

2

การปิดและเปิดเครื่องใหม่ไม่ควรเปลี่ยนแปลงสิ่งต่าง ๆ โดยค่าเริ่มต้น sudo แถบสภาพแวดล้อม หากต้องการปิดใช้งานให้เพิ่ม -E ไปยัง sudo


2

ข้อผิดพลาดเกิดขึ้นเนื่องจากไบนารีที่คุณพยายามโทรจากบรรทัดคำสั่งเป็นเพียงส่วนหนึ่งของตัวแปร PATH ของผู้ใช้ปัจจุบัน แต่ไม่ใช่ส่วนหนึ่งของ PATH ของผู้ใช้รูท

คุณสามารถตรวจสอบสิ่งนี้ได้โดยค้นหาเส้นทางของไบนารี่ที่คุณพยายามเข้าถึง ในกรณีของฉันฉันพยายามโทร "bettercap-ng" ดังนั้นฉันวิ่ง

$ which bettercap-ng
/home/user/work/bin/bettercap`

ฉันตรวจสอบว่าตำแหน่งนี้เป็นส่วนหนึ่งของ PATH ของผู้ใช้รูทของฉันหรือไม่

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

ดังนั้น sudo หาเลขฐานสองที่ฉันพยายามโทรจาก commandline ไม่ได้ ดังนั้นจะส่งคืนคำสั่ง error ที่ไม่พบ

คุณสามารถสั่ง sudo เพื่อใช้ PATH ของผู้ใช้ปัจจุบันเมื่อเรียกเลขฐานสองดังต่อไปนี้

sudo -E env "PATH=$PATH" [command] [arguments]

ในความเป็นจริงเราสามารถสร้างนามแฝงได้จาก:

alias mysudo='sudo -E env "PATH=$PATH"'

นอกจากนี้ยังเป็นไปได้ที่จะตั้งชื่อนามแฝงว่า sudo แทน sudo ดั้งเดิม

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