Tự động tạo các mục nhập Máy chủ SSH trong ~ / .ssh / config


9

Tôi phải quản lý cả đống máy chủ lưu trữ trên ssh. Tuy nhiên tôi chỉ có thể truy cập chúng thông qua một máy chủ ssh gateway nhất định.

Tôi có những điều sau đây ~/.ssh/config:

Host mygateway-www
Hostname www
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

Tuy nhiên tôi phải kết nối với rất nhiều máy này. Thay vì đặt hàng tá mục trong tôi ~/.ssh/config, dù sao tôi cũng có thể có một cái gì đó như thế này:

Host mygateway-*
Hostname ???WHAT GOES HERE????
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

Tôi biết bạn có thể sử dụng %htrong Hostnameđối số, nhưng đó sẽ là tên máy chủ. Những gì tôi thực sự cần là một số loại thay thế chuỗi, như bash's ${VAR%thingie}. Điều này có thể không?

Câu trả lời:


24

Điều này có thể được thực hiện với tệp cấu hình SSH sau:

Host *
  ServerAliveInterval 120

Host gateway.somewhere.com
  User jdoe

Host gateway+*
  User jdoe
  ProxyCommand ssh -T -a $(echo %h |cut -d+ -f1).somewhere.com nc $(echo %h |cut -d+ -f2) %p 2>/dev/null
  ControlMaster auto
  ControlPath ~/.ssh/ssh-control_%r@%h:%p

Sau đó, bạn truy cập máy chủ nội bộ của mình như vậy:

ssh gateway+internalhost01.somewhere.com
ssh gateway+internalhost02.somewhere.com

Tên bạn chọn cho một nửa bên phải sẽ được phân giải bởi máy chủ nhảy.

Tham số người dùng được chỉ định trong trường hợp bạn cần ánh xạ thủ công tới những người dùng khác nhau trên các lớp máy chủ khác nhau. ControlMaster và ControlPath được chỉ định để cho phép sử dụng lại kết nối SSH.


6

Bạn không cần chỉ định thủ công HostName vì nó sẽ đến từ dòng lệnh.

Đơn giản chỉ cần thử:

Host *.domain  
  IdentityFile ~/.ssh/id_rsa  
  ProxyCommand ssh mygateway /usr/bin/nc %h 22

Vấn đề với cách tiếp cận đó là Tên máy chủ khá chung chung (ví dụ db1, www, mail2), trong khi tôi muốn chúng được thêm tiền tố vào dự án, vì tôi có thể cần phải chuyển sang một máy khác gọi là 'db2'. Do đó tiền tố trong Máy chủ
Rory

2
Vì vậy, bạn thực sự muốn cấu hình lại DNS của bạn. Giải pháp đơn giản nhất (nhưng cồng kềnh nhất) là sửa đổi tệp máy chủ của bạn. Mặt khác, bạn luôn có thể thêm máy chủ DNS cục bộ vào máy trạm của mình với tên miền .invalid và sử dụng tên máy chủ bạn muốn.
Martin M.

+1 trước. Tạo một tên miền phụ cho mỗi dự án. DNS ở đó để làm cho cuộc sống của bạn dễ dàng hơn;)
Dan Carley

1

Có vẻ như không có cách nào để làm điều này.


1

Tôi đã có một vấn đề tương tự và cuối cùng đã viết một kịch bản tạo ra tất cả các bản tóm tắt cho tôi. Tôi không còn thay đổi ~ / ssh / config, tôi thay đổi ~ / ssh / config.in và chạy lại tập lệnh của tôi.


1
Muốn chia sẻ kịch bản của bạn? Tôi đã nghĩ làm điều này, nhưng có vẻ như một giải pháp mạnh mẽ và chung chung có thể mất rất nhiều công việc để làm đúng. Ngay cả khi giải pháp của bạn chưa phải là điều đó, sẽ rất hữu ích khi biết những gì bạn nghĩ là đúng và bạn sẽ làm gì khác đi nếu bạn làm điều đó.
iconoclast

