คุณมีมากกว่าหนึ่งไฟล์ ~ / .ssh / config ไหม


82

เรามีเซิร์ฟเวอร์ป้อมปราการที่เราใช้ในการเชื่อมต่อกับโฮสต์หลายแห่งและ. ssh / config ของเราเติบโตเป็นมากกว่าหนึ่งพันบรรทัด (เรามีโฮสต์นับร้อยที่เราเชื่อมต่อด้วย) นี่คือจุดเริ่มต้นที่จะได้รับการเทอะทะเล็กน้อยและฉันต้องการที่จะรู้ว่ามีวิธีที่จะทำลายไฟล์. ssh / config ขึ้นเป็นหลายไฟล์ ตามหลักแล้วเราจะระบุตำแหน่งที่ไฟล์อื่น ๆ จะถือว่าเป็นไฟล์. ssh / config

~/.ssh/config
  ~/.ssh/config_1
  ~/.ssh/config_2
  ~/.ssh/config_3
  ...

ฉันได้อ่านเอกสารเกี่ยวกับ ssh / config แล้วและฉันไม่เห็นว่าเป็นไปได้ แต่บางทีคนอื่นอาจมีปัญหาที่คล้ายกันและพบวิธีแก้ปัญหา


ให้ผู้ใช้แต่ละคนเข้าสู่โฮสต์ bastion ด้วยชื่อผู้ใช้ของตนเอง นอกจากนี้คุณใส่อะไรลงในไฟล์กำหนดค่าที่ต้องมีรายการสำหรับแต่ละโฮสต์ คุณไม่สามารถตั้งค่าเริ่มต้นที่เป็นเรื่องปกติได้ใช่ไหม
Jed Daniels

1
คำถามเดียวกันใน superuser.com: superuser.com/questions/247564/…
guettli

1
เร็ว ๆ นี้ใน OpenSSH 7.3 ที่ควรจะเป็นไปได้ bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

คำตอบ:


51

~/.ssh/configไฟล์ไม่ได้มีคำสั่งสำหรับการรวมไฟล์อื่น ๆ ที่อาจจะเกี่ยวข้องกับการตรวจสอบ SSH สำหรับสิทธิ์ของแฟ้ม

คำแนะนำเกี่ยวกับสิ่งนี้อาจรวมถึงสคริปต์เพื่อจัดการการเปลี่ยนแปลงหลายอย่างด้วยกันทั้งในระบบหรือผ่านตะขอเช็คอินบนที่เก็บ หนึ่งอาจดูเป็นเครื่องมือเช่น Puppet หรือ Augeas

อย่างไรก็ตามคุณเข้าใกล้คุณจะต้องเชื่อมไฟล์แต่ละไฟล์ให้เป็นไฟล์เดียวจากด้านนอกไฟล์

$ cat ~/.ssh/config_* >> ~/.ssh/config

หมายเหตุ: เขียนทับ: > vsผนวก:>>

อัปเดตธันวาคม 2560:

ตั้งแต่ 7.3p1 ขึ้นไปจะมีตัวเลือกรวม ซึ่งอนุญาตให้คุณรวมไฟล์การกำหนดค่า

Include
    Include the specified configuration file(s).  Mul‐
    tiple pathnames may be specified and each pathname
    may contain glob(3) wildcards and, for user config‐
    urations, shell-like “~” references to user home
    directories.  Files without absolute paths are
    assumed to be in ~/.ssh if included in a user con‐
    figuration file or /etc/ssh if included from the
    system configuration file.  Include directive may
    appear inside a Match or Host block to perform con‐
    ditional inclusion.

ขอบคุณ Jeff นี่เป็นความคิดที่ดี ฉันไม่รู้มากเกี่ยวกับ Puppet หรือ Augeas ดังนั้นเพื่อรักษาสิ่งต่าง ๆ ให้ง่ายที่สุดเท่าที่จะเป็นไปได้โซลูชันของคุณก็ดูดีที่สุด ฉันสามารถแบ่งการกำหนดค่าเป็นหลาย ๆ การตั้งค่าและสร้างสคริปต์ง่าย ๆ เพื่อสร้างไฟล์. ssh / config ทุกครั้งที่มีการแก้ไขไฟล์ใดไฟล์หนึ่ง ฉันไม่ทราบว่าวิธีการแก้ปัญหานี้สะอาดเพียงใด แต่ดูเหมือนจะใช้กลอุบายและทำงานเพื่อจุดประสงค์ของฉัน
Wrangler

52

คุณสามารถระบุไฟล์กำหนดค่าปัจจุบันที่จะใช้ในตัวเลือก ssh ดังนี้:

ssh -F /path/to/configfile

ดูเหมือนว่าเป็นวิธีเดียว

นอกจากนี้ยังมีอีกไม่นานที่จะรวมการกำหนดค่าหนึ่งไปยังอีกการตั้งค่า


เป็นการดีที่มีตัวเลือกเมื่อใช้โมดูล Net :: OpenSSH ของ Perl (เช่นสำหรับไฟล์คีย์ส่วนตัวหลายไฟล์) ซึ่งโมดูลนั้นไม่ได้ให้ความเป็นไปได้ทั้งหมด
Jimmy Koerting

36

เริ่มต้นด้วย ssh 7.3 (เผยแพร่เมื่อวันที่ 1 สิงหาคม 2016) มีIncludeคำสั่งให้ใช้งาน

