ฉันจะตั้งค่า $ PATH ให้ "ssh user @ host command" ทำงานได้อย่างไร


129

ดูเหมือนจะไม่สามารถตั้งค่า $ PATH ใหม่ให้ใช้เมื่อเรียกใช้คำสั่งผ่านssh user@host commandไฟล์. ฉันได้ลองเพิ่มexport PATH=$PATH:$HOME/new_path~ / .bashrc และ ~ / .profile บนเครื่องระยะไกลแล้ว แต่การดำเนินการssh user@host "echo \$PATH"แสดงว่ายังไม่ได้รับการเปลี่ยนแปลง (แสดง / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / เกม) เครื่องระยะไกลกำลังเรียกใช้ Ubuntu 8.04

ฉันแน่ใจว่าสามารถแฮ็คเข้าสู่ / etc / profile ได้ แต่นั่นไม่ใช่วิธีแก้ปัญหาที่สะอาดและใช้ได้เฉพาะเมื่อมีการเข้าถึงรูทเท่านั้น


1
ฉันได้ลองเพิ่มexport PATH=$PATH:$HOME/new_pathทั้ง ~ / .bash_login และ ~ / .bash_profile (นอกเหนือจาก ~ / .bashrc และ ~ / .profile ที่พยายามก่อนหน้านี้) ไม่ทำงาน ในทั้งสองกรณีฉันต้องสร้างไฟล์
Denver Gingerich

ในกรณีการใช้งานของฉันการแก้ไขคำสั่งที่ส่งไปยัง ssh นั้นไม่ใช่เรื่องง่าย ฉันใช้ stfufs ( guru-group.fi/too/sw/stfufs ) ซึ่งสร้างคำสั่ง ssh เอง ฉันตระหนักดีว่าวิธีการของมันไม่ใช่วิธีแก้ปัญหาที่ดี แต่จะเป็นการดีที่จะแก้ไขโดยไม่ต้องแก้ไข stfufs
Denver Gingerich

คุณสามารถใส่ ssh wrapper ในแบบของ stfufs เรียก ssh จริงด้วย args ที่แก้ไขได้ถ้ามันง่ายกว่า
Hasturkun

คำตอบ:


180

ดังที่ Grawity กล่าวไว้ ~ / .bashrc คือสิ่งที่คุณต้องการเนื่องจากมีที่มาจากเชลล์ที่ไม่ใช่ล็อกอินแบบไม่โต้ตอบ

ฉันคาดว่าปัญหาที่คุณต้องทำกับไฟล์ Ubuntu ~ / .bashrc เริ่มต้น โดยปกติจะเริ่มต้นด้วยสิ่งนี้:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

คุณต้องการใส่อะไรก็ได้สำหรับเชลล์แบบไม่โต้ตอบก่อนบรรทัดนี้


1
ใช่ฉันย้ายexport PATH=$PATH:$HOME/new_pathเหนือบรรทัดนั้นและมันได้ผล ขอบคุณ!
Denver Gingerich

3
.bashrc ไม่น่าเชื่อถือ man bash: "Bash พยายามตรวจสอบว่ากำลังทำงานเมื่อใดด้วยอินพุตมาตรฐานที่เชื่อมต่อกับการเชื่อมต่อเครือข่าย" สิ่งนี้ใช้ได้กับ RHEL แต่ไม่ใช่บน Archlinux ฉันต้องแก้ไข / etc / environment เพื่อเปลี่ยน PATH เริ่มต้น
แอ่ง

คุณควรเพิ่มการกล่าวถึง.zshenvสำหรับผู้ใช้ zsh ฉันใช้เวลาพอสมควรในการค้นหาในความคิดเห็นของคำตอบอื่น ๆ
Mike

30

คุณมี~/.bash_loginหรือ~/.bash_profile ?

Bash ในโหมดโต้ตอบจะตรวจสอบไฟล์เหล่านี้และใช้ไฟล์แรกที่มีอยู่ตามลำดับนี้:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

ดังนั้นหากคุณมีการ~/.bash_profileเปลี่ยนแปลงใด ๆ ก็ตามที่คุณทำ~/.profileจะถูกปล่อยให้มองไม่เห็น

Bash ในโหมดไม่โต้ตอบบางครั้งจะอ่านไฟล์~/.bashrc(ซึ่งมักจะมาจากสคริปต์โต้ตอบด้วย) โดย "บางครั้ง" ฉันหมายความว่ามันขึ้นอยู่กับการกระจาย: ค่อนข้างแปลกมีตัวเลือกเวลาคอมไพล์สำหรับการเปิดใช้งานสิ่งนี้ . Debian เปิดใช้งานไฟล์~/.bashrcการอ่านในขณะที่เช่น Arch ไม่ทำ

