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 ProxyCommand
có thể là một tập lệnh lấy tên máy chủ và chuyển tiếp ssh
kết nối đến nó bằng cách sử dụng netcat
hoặ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à ssh
bí 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