Làm cách nào để sử dụng cùng một bí danh SSH với nhiều địa chỉ máy chủ / cổng / v.v.?


4

Đây là vấn đề: Tôi đang cố gắng SSH vào một hệ thống có thể truy cập được từ ít nhất 3 mạng khác nhau, đôi khi thông qua proxy proxy vào các thời điểm khác nhau.

Kết nối trực tiếp nhanh hơn và đáng tin cậy hơn kết nối qua máy chủ trung gian, nhanh hơn và đáng tin cậy hơn nhiều so với kết nối qua internet nói chung, vì vậy tôi muốn SSH thử kết nối theo 3 cách khác nhau theo cách ưu tiên, chọn đầu tiên mà thành công

Tất cả đều giống nhau, rõ ràng, vì vậy tôi không muốn phải chọn thủ công giữa 3 bí danh khác nhau tùy thuộc vào nơi tôi kết nối.

Tuy nhiên, tôi không thể tìm thấy bất kỳ cơ chế nào để giải quyết điều này. Có thể làm điều này ở tất cả, hoặc không?

Nếu không, mọi người thường làm gì trong tình huống như vậy?

Câu trả lời:


5

Không sử dụng bí danh cho các sshkết nối! Sử dụng một cách thích hợp ssh_configtrong ~/.ssh/config. Nó có một số tính năng thực sự mạnh mẽ.

Hãy nói rằng bạn có thể xác định bạn thuộc mạng nào. Ví dụ: sử dụng IP của bạn, ví dụ có thể được kéo hostname -I. Vì vậy, hãy viết một số cấu hình:

# in network1 I am getting ip from "10.168.*.*" and I need to connect through proxy
Match Host myalias Exec hostname -I | grep 10\.168\.
  Hostname real-host-IP
  ProxyCommand ssh -W %h:%p proxy-server

# in network2 I am getting IP from "192.168.*.*" and I do not need a proxy
Match Host myalias Exec hostname -I | grep 192\.168\.
  Hostname real-host-IP

# in network3 I am getting something else

Tôi tin rằng bạn đã có điểm ...


ĐÚNG! Cảm ơn bạn!! Tôi đã mất hy vọng nhưng đây chính xác là những gì tôi cần! Dòng của tôi trông như thế Match Host myalias Exec "hostname | xargs nslookup | tail -n +5 | grep -q -e '^Address:\s*192\.168\.1\.'", cho bất kỳ độc giả thắc mắc.
Mehrdad

3

Bạn có thể lưu trữ bí danh shell hoặc hàm trong .bashrctệp của bạn hoặc bất cứ thứ gì khác là tệp cấu hình của shell. Ví dụ: đối với bí danh Bash:

alias my_ssh="
ssh mehrdad@"IP1 ||
ssh tomas@IP2 ||
ssh tomas@IP3
"

Sau đó gọi bí danh:

 my_ssh

Và nếu IP1 thất bại, hãy ||thực hiện lệnh thứ hai. Và vì vậy, nó đi một lần nữa, bây giờ với IP3.

Tôi đã không thử nghiệm điều này, nhưng nó sẽ ổn thôi. Hoặc ít nhất là cho thấy một cách.

Đối với các tùy chọn SSH như proxy, xem man ssh.


1
Vấn đề ở đây là xử lý thời gian chờ.
Rui F Ribeiro

Điểm tuyệt vời của @RuiFRibeiro. Ngoài ra, vấn đề khác là tôi không yêu cầu một hướng dẫn về kịch bản shell. Tôi đang hỏi liệu có cách nào để thực hiện sshlệnh này không . Như trong, tôi muốn có thể SSH vào máy chủ này giống như cách tôi SSH vào bất kỳ máy chủ nào khác. Một tập lệnh chung sử dụng SSH sẽ hoàn toàn thất bại trên máy này nếu nó phải gọi một lệnh khác.
Mehrdad

1
BTW không đủ để sử dụng ||vì ssh thoát với giá trị trả về của lệnh từ xa cuối cùng. Bạn cần kiểm tra mã thoát 255 để chắc chắn rằng có vấn đề về kết nối.
rudimeier

@rudimeier Trên thực tế, trong thử nghiệm của tôi, có vẻ như mã thoát 255 không phải là mã thoát xấu duy nhất mà ssh đưa ra. Tùy thuộc vào lý do tại sao nó thất bại, tôi đã nhận được một vài mã khác nhau. support2.microf
Focus.com/techdocs/2487.html