รวม : รวมไฟล์การกำหนดค่าที่ระบุ อาจมีการระบุชื่อพา ธ หลายชื่อและแต่ละชื่อพา ธ อาจมี glob wildcards และการอ้างอิงแบบเชลล์ "~" เหมือนเชลล์ไปยังโฮมไดเร็กทอรีของผู้ใช้ ~/.sshไฟล์โดยไม่ต้องเส้นทางที่แน่นอนจะถือว่าเป็นใน Includeสั่งอาจปรากฏขึ้นภายในMatchหรือHostปิดกั้นการดำเนินการรวมเงื่อนไข

(นี่คือลิงค์ไปยังรายงานข้อผิดพลาดที่ได้รับการแก้ไขซึ่งรวมถึงแพทช์: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )


2
มันเท่ห์เกินไป หวังว่าจะได้สิ่งนี้ ในที่สุดมันก็ควรจะแก้ปัญหานี้ได้อย่างถูกต้อง :)
Wrangler

2
เพียงเพิ่มคำสั่งรวมที่ด้านบนของconfigไฟล์ ฉันไม่สามารถเข้าใจได้ว่าทำไมมันไม่ทำงานที่ด้านล่าง
pylover

17

ฉันเองใช้คำสั่งเหล่านั้นเพื่อรวบรวมการตั้งค่า ssh:

alias compile-ssh-config='echo -n > ~/.ssh/config && cat ~/.ssh/*.config > ~/.ssh/config'
alias ssh='compile-ssh-config && ssh'
# (This will get used by other programs depending on the ~/.ssh/config)
# (If you need you can run the compile-ssh-config command via cron etc.)

หรือ:

alias compile-ssh-config='echo -n > ~/.ssh/config-compilation && cat ~/.ssh/*.config > ~/.ssh/config-compilation'
alias ssh='compile-ssh-config && ssh -F ~/.ssh/config-compilation'
# (This is saver and won't over write an existing ~/.ssh/config file)

เพราะ:

alias ssh='ssh -F <(cat .ssh/*.config)'

ไม่ทำงานสำหรับฉันการส่งคืน:

ssh: Can't open user config file /dev/fd/63: Bad file descriptor

หวังว่านี่จะเป็นความช่วยเหลือใด ๆ


ssh -F <(cat .ssh/*.config)จะเหมาะ ฉันมาด้วยเช่นกัน แต่ฉันได้รับข้อผิดพลาดเดียวกัน ใครรู้ว่าปัญหาคืออะไรที่นี่?
sickill

2
ssh ตรวจสอบการอนุญาตของไฟล์ฉันคิดว่าการเปลี่ยนเส้นทางแบบนี้ไม่รองรับการตรวจสอบนั้น
Camden Narzt

2

ฉันจะใช้cat config_* > configเพื่อสร้างการกำหนดค่าทั้งหมด แต่ฉันจะไม่ใช้หุ่นเชิด / cfengine ฯลฯ สำหรับสิ่งนี้หากยังไม่ได้ใช้งาน (BTW: ทำไมไม่ใช้ระบบจัดการการกำหนดค่า ???)

ฉันจะสร้างแพคเกจ (deb, rpm) และวางไว้ในที่เก็บในเครื่อง และในสคริปต์ postinst cat จะสร้างการกำหนดค่าของคุณ บางทีคุณอาจรวมโฟลเดอร์ในตัวเครื่อง ... ข้อดีคือการอัพเดต ssh / config จะเปิดใช้งานบนฐานรายวันในขณะที่ cron-apt & Co ทำงาน


0

คุณสามารถใช้ Makefile ใน~/.ssh:

    config: config.in config.app.in
        > $@
        (for f in $+; do cat $$f; echo; done) | sed '$$ d' >> $@

    config.app.in:
        (echo "# Generated with foobar.sh."; \
            foobar.sh) > $@
    .PHONY: config.app.in

แล้วย้ายของคุณที่มีอยู่configไปconfig.inและเรียกใช้ในการสร้างmakeconfig


0

ฉันได้เล่นกับแนวคิดของconfig.dไดเรกทอรีสำหรับการจัดระเบียบของฉัน ดังนั้นเมื่อต้องการเพิ่มตัวเลือกด้านบนนี่คือสิ่งที่ได้ผลสำหรับฉัน

โครงสร้างไดเรกทอรีนั้นเป็นอย่างไร

~/.ssh/config.d
├── system_1
├── system_2
├── system_3
├── personal_boxen
├── git_things
├── random
└── rubbish

ฟังก์ชั่นที่สร้าง ~ / .ssh / config และใช้ชีวิตใน run-config ของเชลล์มีดังต่อไปนี้

sshMakeConfig() {
    echo '# AUTOGENERATED by sshMakeConfig()' > ~/.ssh/config
    for i in ~/.ssh/config.d/*
        do echo "#${i}" | tee -a ~/.ssh/config
        cat ${i} >> ~/.ssh/config
    done
}

เพิ่มทางเลือกsshMakeConfigที่ด้านล่างของ run-config ของคุณหากคุณต้องการให้แน่ใจว่า config ใหม่ในแต่ละเชลล์เซสชั่น

เมื่อใดก็ตามที่ฉันต้องการคอมไพล์ ~ / .ssh / config ของฉันอีกครั้งฉันทำได้โดยการเรียกใช้sshMakeConfigในบางรูปแบบ (โดยตรงการจัดหา run-config ของฉันหรือเริ่มเชลล์ใหม่)

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