วิธีรับชื่อโฮสต์จากสคริปต์ที่เรียกใช้งานได้ในไฟล์กำหนดค่า SSH


10

ฉันมักจะต้อง 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

คำถามที่เกี่ยวข้องบนเซิร์ฟเวอร์ผิดพลาด
ไมเคิล - ที่ไหน Clay Shirky

คำตอบ:


6

~/.ssh/config:

Host cluster
    ProxyCommand ~/bin/cluster-connect

~/bin/cluster-connect:

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

ขอบคุณ (หรือnetcat $(get_host) 22) นี้ใช้งานได้ดีสำหรับการเชื่อมต่อ แต่ดูเหมือนจะไม่ผ่านข้อมูลรับรองของ Kerberos ของฉัน ฉันมีGSSAPIAuthentication yesและGSSAPIDelegateCredentials yesอยู่ภายใต้ไฟล์Host clusterของฉัน.ssh/configและพวกเขาจะทำงานถ้าชื่อโฮสต์ได้รับการอธิบาย แต่ไม่ใช่ถ้าฉันกำหนดเส้นทางผ่าน ProxyCommand คิด? ฉันจะแก้ไขคำถามด้วย
David B.

ผมไม่คิดว่าคุณสามารถบรรลุว่า - sshต้องรู้ชื่อโฮสต์เป้าหมายที่จะได้รับตั๋วที่ถูกต้องและมีเพียงไม่มีทางที่จะให้มันแบบไดนามิก (สั้น ๆ ของการใช้เสื้อคลุมที่เพียงทำงานssh $(get_host) "$@"ซึ่งเท่าที่ผมเข้าใจคุณไม่ต้องการ ) มันอาจจะทำงานถ้าเซิร์ฟเวอร์ทั้งหมดในคลัสเตอร์มีเงินต้น Kerberos เดียวกัน แต่ผมไม่คิดว่าทุกคนไม่เคยว่า
user1686

โชคร้าย แต่ทำให้รู้สึก ฉันเขียน wrapper ด่วนเพื่อทำการค้นหา / แทนที่แบบไดนามิก (เพิ่มในคำถาม) มันจะแตกในบางสถานการณ์ แต่ใช้งานได้สำหรับฉัน
David B.

ค้นหา / แทนที่แบบไดนามิกหรือไม่ ...
1686

เพียง substituion บนอาร์กิวเมนต์ commandline to ssh จาก host-alise ไปยังการแม็พ host-generation-script ที่เก็บในสคริปต์
David B.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.