ssh ดูเหมือนว่าจะใช้โหมดไม่โต้ตอบ ดังนั้น ~/.bashrcควรจะเพียงพอ เมื่อมีปัญหาเช่นนี้ฉันมักจะเพิ่มเสียงสะท้อนเล็กน้อยเพื่อดูว่าไฟล์ใดกำลังทำงานอยู่


การเพิ่มเสียงสะท้อนช่วย ... แต่ฉันยังคงไล่หาวิธีเรียกใช้งาน 'ssh -X remotemachine "xterm"' และมีเส้นทางระบบ / ผู้ใช้แบบเต็มจาก / etc / profile และ ~ / home / username / .bash_profile ถ้าฉันซอร์สไฟล์ทั้งสองในคำสั่งมันใช้งานได้ .. แต่มันน่าเกลียด :)
Jess

คุณรู้ได้อย่างไรว่า "ทุบตีในโหมดไม่โต้ตอบอ่านไฟล์~/.bashrc" ฉันไม่เห็นข้อความนี้ใน manpage ขอบคุณ
nknight

4
ถ้าคุณต้องการที่ไม่ใช่แบบโต้ตอบเปลือกที่ไม่ได้เข้าสู่ระบบไปยังแหล่งที่~/.bashrcดูเหมือนว่าคุณจะต้องตั้งนอกจากนี้ตัวแปรสภาพแวดล้อมBASH_ENV; ดูsuperuser.com/a/585699/100843 สำหรับเชลล์ล็อกอินแบบไม่โต้ตอบคุณอาจต้องแก้ไขหนึ่งในสามสคริปต์เริ่มต้นที่คุณกล่าวถึง
nknight

3
สำหรับ ZSH ไฟล์แบบไม่โต้ตอบคือ:.zshenv
คณิตศาสตร์

2
@math .zshenvมีที่มาเสมอ; ไม่สำคัญว่าจะมีการโต้ตอบหรือไม่
JoL

19

เอกสาร ssh กล่าวว่า:

หากระบุคำสั่งคำสั่งจะถูกดำเนินการบนโฮสต์ระยะไกลแทนที่จะเป็นล็อกอินเชลล์

ซึ่งเป็นสาเหตุที่การเพิ่มไฟล์ bashrc ไม่ทำงาน อย่างไรก็ตามคุณมีตัวเลือกดังต่อไปนี้:

  1. หากPermitUserEnvironmentตั้งค่าตัวเลือกในการกำหนดค่า sshd คุณสามารถเพิ่มการตั้งค่า PATH ของคุณไปที่~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'


1. ไม่ได้ตั้งค่าในการกำหนดค่า sshd ของฉันและman sshd_configบอกว่าปิดโดยค่าเริ่มต้นดังนั้นจึงไม่น่าเป็นไปได้ที่โซลูชันนี้จะใช้ได้กับคนส่วนใหญ่ 2. วิธีนี้ใช้ได้ แต่ฉันไม่สามารถแก้ไขคำสั่งที่ส่งไปยัง ssh ได้โดยง่าย (ดูความคิดเห็นที่สองในคำถามของฉัน)
Denver Gingerich

1
1. ไม่ทำงานตามที่คาดไว้เนื่องจากใน ~ / .ssh / environment คุณไม่สามารถเพิ่ม pathes ให้กับ PATH ได้เนื่องจาก $ PATH จะไม่ได้รับการแก้ไข
not2savvy

8

คุณสามารถพูดว่า:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH'

โซลูชันนี้ไม่จำเป็นต้องมีการเปลี่ยนแปลงใด ๆ ในเครื่องระยะไกลซึ่งเป็นสิ่งที่ดี
Ronny Andersson

2

นอกจากคำตอบ @signpolyma แล้วคุณจะต้องเพิ่มการส่งออกก่อนบรรทัดเหล่านี้

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

จริงๆแล้วฉันเพิ่งแสดงความคิดเห็นเกี่ยวกับบรรทัดเหล่านี้ทั้งหมด - พบได้ใน ~ / .bashrc ในเดสก์ท็อป Ubuntu 16.04 LTS ทุกอย่างไม่ทำงาน ตั้งค่า PermitUserEnvironment เป็นใช่ด้วย
Ernie S

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