ssh, khởi động một shell cụ thể và chạy lệnh trên máy từ xa?


11

Tôi đang ở trong tình huống một số người dùng đang chia sẻ cùng một tài khoản người dùng trên một máy từ xa. Tôi có một thư mục "cá nhân" nơi tôi đã viết .zshrctệp của riêng mình và tôi muốn có một cách để:

  1. Bắt đầu một phiên ssh trong máy từ xa với các lệnh từ tệp cấu hình ssh của tôi (ví dụ ControlMaster auto)
  2. Phiên này chạy shell Z
  3. Nó chạy một .zshrcthư mục "cá nhân" của tôi (không phải trên thư mục nhà của người dùng chung)

Thật tuyệt khi có một bí danh hoặc một cách đơn giản để bắt đầu các phiên ssh như vậy (đó là lý do tại sao tôi nghĩ về việc sử dụng tệp cấu hình của OpenSSH), nhưng tôi mở cho bất kỳ ý tưởng nào khác!

Sử dụng tập tin cấu hình của OpenSSH?

Tôi đọc trên trang man ssh_config của OpenSSH rằng tôi có thể sử dụng lệnh LocalCommandđể chỉ định một lệnh chạy cục bộ sau khi kết nối thành công với máy chủ. Điều này khiến tôi nghĩ rằng có thể có một cách để nói với configtập tin lệnh nào sẽ chạy từ xa sau khi kết nối với máy chủ, nhưng dường như không có cách nào.


Tôi không nghĩ bạn có thể. Nhưng tôi bối rối về lý do tại sao bạn muốn điều này. Đã có một lệnh trên dòng lệnh ssh. Tại sao bạn không thể chạy ssh mycommand? Và nếu bạn muốn chạy một số lệnh thiết lập trước mỗi lệnh xuất hiện ssh, tại sao không cấu hình phía máy chủ?
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn @Guilles. Tôi đang ở trong tình huống nhiều người dùng đang chia sẻ cùng một tài khoản từ xa, vì vậy tôi muốn nhanh chóng thiết lập một vài thứ khi tôi đăng nhập từ xa. Cụ thể hơn, tôi muốn khởi động Z shell và yêu cầu nó chạy một .zshrcthư mục cụ thể (tức là thư mục chính "cá nhân"). Tôi đã cố gắng ssh -t host_name 'zsh & source /path/to/my_zshrc'nhưng nó đã không làm việc (tôi FPATH variable not defined, và tôi nghĩ rằng đó là bởi vì zshkết thúc trước khi nó chạy my_zshrc, chứ chưa nói điều này không cho tôi một vỏ Z)
Amelio Vazquez-Reina

Tôi nghĩ rằng điều này xứng đáng với một bản cập nhật của OP, vì vậy tôi chỉ cập nhật nó.
Amelio Vazquez-Reina

Đã đi tìm một câu trả lời tương tự của tôi, tôi nhận ra rằng câu hỏi này khá gần với những gì bạn đang cố gắng làm.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


15

Cách rõ ràng nhất để chạy lệnh từ xa là chỉ định nó trên dòng lệnh ssh. Lệnh ssh luôn được giải thích bởi trình bao của người dùng từ xa.

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'

Các tài khoản được chia sẻ nói chung là một ý tưởng tồi; nếu có thể, hãy lấy tài khoản riêng cho mọi người dùng. Nếu bạn bị kẹt với tài khoản dùng chung, bạn có thể tạo bí danh:

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'

Nếu bạn sử dụng xác thực khóa chung (một lần nữa, được khuyến nghị), bạn có thể xác định các lệnh cho mỗi khóa ~/.ssh/authorized_keys. Xem câu trả lời này để giải thích thêm. Chỉnh sửa dòng cho khóa của bạn ~/.ssh/authorized_keystrên máy chủ (tất cả trên một dòng):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== bob@some.where

Tuyệt vời @Guilles. Đóng góp của bạn cho trang web này đang làm cho nó trở thành một nguồn tài nguyên vô cùng hữu ích cho tất cả chúng ta. Cảm ơn rất nhiều, thực sự. Nhân tiện, tôi không biết về execlệnh. Làm thế nào exec zshkhác với gọi zshtrực tiếp? Tại sao nó quan trọng trong trường hợp cụ thể này?
Amelio Vazquez-Reina

Hmm, khi tôi chạy ssh -t shared-account@example.com 'HOME=~/bob; exec zsh'tôi nhận được HOME=~/bob: command not found. Tôi nghĩ rằng tôi đang trên tcsh. Tôi nhận được cùng một vấn đề nếu tôi cố gắng HOME=/home/bob. Tôi đã thử trên bash và zsh. Bất kỳ manh mối những gì có thể gây ra điều này? Cuối cùng, cú pháp ở trên có để tôi mở phiên ssh không? (những gì tôi muốn). Cảm ơn một lần nữa.
Amelio Vazquez-Reina

1
@intrpc execthay thế vỏ ban đầu bằng zsh; không có zsh, vỏ ban đầu sẽ vẫn còn trong bộ nhớ cho đến khi zsh thoát và sau đó thoát. Sự khác biệt chính là tiết kiệm một chút bộ nhớ, nó không quan trọng lắm. Nếu vỏ đăng nhập của bạn là (t) csh, hãy sử dụng setenv HOME ~/bob; exec zsh. Cuối cùng, vì zsh được bắt đầu mà không có đối số, bạn sẽ có được một phiên shell, giống như bạn nhận được nếu bạn vừa chạy sshvà có zsh làm vỏ đăng nhập.
Gilles 'SO- ngừng trở nên xấu xa'

Cảm ơn một lần nữa vì sự giúp đỡ của bạn. Một câu hỏi tiếp theo ở đây. Bất kỳ cách nào để chạy nhiều lệnh hơn, sau exec zshlệnh?
Amelio Vazquez-Reina

1
@ AmelioVazquez-Reina Không thuận tiện trừ khi bạn có một số quyền kiểm soát đối với một trong các tệp chấm. Bạn có thể đặt biến môi trường ZDOTDIRđể làm cho zsh tìm kiếm các tệp chấm trong một thư mục khác. Nếu bạn có một số quyền kiểm soát các tệp chấm thì bạn có thể thực hiện một số thứ như thêm eval $LC_STARTUP_CODEvào $ZDOTDIR/.zshrcvà truyền mã để thực thi trong biến môi trường LC_STARTUP_CODE.
Gilles 'SO- ngừng trở thành ác quỷ'

-3

Để chạy lệnh từ xa sau khi kết nối máy chủ, hãy thêm tệp .ssh / config vào đoạn mã sau

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*

2
Cảm ơn @ user626129, nhưng như tôi đã đề cập trong câu hỏi ban đầu, lệnh LocalCommandnày là chạy một lệnh trên shell cục bộ , không phải trên shell từ xa .
Amelio Vazquez-Reina
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.