Làm thế nào tôi có thể ssh trực tiếp đến một thư mục cụ thể?


248

Tôi thường phải đăng nhập vào một trong nhiều máy chủ và vào một trong nhiều thư mục trên các máy đó. Hiện tại tôi đang làm một cái gì đó thuộc loại này:

localhost ~] $ ssh somehost

Chào mừng đến với somehost!

somehost ~] $ cd / some / thư mục / ở đâu đó / có tên / Foo
một số Fhost] $ 

Tôi có các tập lệnh có thể xác định máy chủ nào và thư mục nào tôi cần vào nhưng tôi không thể tìm ra cách để làm điều này:

localhost ~] $ go_to_dir Foo

Chào mừng đến với somehost!

một số Fhost] $

Có một cách dễ dàng, thông minh hoặc bất kỳ cách nào để làm điều này?

Câu trả lời:


413

Bạn có thể làm như sau:

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

Bằng cách này, bạn sẽ nhận được một shell ngay trên thư mục_wocate.


Giải trình

-tBuộc phân bổ thiết bị đầu cuối. Điều này có thể được sử dụng để thực thi các chương trình dựa trên màn hình tùy ý trên một máy từ xa, có thể rất hữu ích, ví dụ như khi triển khai các dịch vụ menu.

Nhiều -ttùy chọn buộc phân bổ tty, ngay cả khi ssh không có tty cục bộ.

  • Nếu bạn không sử dụng -tthì sẽ không có dấu nhắc nào xuất hiện.
  • Nếu bạn không thêm ; bashthì kết nối sẽ bị đóng và trả lại quyền điều khiển cho máy cục bộ của bạn

21
trong trường hợp của tôi
Mathieu

2
Khi sử dụng phương pháp này, .bash_profile không được đọc, có ai biết tại sao không?
Filipe

8
Tôi đã phải làm điều này: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
guptron

40
Bạn thường muốn có một vỏ đăng nhập:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
christianbundy

10
Chỉ muốn liên kết thay đổi thư mục tự động khi đăng nhập ssh - Server Fault ; và từ đó dán lệnh này (là phiên bản của lệnh @christianbundy):ssh server -t "cd /my/remote/directory; bash --login"
sdaau

53

Bạn có thể thêm

cd /some/directory/somewhere/named/Foo

đến .bashrctập tin của bạn (hoặc .profilebất cứ điều gì bạn gọi nó) tại máy chủ khác. Bằng cách đó, bất kể bạn làm gì hoặc từ đâu sshđến, bất cứ khi nào bạn đăng nhập vào máy chủ đó, nó sẽ cdvào thư mục phù hợp với bạn và tất cả những gì bạn phải làm là sử dụng sshnhư bình thường.

Thật đáng nguyền rủa, giải pháp của rogeriopvl cũng hoạt động, nhưng nó hơi dài dòng hơn một chút và bạn phải nhớ làm điều đó mỗi lần (trừ khi bạn tạo bí danh) để nó có vẻ hơi "vui".


1
+1, điều này có vẻ phù hợp hơn nếu bạn cần thư mục liên tục thay vì thực hiện lệnh ssh nhớ lâu hơn mọi lúc bạn sẽ di chuyển thư mục nào khi kết nối với máy X
Tebe

Không phù hợp khi thay đổi linh hoạt
Lewis Chan

21

Tôi đã tạo một công cụ để SSH và CD vào một máy chủ liên tiếp - có tên là sshcd . Đối với ví dụ bạn đã đưa ra, bạn chỉ cần sử dụng:

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

Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi hoặc vấn đề!


1
Sẽ thật tuyệt nếu bạn có thể định nghĩa một cấu hình mới trong ~ / .ssh / config và đọc nó từ đó;)
Alexar

21

Cách tiếp cận ưa thích của tôi là sử dụng tệp cấu hình SSH (được mô tả bên dưới), nhưng có một vài giải pháp khả thi tùy thuộc vào cách sử dụng của bạn.

Đối số dòng lệnh

Tôi nghĩ rằng câu trả lời tốt nhất cho phương pháp này là câu trả lời của christianbundy cho câu trả lời được chấp nhận:

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

Sử dụng dấu ngoặc kép sẽ cho phép bạn sử dụng các biến từ máy cục bộ của mình, trừ khi chúng được thoát (như $SHELLở đây). Ngoài ra, bạn có thể sử dụng các trích dẫn đơn và tất cả các biến bạn sử dụng sẽ là các biến từ máy đích:

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

Hàm Bash

Bạn có thể đơn giản hóa lệnh bằng cách gói nó trong hàm bash. Giả sử bạn chỉ muốn gõ này:

sshcd example.com /foo/bar

Bạn có thể thực hiện công việc này bằng cách thêm nó vào ~/.bashrc:

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

