ฉันมักจะต้อง ssh ลงในคอมพิวเตอร์โดยพลการจากคลัสเตอร์เฉพาะ (เครื่องทั้งหมดในคลัสเตอร์จะเหมือนกัน) อย่างไรก็ตามชุดของเครื่องที่มีอยู่ในคลัสเตอร์จะเปลี่ยนบ่อยดังนั้นฉันจึงมีสคริปต์ที่ส่งคืนชื่อโฮสต์โดยพลการจากคลัสเตอร์ที่พร้อมใช้งานและตรงกับความต้องการของฉัน (เช่นออนไลน์และใช้งานระบบปฏิบัติการที่ถูกต้อง)
โปรดทราบด้วยว่าฉันกำลังใช้การส่งต่อข้อมูลรับรอง Kerberos (GSSAPIAuthentication) สำหรับการตรวจสอบสิทธิ์
ตอนนี้ฉันกำลังใช้งานssh `get_host`
อยู่ ssh cluster
ฉันต้องการที่จะดำเนินการแทน ด้วยชื่อโฮสต์ที่รู้จักทำให้ง่ายต่อการใช้งานใน/ssh/config
:
Host cluster
HostName static_host.cluster.domain.tld
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
ฉันจะเลือกHostName
แบบไดนามิกโดยใช้สคริปต์ของฉันได้อย่างไร (หรือ SSH มีวิธีที่แตกต่างเพื่อรองรับฟังก์ชั่นที่ต้องการหรือไม่) ฉันต้องการทำสิ่งต่อไปนี้ แต่มันไม่ทำงาน:
Host cluster
HostName `get_host` # This does not work
...
Grawityแสดงให้เห็นว่าProxyCommand
สามารถเป็นสคริปต์ที่ได้รับชื่อโฮสต์และส่งต่อการssh
เชื่อมต่อโดยใช้หรือnetcat
socat
อย่างไรก็ตามสิ่งนี้ไม่ได้ส่งต่อข้อมูลรับรอง Kerberos ช่วยด้วยนี่คือชื่นชมเช่นกัน
แก้ไข:
คุณทำสิ่งนี้กับ Kerberos ไม่ได้ตามที่ฉันต้องการ (ดูความคิดเห็นในคำตอบที่ยอมรับ) ดังนั้นฉันใช้สคริปต์นี้ssh-wrapper
เป็นssh
นามแฝงที่จะทำการเขียนใหม่แบบไดนามิกในssh
อาร์กิวเมนต์บรรทัดคำสั่ง มันไม่แข็งแรง แต่ใช้งานได้สำหรับฉัน
#!/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