Tôi nghĩ là có .ssh/config.dmột tệp cho mỗi mẫu, trong đó mỗi mẫu sẽ tạo một hoặc nhiều mục trong cuối cùng ~/.ssh/config. Cũng sẽ có một tệp có các biến phổ quát, nhưng mỗi mẫu có thể có các biến riêng sẽ được ưu tiên trên toàn cầu, được liệt kê ở trên cùng. Tập ~/.ssh/configtin có thể được tạo theo yêu cầu hoặc theo lịch trình, nó sẽ không thành vấn đề với điều kiện miễn là bạn không bao giờ chỉnh sửa trực tiếp với tập tin mà bạn muốn giữ.
iconoclast

Kịch bản của tôi hoàn toàn không có giấy tờ và tôi không nghĩ nó có thể hiểu được nếu không có tài liệu hoặc ví dụ mà tôi không có thời gian để tạo.
Michael Hoffman

Có thể hiểu được. Bất kỳ phản hồi nào về cách tiếp cận tôi vạch ra sẽ được đánh giá cao, đặc biệt nếu tôi đang xem xét một số nhu cầu quan trọng hoặc trường hợp sử dụng, hoặc một số trở ngại lớn (hoặc nhỏ) khác.
iconoclast

1
Tôi nghĩ đó là một cách tiếp cận tốt, có lẽ ít gây nhầm lẫn hơn so với cách tiếp cận tôi đã sử dụng. Tôi đọc một số khai báo Máy chủ vào bộ nhớ, sau đó một số khai báo không phải máy chủ lưu trữ. Các khai báo không phải máy chủ được áp dụng cho mỗi Máy chủ trong nhóm hiện tại cho đến khi có Máy chủ khác. Tôi cũng cho phép các Máy chủ được khai báo nhiều lần trong tệp, bao gồm cả việc sử dụng toàn cầu. Cuối cùng, tôi viết ra tất cả những gì tôi đã xây dựng trong trí nhớ.
Michael Hoffman

1

Bỏ qua việc chỉ định ghi đè tên máy chủ trực tiếp thông qua Hostnamekhai báo và thay vào đó xác định nó trong thời gian chạy. Thực hiện việc này bằng cách đánh giá nó như một phần của ProxyCommand, sử dụng %hđể tham chiếu nó trong lệnh (cũng sử dụng %pthay vì cổng mã hóa cứng như 22), tức là

Host mygateway-*
   #Hostname ???WHAT GOES HERE????
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc $(echo %h|sed 's/^mygateway-//') %p

Người ta thậm chí có thể có một khổ thơ chung hơn, theo đó bạn có thể chỉ định bất kỳ máy chủ nào mà không -cần phải xử lý, hoặc theo một khổ thơ phù hợp khác, nhưng có một -cách tiếp cận chung để chỉ định bất kỳ <gateway>-<target>:

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh $(echo %h|cut -d - -f1) nc $(echo %h|cut -d - -f2-) %p

Ngoài ra, các phiên bản mới hơn của máy khách SSH hỗ trợ [-W host:port]tùy chọn thực hiện trực tiếp chức năng tương tự như nc(netcat). Như vậy, chúng ta có thể sử dụng sửa đổi:

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh -W $(echo %h|cut -d - -f2-):%p $(echo %h|cut -d - -f1)

Tất nhiên, nếu bạn đã có một danh sách hữu hạn các máy chủ, bạn luôn có thể làm:

Host host1 host2 host3 hostN
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc %h %p

Hi vọng điêu nay co ich!


0

Tôi đã có một khách hàng với cùng một thiết lập và tôi đã sử dụng DSSH để giải quyết vấn đề của mình.
DSSH trong số những thứ khác cho phép bạn đăng nhập một cách trong suốt đến các máy chủ từ xa thông qua một máy chủ cổng.

Trường hợp sử dụng

  • Thu thập các tham số cấu hình từ các bộ định tuyến của Cisco yêu cầu đăng nhập "ena"
  • Đăng nhập vào máy chủ đã tắt PermitRootLogin trực tiếp dưới quyền root (bằng cách nhập su - và mật khẩu tự động), trong khi duy trì trạng thái thoát
  • Thêm logic tùy chỉnh như ghi nhật ký nâng cao
  • đường hầm thông qua một số kết nối để đến máy chủ mục tiêu

5
Tôi không muốn bắt đầu sử dụng một số máy khách ssh của bên thứ ba ngẫu nhiên sử dụng java, cho những việc tôi có thể làm trong ~ / .ssh / config.
Rory

liên kết đã chết
iconoclast

Nguồn phần mềm có thể được tìm thấy trên Github: github.com/digmia/dssh
Khách
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.