1
@rush Có, tôi đã kiểm tra điều này bằng cách sử dụng máy khách openssh : ssh localhost 'exit 123'; echo $?in 123. Nó được ghi lại trong trang man: ssh thoát với trạng thái thoát của lệnh từ xa hoặc với 255 nếu xảy ra lỗi.
rudimeier

1

Có thể có một số giải pháp, một số giải pháp tốt hơn các giải pháp khác và bỏ qua các tác động bảo mật hoặc các hạn chế về cấu trúc (không xác định):

  • thực hiện một đường hầm đảo ngược SSH (một hack xấu xí);
  • thiết lập anycast với sự trợ giúp của OSPF hoặc BGP và chuyển sang VIP VIP;
  • máy từ xa thiết lập đường hầm IPsec - không có proxy;
  • giao tiếp qua Tor
  • cập nhật một trang web / trang / Redis / máy chủ MySQL với địa chỉ hiện tại và tập lệnh ssh của bạn tìm nạp nó;
  • sử dụng HAProxy;
  • Thuốc nổ DNS.

1
Một số trong những gợi ý này có vẻ hoàn toàn vô lý ... giao tiếp qua Tor? Sử dụng Redis? Làm cho tôi tự hỏi nếu bạn thậm chí đã hiểu điểm của câu hỏi ...
Mehrdad

1
Tôi sẽ tư vấn một số khái niệm về mạng và anycast là gì. Tôi không đưa ra một danh sách rộng lớn các giải pháp tốt , quan điểm của tôi là về việc hiển thị có thể có rất nhiều giải pháp một khi bạn sáng tạo. Và tôi cũng thấy đó hoàn toàn là một chính sách tuyệt vời khi sử dụng từ vô lý với những người giúp bạn miễn phí.
Rui F Ribeiro

2
Bạn đang làm một trò chơi lô tô? Tôi cá rằng đây là lần đầu tiên trên tất cả các trang web StackExchange có câu trả lời sử dụng OSPF, Redis và HAProxy trong chưa đầy 500 dòng. Thêm RS-485 và iSCSI và bạn nhận được phiếu bầu của mình ;-)
xhienne

1

Chức năng này có thể hoạt động, nhưng nếu bí danh của Tomas hoạt động tôi nghĩ đó là một giải pháp tốt hơn.

autossh () {

  publicip="11.11.11.11"
  privateip="10.10.10.100"
  proxyhost="10.10.10.10"
  proxyport="9001"
  ssh -o ConnectTimeout=10 $1@$privateip 2> /dev/null && exit 0
  if [ $? -ge 1 ]; then
    ssh -o ConnectTimeout=10 $1@$publicip -o "ProxyCommand=nc -X connect -x $proxyhost:$proxyport %h %p" 2> /dev/null && exit 0
    if [ $? -ge 1 ]; then
      ssh -o ConnectTimeout=10 $1@$publicip 2> /dev/null && exit 0
      if [ $? -ge 1 ]; then
        echo "I think your node is down"
      fi
    fi
  fi

}

Cảm ơn nhưng điều này bỏ lỡ điểm câu hỏi của tôi ... xem bình luận của tôi dưới câu trả lời của anh ấy.
Mehrdad

Được rồi những gì bạn đang hỏi vẫn còn mơ hồ, nhưng cách tôi hiểu nó; Câu trả lời ngắn gọn là không. Câu trả lời dài là đổi tên chức năng của tôi hoặc bí danh của Tomas thành ssh.
Jesse_b

Chức năng của bạn có thể có một hành vi không mong muốn trong trường hợp phiên ssh đã được thiết lập bị ngắt kết nối ngẫu nhiên.
vội vàng

Ý anh là gì? Di $?chúc chỉ đại diện cho lệnh được thực hiện cuối cùng vì vậy nếu một phiên ssh bị chấm dứt trước khi chạy chức năng thì mã thoát sẽ bị ghi đè trước khi hàm cố gắng ssh.
Jesse_b

2
@Jesse_b Ý tôi là nếu kết nối ssh với $ 1 @ $ privateip sẽ được thiết lập thành công nhưng nó sẽ bất ngờ chết sau đó, trạng thái thoát sẽ khác không và chức năng sẽ cố gắng kết nối với ip công cộng thay vì chỉ chết.
vội và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.