ฉันจะเปลี่ยนไดเรกทอรีอัตโนมัติในการเข้าสู่ระบบ ssh ได้อย่างไร


87

ฉันพยายามที่sshจะเปลี่ยนไดเรกทอรีโดยอัตโนมัติเมื่อฉันเข้าสู่ระบบฉันพยายามที่จะได้รับพฤติกรรมที่ทำงานโดยใช้คำสั่งต่อไปนี้ใน~/.ssh/config:

Host example.net
LocalCommand "cd web"

แต่เมื่อใดก็ตามที่ฉันเข้าสู่ระบบฉันเห็นต่อไปนี้:

/bin/bash: cd web: No such file or directory

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

สิ่งที่ฉันหายไปที่นี่?

แก้ไข:

การรวมกันของคำพูด / เส้นทางที่แน่นอนให้ข้อความแสดงข้อผิดพลาดที่แตกต่างกัน:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

นี่ทำให้ฉันคิดว่าคำพูดไม่ควรอยู่ที่นั่นและมีข้อผิดพลาดเกิดขึ้นอีก


9
LocalCommand ทำงานบนระบบโลคัลของคุณไม่ใช่ระบบรีโมต
Steve Kehlet

ดูที่นี่superuser.com/a/124110/47962
Nakilon

คำตอบ:


25

cd เป็นเชลล์ในตัว LocalCommand ดำเนินการเป็น:

/bin/sh -c <localcommand>

สิ่งที่คุณต้องการทำไม่สามารถทำได้จริงผ่าน SSH คุณต้องแก้ไขเชลล์ในบางวิธีเช่นผ่าน bashrc / bash_profile

<การแก้ไขเกือบหนึ่งทศวรรษต่อมา ... >

LocalCommandไม่ใช่สิ่งที่คุณต้องการ ที่ทำงานบนเครื่องของคุณ RemoteCommandคุณต้องการ บางอย่างเช่นนี้ใช้ได้สำหรับฉัน:

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes

1
ใช่แค่อยากจะพูดถึงเดียวกัน คุณสามารถใส่cdคำสั่งใน~/.bashrcเซิร์ฟเวอร์ระยะไกลแทน
vdboor

มันน่ารำคาญ ดังที่ฉันพูดถึงในความคิดเห็นอื่นเซิร์ฟเวอร์มีชื่อโฮสต์จำนวนหนึ่งและฉันต้องการที่จะมีพฤติกรรมที่แตกต่างกันตามที่ใช้ ฉันเดาว่าเป็นไปไม่ได้ที่จะระบุว่าใช้แล้วจาก. bashrc?
Gareth

เป็นไปได้อาจจะไม่แนะนำให้เลือก สิ่งที่ต้องการแทนที่ ssh ด้วยเชลล์สคริปต์ขนาดเล็กหรือนามแฝงที่ส่งชื่อโฮสต์เป็นตัวแปรที่จะส่งออก (la "ssh -t user @ host 'ส่งออก connhostname = host; bash --login'") แต่คุณเริ่มเข้าสู่ดินแดนที่แปลกมากอย่างแน่นอน บางทีคำถามที่ดีกว่าคือทำไมคุณต้องการพฤติกรรมนี้
BMDan

มันไม่ใช่เรื่องใหญ่จริง ๆ ที่จะซื่อสัตย์ ฉันอยู่ในสถานการณ์ที่เวลาส่วนใหญ่ที่ฉันเข้าสู่เซิร์ฟเวอร์นี้ฉันตรงไปที่หนึ่งในสองไดเรกทอรี (ขึ้นอยู่กับโฮสต์ที่ฉันใช้)
Gareth

77

งานนี้:

ssh server -t "cd /my/remote/directory; bash --login"

วิธีสร้างไดเรกทอรีหากไม่มีอยู่:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

หากคุณไม่เพิ่มbashไปยังจุดสิ้นสุดของเส้นทางคุณจะต้องออกหลังจากที่cdcomand ทำงาน และถ้าคุณไม่เพิ่ม--loginก็~/.profileไม่ได้มาจากแหล่งของคุณ


สิ่งนี้ทำให้ฉันอยู่ในตำแหน่งที่ถูกต้องพร้อมกับ bash prompt ที่สมบูรณ์แบบ!
Peter Ehrlich

มันก็ใช้ได้กับฉันเช่นกัน แต่ถ้าฉันลองใช้กับ ssh jump-host มันก็ใช้ไม่ได้ ฉันได้รับข้อความปิดการเชื่อมต่อ
Riccardo

43
  1. ลงชื่อเข้าใช้กล่องของคุณ
  2. แก้ไข ~/.bash_profile
  3. ในตอนท้ายของไฟล์เพิ่ม cd /path/to/your/destination
  4. บันทึก & ออก
  5. ออกจากระบบจากกล่อง
  6. เข้าสู่ระบบอีกครั้งและคุณควรลงจอด /path/to/your/destination

3
ในเครื่องบางอย่างที่คุณอาจจำเป็นต้องผนวกcd /path/to/your/destinationไปแทนที่จะเป็น~/.bashrc ~/.bash_profileผลลัพธ์ควรเหมือนกัน
Matthias

มันใช้งานได้อย่างสมบูรณ์แบบขอบคุณ - มันถูก จำกัด เฉพาะ ID ผู้ใช้ของฉันหรือจะส่งผลต่อการเข้าสู่ระบบของผู้ใช้คนอื่นด้วยหรือไม่?
hard_working_ant

@BabyGroot หากคุณแก้ไขมิ~/.bash_profileฉะนั้น~/.bashrcจะมีผลกับผู้ใช้ปัจจุบันเท่านั้น
rubenvarela

5

