ฉันจะ ssh ไปยังไดเรกทอรีเฉพาะได้อย่างไร


248

ฉันมักจะต้องลงชื่อเข้าใช้หนึ่งในเซิร์ฟเวอร์หลายเครื่องและไปที่หนึ่งในหลาย ๆ ไดเรกทอรีในเครื่องเหล่านั้น ขณะนี้ฉันทำอะไรบางอย่างแบบนี้:

localhost ~] $ ssh บางโฮสต์

ยินดีต้อนรับสู่ somehost!

somehost ~] $ cd / some / directory / บางแห่ง / ตั้งชื่อ / Foo
somehost Foo] $ 

ฉันมีสคริปต์ที่สามารถกำหนดโฮสต์และไดเรกทอรีที่ฉันต้องเข้าไป แต่ฉันไม่สามารถหาวิธีทำสิ่งนี้:

localhost ~] $ go_to_dir Foo

ยินดีต้อนรับสู่ somehost!

somehost Foo] $

มีวิธีที่ง่ายฉลาดหรือมีวิธีการใด ๆ

คำตอบ:


413

คุณสามารถทำสิ่งต่อไปนี้:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"

ด้วยวิธีนี้คุณจะได้รับเปลือกขวาใน directory_wanted


คำอธิบาย

-tบังคับการจัดสรรเทอร์มินัลเทียม สิ่งนี้สามารถใช้เพื่อรันโปรแกรมบนหน้าจอโดยพลการบนเครื่องระยะไกลซึ่งมีประโยชน์มากเช่นเมื่อใช้งานบริการเมนู

-tตัวเลือกหลายตัวบังคับให้มีการจัดสรร tty แม้ว่า ssh จะไม่มี tty ในเครื่อง

  • หากคุณไม่ได้ใช้งาน-tจะไม่มีข้อความแจ้งปรากฏขึ้น
  • หากคุณไม่ได้เพิ่ม; bashการเชื่อมต่อจะถูกปิดและกลับไปควบคุมเครื่องท้องถิ่นของคุณ

21
ในกรณีของฉัน
Mathieu

2
เมื่อใช้วิธีการนี้จะไม่อ่าน. bash_profile ทุกคนรู้ว่าทำไม
Filipe

8
ฉันต้องทำเช่นนี้: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
guptron

40
โดยปกติคุณจะต้องการเชลล์ล็อกอิน:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy

10
เพิ่งต้องการลิงก์เปลี่ยนไดเรกทอรีโดยอัตโนมัติในการเข้าสู่ระบบ ssh - เซิร์ฟเวอร์ผิดพลาด ; และจากนั้นให้วางคำสั่งนี้ (ซึ่งเป็นรุ่นหนึ่งของ @christianbundy):ssh server -t "cd /my/remote/directory; bash --login"
sdaau

53

คุณสามารถเพิ่ม

cd /some/directory/somewhere/named/Foo

ไปยัง.bashrcไฟล์ของคุณ(หรือ.profileสิ่งที่คุณเรียกว่า) ที่โฮสต์อื่น ๆ ด้วยวิธีนี้ไม่ว่าคุณจะทำอะไรหรือsshจากที่ไหนเมื่อใดก็ตามที่คุณเข้าสู่เซิร์ฟเวอร์นั้นจะcdไปยังไดเรกทอรีที่เหมาะสมสำหรับคุณและสิ่งที่คุณต้องทำก็คือใช้งานsshเหมือนปกติ

การแก้ปัญหาคำสาปของ rogeriopvl ก็ใช้ได้เช่นกัน แต่มันค่อนข้างละเอียดมากและคุณต้องจำไว้เสมอว่าต้องทำทุกครั้ง


1
+1 นี่ดูเหมาะสมกว่าถ้าคุณต้องการไดเรกทอรีคงที่แทนที่จะทำให้คำสั่ง ssh จดจำได้นานขึ้นทุกครั้งที่ไดเรกทอรีที่คุณจะย้ายเมื่อคุณเชื่อมต่อกับเครื่อง X
Tebe

ไม่เหมาะสมเมื่อเปลี่ยนความยืดหยุ่น
Lewis Chan

21

ฉันได้สร้างเครื่องมือในการ SSH และ CD ลงในเซิร์ฟเวอร์ต่อเนื่อง - ชื่อ aptly sshcd สำหรับตัวอย่างที่คุณให้คุณใช้เพียง:

sshcd somehost:/some/directory/somewhere/named/Foo

แจ้งให้เราทราบหากคุณมีคำถามหรือปัญหาใด ๆ !


1
จะเย็นถ้าคุณสามารถกำหนดตั้งค่าใหม่ใน ~ / .ssh / config และอ่านได้จากที่นั่น)
Alexar

21

วิธีการที่ฉันชอบคือการใช้ไฟล์กำหนดค่า SSH (อธิบายไว้ด้านล่าง) แต่มีวิธีแก้ไขที่เป็นไปได้สองสามข้อขึ้นอยู่กับการใช้งานของคุณ

อาร์กิวเมนต์บรรทัดคำสั่ง

ฉันคิดว่าคำตอบที่ดีที่สุดสำหรับวิธีนี้คือคำตอบที่ตอบรับได้ของ christianbund:

ssh -t example.com "cd /foo/bar; exec \$SHELL -l"

