Làm thế nào tôi có thể tự động thay đổi thư mục khi đăng nhập ssh?


87

Tôi đang cố gắng sshtự động thay đổi thư mục cụ thể khi đăng nhập. Tôi đã cố gắng để hành vi đó hoạt động bằng cách sử dụng các chỉ thị sau trong ~/.ssh/config:

Host example.net
LocalCommand "cd web"

nhưng bất cứ khi nào tôi đăng nhập, tôi thấy như sau:

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

mặc dù chắc chắn có một webthư mục trong thư mục nhà của tôi Ngay cả việc sử dụng một đường dẫn tuyệt đối cũng cho thông điệp tương tự. Để rõ ràng, nếu tôi gõ cd websau khi đăng nhập, tôi vào đúng thư mục.

Tôi đang thiếu gì ở đây?

BIÊN TẬP:

Các kết hợp khác nhau của dấu ngoặc kép / đường dẫn tuyệt đối đưa ra các thông báo lỗi khác nhau:

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

Điều này khiến tôi nghĩ rằng các trích dẫn không nên ở đó và có một lỗi khác xảy ra.


9
LocalCommand được chạy trên hệ thống cục bộ của bạn chứ không phải hệ thống từ xa.
Steve Kehlet

Câu trả lời:


25

cd là một vỏ dựng sẵn. LocalCommand được thực thi như:

/bin/sh -c <localcommand>

Những gì bạn đang tìm kiếm không thể thực sự được thực hiện thông qua SSH; bạn cần sửa đổi shell theo một cách nào đó, ví dụ thông qua bashrc / bash_profile.

<Chỉnh sửa gần một thập kỷ sau ...>

LocalCommandDù sao thì đó không phải là điều bạn muốn. Đó là chạy trên máy của bạn . Bạn muốn RemoteCommand. Một cái gì đó như thế này làm việc cho tôi:

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

1
Đúng, chỉ muốn đề cập đến cùng. Bạn có thể đặt cdlệnh ~/.bashrctại máy chủ từ xa thay thế.
vdboor

Điều đó thật khó chịu. Như tôi đã đề cập trong một bình luận khác, máy chủ có một số tên máy chủ lưu trữ và tôi muốn có hành vi khác nhau dựa trên đó được sử dụng. Tôi đoán không thể xác định được cái nào được sử dụng từ .bashrc?
Gareth

Điều đó là có thể, chỉ là không nên. Một cái gì đó như thay thế ssh bằng một tập lệnh shell nhỏ hoặc bí danh chuyển tên máy chủ thành một biến được xuất (a la "ssh -t user @ host 'export connhostname = host; bash --login'"). Nhưng bạn thực sự bắt đầu đi vào lãnh thổ rất kỳ lạ. Có lẽ một câu hỏi tốt hơn là, TẠI SAO bạn muốn hành vi này?
BMDan

Thành thật không phải là một vấn đề lớn. Tôi đang ở trong tình huống mà phần lớn thời gian tôi đăng nhập vào máy chủ này, tôi đi thẳng đến một trong hai thư mục (tùy thuộc vào máy chủ nào tôi đang sử dụng)
Gareth

77

Những công việc này:

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

Để tạo một thư mục nếu nó không tồn tại:

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

Nếu bạn không thêm bashvào cuối đường dẫn thì bạn thoát sau khi cdcomand chạy. Và nếu bạn không thêm --loginthì bạn ~/.profilekhông có nguồn gốc.


Điều này kết thúc tôi ở vị trí chính xác, với một dấu nhắc bash. hoàn hảo!
Peter Ehrlich

Điều này cũng hiệu quả với tôi nhưng nếu tôi cố gắng sử dụng nó với ssh jump-host thì nó không hoạt động. Tôi nhận được một tin nhắn đóng kết nối.
Riccardo

43
  1. Đăng nhập vào hộp của bạn
  2. Biên tập ~/.bash_profile
  3. Vào cuối tập tin thêm cd /path/to/your/destination
  4. Lưu nó và thoát
  5. Thoát khỏi hộp
  6. Đăng nhập lại và bạn nên hạ cánh trên /path/to/your/destination

3
Trên một số máy bạn có thể cần phải nối thêm cd /path/to/your/destinationđể ~/.bashrcthay vì để ~/.bash_profile. Kết quả phải giống nhau.
Matthias

Điều này hoạt động hoàn hảo nhờ - nó chỉ bị hạn chế đối với id người dùng của tôi hay nó sẽ ảnh hưởng đến thông tin đăng nhập của người dùng khác?
hard_work_ant

@BabyGroot nếu bạn sửa đổi ~/.bash_profilehoặc ~/.bashrcnó sẽ chỉ ảnh hưởng đến người dùng hiện tại.
rubenvarela

5

