Làm cách nào để có được HostName từ tập lệnh thực thi trong tệp cấu hình SSH?


10

Tôi thường xuyên cần phải ssh vào một máy tính tùy ý từ một cụm cụ thể (tất cả các máy trong cụm là giống hệt nhau). Tuy nhiên, tập hợp các máy có sẵn trong cụm thay đổi thường xuyên, vì vậy tôi có một tập lệnh trả về tên máy chủ tùy ý từ cụm có sẵn và phù hợp với yêu cầu của tôi (ví dụ: trực tuyến và chạy đúng HĐH).

Cũng lưu ý rằng tôi đang sử dụng chuyển tiếp thông tin xác thực Kerberos (GSSAPIAuthentication) để xác thực.

Ngay bây giờ, tôi ssh trong sử dụng ssh `get_host`. Tôi muốn thay vì thực hiện ssh cluster. Với một tên máy chủ đã biết, điều này thật dễ dàng với các mục sau /ssh/config:

Host cluster
    HostName static_host.cluster.domain.tld
    GSSAPIAuthentication yes
    GSSAPIDelegateCredentials yes

Làm cách nào tôi có thể chọn HostNameđộng, sử dụng tập lệnh của mình? (Hoặc SSH có một phương pháp khác để hỗ trợ chức năng mong muốn của tôi không?) Tôi muốn làm một cái gì đó như sau, nhưng nó không hoạt động:

Host cluster
    HostName `get_host`   # This does not work
    ...

Grawity cho thấy rằng ProxyCommandcó thể là một tập lệnh lấy tên máy chủ và chuyển tiếp sshkết nối đến nó bằng cách sử dụng netcathoặc socat. Tuy nhiên, điều này không chuyển tiếp thông tin đăng nhập Kerberos. Giúp với điều này được đánh giá cao là tốt.

BIÊN TẬP:

Bạn không thể làm điều này với Kerberos như tôi muốn (xem bình luận trong câu trả lời được chấp nhận). Vì vậy, tôi đang sử dụng tập lệnh này ssh-wrapper, với tư cách là sshbí danh để viết lại động trên sshđối số dòng lệnh. Nó không mạnh mẽ, nhưng nó hoạt động với tôi.

#!/bin/bash

# Mapping between host aliases and dynamically-generated hostname
declare -A MAP
MAP[cluster]=`gethost`

# Find and replace on all positional args
args=$*
for key in ${!MAP[@]}; do
    replace=${MAP[$key]}
    args=`echo ${args} | sed "s/\(^\|[[:space:]]\)${key}\(\$\|[[:space:]]\)/${replace}/"`
done

# Execute using called-name if not this script
if [ "ssh-wrapper" != "`basename $0`" ]; then
    exec $0 ${args}
# Otherwise, assume ssh and execute
else
    exec ssh ${args}
fi

Câu trả lời:


6

~/.ssh/config:

Host cluster
    ProxyCommand ~/bin/cluster-connect

~/bin/cluster-connect:

#!/bin/bash
socat stdio tcp:$(get_host):22

Cảm ơn. Điều này (hoặc netcat $(get_host) 22) hoạt động tuyệt vời cho kết nối. Nhưng, nó dường như không vượt qua thông tin kerberos của tôi. Tôi đã có GSSAPIAuthentication yesGSSAPIDelegateCredentials yesdưới Host clustertrong tôi .ssh/configtập tin, và họ làm việc nếu HostName được đưa ra explicity, nhưng không nếu tôi con đường qua ProxyCommand. Suy nghĩ? Tôi cũng sẽ sửa đổi câu hỏi.
David B.

Tôi không nghĩ bạn có thể đạt được điều đó - sshphải biết tên máy chủ mục tiêu để có được vé chính xác và không có cách nào để cung cấp nó một cách linh hoạt (thiếu sử dụng một trình bao bọc đơn giản chạy ssh $(get_host) "$@", như tôi hiểu bạn không muốn ). Nó có thể hoạt động nếu tất cả các máy chủ trong cụm có cùng hiệu trưởng Kerberos, nhưng tôi không nghĩ có ai từng làm như vậy.
dùng1686

Đáng tiếc, nhưng làm cho cảm giác. Tôi đã viết một trình bao bọc nhanh để thực hiện tìm / thay thế động (thêm vào câu hỏi). Nó sẽ phá vỡ trong một số tình huống, nhưng làm việc cho tôi.
David B.

Tìm / thay thế động? ...
user1686

Chỉ là một nhóm thay thế trên các đối số dòng lệnh cho ssh, từ một máy chủ lưu trữ đến ánh xạ tập lệnh thế hệ máy chủ được lưu trữ trong tập lệnh.
David B.
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.