การใช้เครื่องหมายคำพูดคู่จะช่วยให้คุณสามารถใช้ตัวแปรจากเครื่องท้องถิ่นของคุณเว้นแต่ว่าพวกเขาจะหลบหนี (เหมือน$SHELLที่นี่) อีกทางหนึ่งคุณสามารถใช้เครื่องหมายคำพูดเดี่ยวและตัวแปรทั้งหมดที่คุณใช้จะเป็นเครื่องหมายคำพูดจากเครื่องเป้าหมาย:

ssh -t example.com 'cd /foo/bar; exec $SHELL -l'

ฟังก์ชั่นทุบตี

คุณสามารถทำให้คำสั่งง่ายขึ้นด้วยการล้อมในฟังก์ชัน bash สมมติว่าคุณต้องการพิมพ์สิ่งนี้:

sshcd example.com /foo/bar

คุณสามารถใช้งานได้โดยเพิ่มสิ่งนี้ใน~/.bashrc:

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }

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

sshcd example.com \$JBOSS_HOME

ไฟล์กำหนดค่า SSH

หากคุณต้องการที่จะเห็นพฤติกรรมนี้ตลอดเวลาสำหรับโฮสต์ที่เฉพาะเจาะจง (หรือใด ๆ ) ด้วยคำสั่ง ssh ปกติโดยไม่ต้องใช้อาร์กิวเมนต์บรรทัดคำสั่งพิเศษคุณสามารถตั้งค่าRequestTTYและRemoteCommandตัวเลือกในไฟล์ ssh config ของคุณ

ตัวอย่างเช่นฉันต้องการพิมพ์เฉพาะคำสั่งนี้:

ssh qaapps18

แต่ต้องการให้มันทำตัวเหมือนคำสั่งนี้เสมอ:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'

ดังนั้นฉันจึงเพิ่มลงใน~/.ssh/configไฟล์ของฉัน:

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL

ตอนนี้กฎนี้ใช้กับโฮสต์ใด ๆ ที่มี "แอพ" ในชื่อโฮสต์

สำหรับข้อมูลเพิ่มเติมดูที่http://man7.org/linux/man-pages/man5/ssh_config.5.html


13

จากการเพิ่มเติมไปยังคำตอบของ @ rogeriopvl ฉันขอแนะนำสิ่งต่อไปนี้:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

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

ลองนึกภาพทำต่อไปนี้:

/home/me$ cd /usr/share/teminal; rm -R *

ไดเรกทอรี teminalไม่มีซึ่งทำให้คุณอยู่ในโฮมไดเรกทอรีและลบไฟล์ทั้งหมดที่อยู่ในนั้นด้วยคำสั่งต่อไปนี้

ถ้าคุณใช้&&:

/home/me$ cd /usr/share/teminal && rm -R *

คำสั่งจะล้มเหลวหลังจากไม่พบไดเรกทอรี


1
ใช้เครื่องหมายคำพูดเดี่ยวและไม่ใช่เครื่องหมายคำพูดคู่โดยใช้คำสั่งที่ไม่มี && เพียงครั้งเดียวและทำให้ฉันอยู่ในก้นใช่มั้ย ... เรียนรู้บทเรียนของฉัน
Gavin Pickin

4

ในกรณีที่เฉพาะเจาะจงของฉันฉันแค่ต้องการรันคำสั่งในโฮสต์ระยะไกลภายในไดเรกทอรีเฉพาะจากเครื่องทาส Jenkins:

ssh myuser@mydomain
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

แต่เครื่องของฉันไม่สามารถดำเนินการ ssh (มันไม่สามารถจัดสรรหลอกฉันคิดว่า) และทำให้ฉันให้ข้อผิดพลาดต่อไปนี้:

Pseudo-terminal will not be allocated because stdin is not a terminal

ฉันสามารถแก้ไขปัญหานี้ผ่าน "cd to dir + my command" เป็นพารามิเตอร์ของคำสั่ง ssh (ไม่ต้องจัดสรร Pseudo-terminal) และโดยผ่านตัวเลือก -T เพื่อบอกคำสั่ง ssh อย่างชัดเจนว่าฉันไม่ได้ทำ ไม่จำเป็นต้องจัดสรรเทอร์มินัลเทียม

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"

3

ฉันใช้ตัวแปรสภาพแวดล้อม CDPATH


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

2

ไปอีกขั้นหนึ่งด้วย-tความคิด ฉันเก็บสคริปต์หนึ่งชุดไว้ด้านล่างเพื่อไปยังสถานที่เฉพาะในโฮสต์ที่ฉันเข้าชมเป็นประจำ ฉันเก็บทุกอย่างไว้ในนั้น~/binและเก็บไดเรกทอรีนั้นไว้ในเส้นทางของฉัน

#!/bin/bash

# does ssh session switching to particular directory
# $1, hostname from config file 
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c

ssh -t $1 "cd $2; exec \$SHELL --login"

1

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

ตัวอย่าง: Alias ​​= myfolder '/ var / www / Folder'

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

$ myfolder => นำคุณไปยังโฟลเดอร์นั้น


-3

SSH เองนั้นเป็นสื่อกลางในการติดต่อสื่อสาร แต่ไม่รู้อะไรเกี่ยวกับไดเรกทอรี เนื่องจากคุณสามารถระบุคำสั่งระยะไกลที่จะดำเนินการ (นี่คือ - โดยค่าเริ่มต้น - เปลือกของคุณ) ฉันจะเริ่มต้นที่นั่น


4
นี่เป็นคำตอบบางส่วนไม่ใช่คำตอบ
อัล

-7

เพียงปรับเปลี่ยนบ้านของคุณด้วยคำสั่ง: usermod -d /newhome username


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