โซลูชันที่มีประสิทธิภาพมากขึ้นสำหรับเคสเมื่อคุณต้องการ ssh และลบล้างไฟล์. bashrc ดีฟอลต์ สิ่งนี้มีประโยชน์ในกรณีที่สภาพแวดล้อมเซิร์ฟเวอร์ระยะไกลมีหลาย docroots และใช้งานโดยผู้ใช้หลายคน

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

รายละเอียดเพิ่มเติม:

  1. คำสั่งแรกสร้าง.bashrc_tmpไฟล์ใน/tmpไดเรกทอรีบนเซิร์ฟเวอร์ระยะไกลที่มีเนื้อหาcd /path/to/dir
  2. คำสั่งต่อไปดำเนินการbashกับไฟล์ config ระบุไว้ในขั้นตอนที่ 1 นี้จะช่วยให้สลับไป dir .bashrcต้องการและเริ่มต้นปราบ
  3. คำสั่งทั้งหมดนี้ถูกรวมไว้เป็นคำสั่งaliasดังนั้นบนพรอมต์คำสั่งไคลเอ็นต์ ssh ก็สามารถเรียกได้ว่าเป็นssh_myserver

ความคิดสร้างสรรค์ ... ตราบใดที่คุณเขียน perms ลงใน / tmp
smci

4

คุณเปิดใช้งานคำสั่งนี้ในการกำหนดค่า ssh ของคุณหรือไม่

PermitLocalCommand yes

ค่าเริ่มต้นสำหรับที่อยู่noในกรณีที่LocalCommandคำสั่งของคุณจะถูกละเว้น

คุณลองเพิ่มคำสั่งใน.bashrcไฟล์ของคุณหรือไม่?


มีการตั้งค่าคำสั่งใช่ (และฉันคิดว่าฉันจะไม่เห็นข้อความแสดงข้อผิดพลาดปรากฏขึ้นหากไม่ใช่) ปัญหาเกี่ยวกับการใช้. bashrc คือเซิร์ฟเวอร์มีชื่อโฮสต์ต่างกันและฉันต้องการชื่อโฮสต์ที่แตกต่างกันเพื่อแปลเป็นไดเรกทอรีเริ่มต้นที่แตกต่างกัน
Gareth

นอกจากชื่อโฮสต์แต่ละชื่อจะมีที่อยู่ IP ที่แตกต่างกันเซิร์ฟเวอร์จะไม่ทราบชื่อโฮสต์ที่คุณขอ ในขณะที่คำขอ HTTP ให้โฮสต์ที่เป็นมิตร: ส่วนหัวเพื่อระบุชื่อโฮสต์ที่ร้องขอการเชื่อมต่อ SSH ไม่
Fosco

4

ดังนั้นฉันจึงค้นหาเว็บไซต์จำนวนมาก (stackoverflow อันนี้) แต่ไม่พบสิ่งที่ฉันต้องการ ฉันลงเอยด้วยการสร้างเชลล์สคริปต์ของตัวเอง ฉันกำลังวางมันที่นี่ นอกจากนี้คุณสามารถคัดลอกไดเรกทอรีใน $ PATH

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

ดังนั้นหลังจากนี้ ฉันทำ:

connect <foldername>

หมายเหตุ: คุณอาจต้องออกจากระบบและเข้าสู่ระบบอีกครั้งหลังจากเปลี่ยนตัวแปรพา ธ


ฉันชอบสิ่งนี้กับคำแนะนำก่อนหน้านี้เนื่องจาก '$ SHELL' ใช้ได้เสมอในขณะที่ 'ทุบตี' อาจไม่เป็นเช่นนั้น นอกจากนี้การใช้ 'exec' ก็เป็นสิ่งที่ดีเช่นกัน
เดฟ

การปรับแต่งเพิ่มเติมจะทำให้มั่นใจได้ว่า 'cd' สำเร็จ - "cd ~ / $ 1 && exec ... '
เดฟ

3

ใน~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

ในตอนท้ายของคุณ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

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

เมื่อทดสอบสิ่งที่คุณพยายามทำฉันไม่ได้รับข้อผิดพลาดเมื่อฉันใช้เส้นทางสัมบูรณ์แบบไม่ระบุชื่อ ฉันเพิ่ม; pwdในตอนท้ายของคำสั่งและไดเรกทอรีที่ถูกต้องจะปรากฏ ~แต่ไดเรกทอรีที่ผมจบลงในคือ ไม่มีcdคำสั่งในไฟล์เริ่มต้นเชลล์ของฉัน ฉันพยายามวางแตกต่างกันcd somedir; pwdใน~/.ssh/rc(กับคนอื่น ๆ ยังคงอยู่ในสถานที่) configคำสั่งจะถูกดำเนินการก่อนที่จะ motd จะออกและrcคำสั่งที่ออกหลังจากนั้น แต่ก่อนที่จะเปลือกแฟ้มเริ่มต้นมีที่มา ดังนั้นอีกครั้งมันเกิดขึ้นในเปลือกที่แตกต่างกัน

ลองใช้เทคนิคการส่งต่อไฟล์และแจ้งให้เราทราบว่าเหมาะกับคุณหรือไม่


2

คุณเคยลองโดยไม่ต้องใส่เครื่องหมายคำพูดรอบ ๆ ? ตัวอย่างเดียวที่ฉันเห็นไม่มีให้พวกเขามันอาจพยายามรัน cd \ web เป็นคำสั่ง


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


1

ลองใช้RemoteCommandแทนเช่น

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $SHELL -il

RemoteCommand: ระบุคำสั่งเพื่อเรียกใช้งานบนเครื่องระยะไกลหลังจากเชื่อมต่อกับเซิร์ฟเวอร์สำเร็จ ( man ssh_config)

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