Giải pháp mạnh mẽ hơn cho trường hợp khi bạn cần ssh và ghi đè tệp .bashrc mặc định. Điều này hữu ích trong trường hợp khi môi trường máy chủ từ xa có nhiều tài liệu và được nhiều người dùng sử dụng.

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

Chi tiết hơn:

  1. Lệnh đầu tiên tạo .bashrc_tmptập tin trong /tmpthư mục trên máy chủ từ xa có nội dungcd /path/to/dir
  2. Lệnh tiếp theo thực thi bashvới tệp cấu hình được chỉ định trong bước 1. Điều này cho phép chuyển sang thư mục mong muốn và triệt tiêu mặc định .bashrc.
  3. Toàn bộ lệnh này được gói như một alias, vì vậy trên dấu nhắc lệnh của máy khách ssh, nó có thể được gọi làssh_myserver

Sáng tạo ... miễn là bạn đã viết perms vào / tmp
smci

4

Bạn đã kích hoạt lệnh này trong cấu hình ssh của bạn chưa?

PermitLocalCommand yes

Mặc định cho điều đó là no, trong trường hợp đó, lệnh của bạn LocalCommandsẽ bị bỏ qua.

Ngoài ra, bạn đã thử thêm lệnh vào .bashrctập tin của bạn ?


Lệnh đó được đặt, có (và tôi cho rằng tôi sẽ không thấy thông báo lỗi hiển thị nếu không có). Vấn đề với việc sử dụng .bashrc là máy chủ có các tên máy chủ khác nhau và tôi muốn các tên máy chủ khác nhau dịch sang các thư mục bắt đầu khác nhau
Gareth

Trừ khi mỗi tên máy chủ có một địa chỉ IP khác nhau, sẽ không có cách nào để máy chủ biết tên máy chủ mà bạn yêu cầu. Trong khi các yêu cầu HTTP cung cấp một tiêu đề Host: thân thiện để xác định tên máy chủ được yêu cầu, các kết nối SSH thì không.
Fosco

4

Vì vậy, tôi đã tìm kiếm rất nhiều trang web (stackoverflow, trang này) nhưng không tìm thấy những gì tôi muốn. Tôi đã kết thúc việc tạo kịch bản shell của riêng tôi. Tôi đang dán nó ở đây. Ngoài ra, bạn có thể sao chép nó một thư mục trong $ PATH.

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

Vì vậy, sau này. Tôi làm:

connect <foldername>

Lưu ý: Bạn có thể cần phải đăng xuất và đăng nhập lại sau khi thay đổi biến đường dẫn


Tôi thích đề xuất này hơn đề xuất trước vì '$ SHELL' luôn hợp lệ, trong khi 'bash' có thể không. Ngoài ra, việc sử dụng 'exec' là một liên lạc tốt đẹp.
Dave

Một sàng lọc tiếp theo sẽ đảm bảo 'cd' thành công - "cd ~ / $ 1 && exec ... '
Dave

3

Trong của bạn ~/.ssh/config:

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

Vào cuối của bạn ~/.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

Tôi đã thử làm điều này bằng cách sử dụng biến qua, bao gồm cả một biến được xuất, nhưng các lệnh này được chạy trong các shell khác nhau.

Khi kiểm tra những gì bạn đang cố gắng làm, tôi đã không gặp lỗi khi tôi sử dụng đường dẫn tuyệt đối không được trích dẫn. Tôi đã thêm ; pwdvào cuối lệnh và thư mục đúng được hiển thị, tuy nhiên thư mục tôi kết thúc là ~. Không có cdlệnh trong tập tin khởi động shell của tôi. Tôi đã thử đặt một cái khác cd somedir; pwdvào ~/.ssh/rc(với cái khác vẫn còn). Các configlệnh được thực thi trước khi motd được ban hành và các rclệnh được ban hành sau đó, nhưng trước khi vỏ file khởi động được nguồn gốc. Vì vậy, một lần nữa, nó xảy ra trong một vỏ khác.

Hãy thử kỹ thuật chuyển qua tập tin và cho tôi biết nếu nó hoạt động cho bạn.


2

Bạn đã thử nó mà không có dấu ngoặc kép xung quanh nó? Các ví dụ duy nhất tôi thấy không có chúng vì vậy với chúng, nó có thể đang cố thực thi cd \ web như một lệnh.


Ok, xóa dấu ngoặc kép có vẻ hữu ích nhưng tôi vẫn có lỗi (xem bài đã chỉnh sửa)
Gareth

1

Bạn cũng có thể thử điều này, với tùy chọn -t:

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

1

Hãy thử sử dụng RemoteCommandthay thế, ví dụ

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

RemoteCommand: Chỉ định lệnh để thực thi trên máy từ xa sau khi kết nối thành công với máy chủ. ( man ssh_config)

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.