Lệnh thích ứng ssh multi-hop 'với tập tin cấu hình ssh


10

Tôi đang cố gắng đưa lệnh ssh multi-hop của mình vào tập tin ssh .ssh / config.

Đây là biểu đồ kết nối của tôi: máy tính xách tay (tôi ở đây) ------> userver -------> máy trạm

Tôi đã đặt các khóa rsa công khai ssh vào 'userver' và 'workstation'. Tại thời điểm này tôi có thể kết nối bằng cách gõ dòng này:

ssh -A -t userserver@userver ssh -A userworkstation@workstation

Tuy nhiên, tôi muốn có thể sử dụng các khả năng của tệp cấu hình trong ~ / .ssh / config để đạt được hiệu quả tương tự nhưng sử dụng một lệnh đơn giản, cũng cho phép tôi sao chép nhanh với 'scp'. Vấn đề duy nhất là 'userver' không có lệnh "nc" và tôi không có siêu người dùng ở đó, chỉ kiểm soát thư mục nhà của tôi. Tuy nhiên, tôi đã thử một số thứ:

Tôi đã có tệp cấu hình này trong máy tính xách tay của mình (~ / .ssh / config):

# laptop config file
Host userver
Hostname userver_hostname
port 22
User server_user

Ngoài ra một tệp cấu hình khác trong userver (~ / .ssh / config)

# userver config file
Host workstation
Hostname workstation_hostname
port 22
user workstation_username

Với tập tin cấu hình này, tôi có thể kết nối như

ssh -A -t userver ssh -A workstation

đó là một cải tiến, nhưng không đủ Tôi đã thử thêm một máy chủ khác trong cấu hình máy tính xách tay của mình, như thế này:

Host hop
ProxyCommand ssh -A -t userver ssh -A workstation

Sau đó, khi tôi làm

ssh hop

tôi nhận được kết quả đầu ra sau có lỗi và không thể kết nối:

Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.
-bash: line 1: $'SSH-2.0-OpenSSH_6.4\r': command not found

Có ý kiến ​​gì không?

Câu trả lời:


6

Lệnh bạn đang cần là ProxyCommand.

Bạn nên đặt vào tập tin .ssh / config những dòng này:

  Host userver
  HostName userver.example.com
  .........    

  Host workstation 
  ProxyCommand ssh -q userver nc -q0 workstation 22

Bây giờ bạn có thể kết nối với máy trạm pc bằng phương tiện

  ssh worksation

Nếu điều này không rõ ràng hoặc bạn muốn biết thêm chi tiết, tôi khuyên bạn nên đọc phần giới thiệu tuyệt vời này về ssh multi-hopping.

Biên tập:

bạn luôn có thể xác định bí danh: trong tệp /home/your_name/.bashrc của bạn, thêm dòng này:

  alias ssh_workstation='ssh -A -t userver ssh -A -X workstation' 

(Tôi đã chèn -Xtùy chọn để bạn có thể chạy các ứng dụng đồ họa trên máy chủ từ xa, hãy xem chúng cục bộ; nếu bạn không muốn điều này, chỉ cần bỏ tùy chọn -X).


Xin chào MariusMatutiae, tôi đã thử giải pháp của bạn nhưng như tôi đã nói trong bài viết gốc, nút 'userver' thiếu chương trình netcat (nc). Vì vậy, tôi nhận được lỗi này: ssh workstation bash: nc: lệnh không tìm thấy ssh_exchange_identification: Kết nối được đóng bởi máy chủ từ xa
labotsirc

Bạn không thể cài đặt nó?
MariusMatutiae

Thật không may, tôi không có siêu người dùng trên 'userver', đó là lý do tại sao tôi đã thử một phương pháp thay thế. Tôi không hiểu nó, nếu điều này hoạt động "ssh -A -t userver ssh -A workstation", tại sao cùng đặt trên ProxyCommand thì không?
labotsirc

1
@labotsirc Tôi đã sửa đổi một chút câu trả lời của tôi. Hy vọng bạn có thể tìm thấy nó hữu ích. Ngoài ra, bạn có thể thử cài đặt netcat cục bộ (nghĩa là chỉ dành cho bạn!), Thêm vào dòng Proxycommand .... đường dẫn đầy đủ đến bản sao netcat của riêng bạn. Tôi không chắc chắn điều này hoạt động, vì quyền, nhưng bạn có thể thử nó.
MariusMatutiae

Sao chép nhị phân netcat của tôi, loại bỏ tùy chọn -q0 vì nó đang báo lỗi và bây giờ nó hoạt động! Cảm ơn
labotsirc 13/12/13

10

Tôi tìm thấy giải pháp sau đây để hoạt động tốt hơn nhiều so với sử dụng netcat ( nc) như trong ví dụ khác. Với netcat, kết nối của tôi rất chậm và sẽ liên tục bị treo cho đến khi tôi nhấn một số phím. Ngoài ra, bạn không cần phải cài đặt netcat.

Thêm phần sau vào ~/.ssh/config:

Host *
  ServerAliveCountMax 4
  ServerAliveInterval 15

Host workstation
  Hostname workstation
  User userworkstation
  ProxyCommand ssh userserver@userver -W %h:%p

Sau đó, bạn có thể ssh như thế này:

ssh workstation

Cũng lưu ý rằng lý do bạn ProxyCommandkhông làm việc là vì bạn không nhận được những gì ProxyCommand. ProxyCommandphải tạo một đường ống sshcó thể tạo kết nối SSL. Nói cách khác, lệnh phải bắt đầu một quá trình khi stdinstdout kết nối sshvới một sshdcổng. Trong cấu hình của bạn, bạn đang làm cho một kết nối ssh với ProxyCommandnối sshvào vỏ lệnh chứ không phải là một sshdcổng.

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.