Nếu bạn đang sử dụng một biến tồn tại trên máy từ xa cho thư mục, hãy chắc chắn thoát nó hoặc đặt nó trong dấu ngoặc đơn. Ví dụ, điều này sẽ cd vào thư mục được lưu trữ trong JBOSS_HOMEbiến trên máy từ xa:

sshcd example.com \$JBOSS_HOME

Tập tin cấu hình SSH

Nếu bạn muốn thấy hành vi này mọi lúc cho các máy chủ cụ thể (hoặc bất kỳ) nào bằng lệnh ssh bình thường mà không phải sử dụng các đối số dòng lệnh bổ sung, bạn có thể đặt RequestTTYRemoteCommandcác tùy chọn trong tệp cấu hình ssh của mình.

Ví dụ: tôi chỉ muốn gõ lệnh này:

ssh qaapps18

nhưng muốn nó luôn luôn hoạt động như lệnh này:

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

Vì vậy, tôi đã thêm nó vào ~/.ssh/configtập tin của mình :

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

Bây giờ quy tắc này áp dụng cho bất kỳ máy chủ lưu trữ nào có "ứng dụng" trong tên máy chủ của nó.

Để biết thêm thông tin, hãy xem http://man7.org/linux/man-pages/man5/ssh_config.5.html


13

Dựa trên các bổ sung cho câu trả lời của @ rogeriopvl, tôi đề nghị như sau:

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

Xâu chuỗi các lệnh bằng cách &&làm cho lệnh tiếp theo chỉ chạy khi lệnh trước thành công (trái ngược với sử dụng ;, thực thi các lệnh tuần tự). Điều này đặc biệt hữu ích khi cần cdđến một thư mục thực hiện lệnh.

Hãy tưởng tượng làm như sau:

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

Thư mục teminalkhông tồn tại, khiến bạn ở trong thư mục chính và xóa tất cả các tệp trong đó bằng lệnh sau.

Nếu bạn sử dụng &&:

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

Lệnh sẽ thất bại sau khi không tìm thấy thư mục.


1
Đã sử dụng dấu ngoặc đơn và không phải dấu ngoặc kép với lệnh không có && một lần và nó cắn vào mông tôi, thật tệ ... đã học được bài học của tôi.
Gavin Pickin

4

Trong trường hợp rất cụ thể của tôi, tôi chỉ muốn thực thi một lệnh trong một máy chủ từ xa, bên trong một thư mục cụ thể từ máy nô lệ Jenkins:

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

Nhưng máy của tôi không thể thực hiện ssh (nó không thể phân bổ giả cho tôi) và khiến tôi đưa ra lỗi sau:

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

Tôi có thể giải quyết vấn đề này bằng cách chuyển "cd sang dir + lệnh của tôi" làm tham số của lệnh ssh (để không phải cấp phát Pseudo-terminal) và bằng cách chuyển tùy chọn -T để nói rõ với lệnh ssh mà tôi đã làm Không cần phân bổ thiết bị đầu cuối giả.

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

3

Tôi sử dụng biến môi trường CDPATH


Chỉ hữu ích nếu tôi quan tâm đến một thư mục trên mỗi máy. Tôi cần một cách để truyền thông tin đến máy từ xa. Giải pháp của Rogers làm điều đó.
Frosty

2

tiến thêm một bước với -tý tưởng Tôi giữ một tập lệnh gọi đoạn bên dưới để đến các địa điểm cụ thể trong các máy chủ thường xuyên truy cập của tôi. Tôi giữ tất cả chúng trong ~/binvà giữ thư mục đó trong đường dẫn của tôi.

#!/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

Một cách khác để truy cập trực tiếp sau khi đăng nhập là tạo "Bí danh". Khi bạn đăng nhập vào hệ thống của mình, chỉ cần nhập bí danh đó và bạn sẽ ở trong thư mục đó.

Ví dụ: Bí danh = myfolder '/ var / www / Thư mục'

Sau khi bạn đăng nhập vào loại hệ thống của mình mà bí danh (cái này hoạt động từ bất kỳ phần nào của hệ thống)
, lệnh này nếu không có trong bashrc sẽ hoạt động cho phiên hiện tại. Vì vậy, bạn cũng có thể thêm bí danh này vào bashrc để sử dụng nó trong tương lai

$ myfolder => đưa bạn đến thư mục đó


-3

Bản thân SSH cung cấp một phương tiện liên lạc, nó không biết gì về các thư mục. Vì bạn có thể chỉ định lệnh từ xa nào sẽ thực thi (theo mặc định - đây là vỏ của bạn), tôi sẽ bắt đầu từ đó.


4
Đây là một câu trả lời một phần, không phải là một giải pháp.
AL

-7

chỉ cần sửa đổi nhà của bạn bằng lệnh: usermod -d /newhome username


1
Không được khuyên. Thay đổi thư mục nhà của bạn có thể sẽ khiến những thứ khác bị phá vỡ.
bronson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.