วิธีการตั้งค่า PATH เมื่อรันคำสั่ง ssh?


18

สมมติว่าผู้ใช้มีเปลือกใน/bin/bash /etc/passwdจากนั้นssh user@host commandรันคำสั่งโดยใช้ Bash แต่เปลือกที่ไม่เข้าสู่ระบบหรือโต้ตอบซึ่งหมายถึงค่า~/.bash_profileมิได้~/.bashrcมีที่มา ในกรณีนั้นจะตั้งค่าPATHตัวแปรสภาพแวดล้อมอย่างไรเพื่อให้สามารถค้นหาและเรียกใช้งานโปรแกรมได้? จะแนะนำให้นำหน้าคำสั่งจริงด้วยsource ~/.bashrcหรือไม่


5
.bashrcมีที่มา แต่ก็อาจมีการทดสอบการโต้ตอบที่ด้านบน ~/.pam_environmentสิ่งที่คุณใส่ก่อนการตรวจสอบที่ควรนำไปใช้และนั่นคือสิ่งที่ผมทำเพื่อให้มีผลบังคับใช้เส้นทางเมื่อเซิร์ฟเวอร์ไม่อนุญาตให้สภาพแวดล้อมของผู้ใช้หรือการใช้งาน
muru

คำตอบ:


18

คุณมีความเป็นไปได้น้อย:

  • ตั้งค่าPATHบนเซิร์ฟเวอร์ใน~/.ssh/environment(จำเป็นต้องเปิดใช้งานโดยPermitUserEnvironment yesในsshd_config)
  • ใช้เส้นทางแบบเต็มไปยังไบนารี
  • ดังที่คุณพูดถึงด้วยตนเองแหล่ง.bashrc: คำนำหน้าคำสั่งด้วย. ~/.bashrc(หรือsource)

มันสวยมากขึ้นอยู่กับกรณีการใช้งานในแบบที่คุณจะไป


6
การจัดหาด้วยตนเอง~/.bashrcไม่จำเป็นต้องเกิดขึ้นโดยค่าเริ่มต้น ความจริงมันดูเหมือนว่าฉันจะเป็นความคิดที่ไม่ดี
sorontar

$PATHไม่ขยายจากอย่างน้อยไม่ได้อยู่ใน~/.ssh/environment OpenSSH_7.9p1, OpenSSL 1.1.1b 26 Feb 2019
Jaakko

1
@Jaakko มันอาจปิดการใช้งานใน sshd_config โดยใช้PermitUserEnvironment(ค่าเริ่มต้นในรุ่นล่าสุด)
23919

ฉันคิดออกมันไม่ได้ขยายเพราะฉันเพิ่มบรรทัดPATH="$PATH:/new/path"ของฉัน~/.ssh/environmentเมื่อมันควรจะเป็นPATH=$PATH:/new/path
Jaakko

4

คุณกำลังเท่าท้องถิ่นการตั้งค่าระยะไกลการตั้งค่า

ภายในอินสแตนซ์ bash ซึ่งเป็นเชลล์ที่รันอยู่ซึ่งคุณเขียน:

ssh user@host command

จะดำเนินการคำสั่ง ssh (ไม่มีอะไรเพิ่มเติม) เป็นลูกค้า ssh
ในการทำเช่นนั้นโลคัลเชลล์ไม่จำเป็นต้องเริ่มเชลล์ย่อยหรือเชลล์ใหม่หรือล็อกอิน

คำสั่งถูกดำเนินการตามlsคำสั่งคือ: ในเครื่อง

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

รีโมตเชลล์ใหม่นั้นจำเป็นต้องเป็นเชลล์ล็อกอินในฐานะผู้ใช้รีโมต (ไปยังระบบ) นั้นจำเป็นต้องได้รับการพิสูจน์ตัวตนเพื่อล็อกอิน หรือหากมีคำสั่งเฉพาะให้เรียกใช้คำสั่งนั้นด้วยสิทธิ์ผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์

คุณสามารถดูว่าไฟล์ใดที่มีแหล่งที่มาโดยการเพิ่ม a $file sourcedไปยังจุดเริ่มต้นของแต่ละไฟล์ (ในระบบรีโมต ) (จำเป็นต้องรูทเพื่อเปลี่ยน/etc/ไฟล์):

$ a=(~/.bashrc ~/.profile /etc/bash.bashrc /etc/profile)
$ for f in "${a[@]}"; do sed -i '1 i\echo "'"$f"' was read"\n' "$f"; done

จากนั้นเริ่มคอนโซล ssh:

$ ssh sorontar@localhost
/etc/profile was read
/etc/bash.bashrc was read
/home/sorontar/.profile was read
/home/sorontar/.bashrc was read

ในกรณีนี้ทั้งสองbashrcไฟล์ถูกอ่านเพราะแต่ละprofileไฟล์มีคำสั่งที่จะรวมไม่ใช่เพราะเชลล์ล็อกอินนั้นมาจากแหล่งโดยตรง

$ ssh sorontar@localhost :
/etc/bash.bashrc was read
/home/sorontar/.bashrc was read

ในระบบนี้bashrcจะอ่านที่ไหนในทั้งสองกรณี

ไม่จำเป็นต้องเพิ่มsource ~/.bashrcคำสั่งเพื่อดำเนินการ

เปลี่ยนเส้นทาง

สิ่งที่คุณต้องทำคือรวมการตั้งค่าที่ถูกต้องเพื่อเปลี่ยน "$ PATH" ทั้ง/etc/bash.bashrcสำหรับผู้ใช้ทั้งหมดที่เริ่มเชลล์ในระบบนี้ หรือใน~/.bashrcสำหรับผู้ใช้แต่ละคนที่ต้องการมัน คุณสามารถเพิ่ม (หรือแก้ไข) โครงกระดูกของผู้ใช้.bashrcเพื่อ/etc/skel/ให้ผู้ใช้ใหม่ที่สร้างขึ้นมีไฟล์ที่ถูกต้อง

ด้านบนใช้สำหรับทุบตีเท่านั้น หากคุณต้องการการตั้งค่าให้ทำงานกับเชลล์ทั้งหมดอาจตั้งค่าตัวแปรสภาพแวดล้อม PATH โดยใช้ไฟล์ ssh ~/.ssh/environmentสำหรับผู้ใช้แต่ละคนที่ต้องการ หรือใช้/etc/ssh/sshrcสำหรับการตั้งค่าส่วนกลางในระบบที่เซิร์ฟเวอร์ ssh ทำงาน (โปรดอ่านส่วนไฟล์ในman sshdเพื่อดูรายละเอียดเพิ่มเติม)

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