มีวิธีให้ไฟล์กำหนดค่า SSH หนึ่งไฟล์เพื่อรวมอีกไฟล์หนึ่งหรือไม่


131

ในกรณีที่สำคัญ:

  • ระบบปฏิบัติการ: Ubuntu 10.04
  • SSH: OpenSSH_5.3p1 Debian-3ubuntu5

ฉันต้องการไฟล์ SSH หนึ่งไฟล์เพื่อรวมอีกไฟล์หนึ่ง กรณีการใช้งานคือการกำหนดสิ่งที่ฉันต้องการใน.ssh/configไฟล์เริ่มต้นของฉันจากนั้นเตรียมสิ่งพิเศษสองสามไฟล์ไว้ในไฟล์แยกต่างหาก (เช่น~/.ssh/foo.config) ฉันต้องการให้ไฟล์ที่สองรวมไฟล์แรกไว้ดังนั้นฉันจึงไม่ต้องทำซ้ำทุกอย่างในไฟล์แรก เป็นไปได้หรือไม่ ขอบคุณ!


2
คำถามเดียวกันเกี่ยวกับ serverfault: serverfault.com/questions/375525/…
guettli

คำตอบ:


140

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

Include

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

ตัวอย่างเช่นคุณอาจมีใน~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

และใน~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

จากความคิดเห็นใช้ด้านล่างเพื่อรวมไฟล์ทั้งหมดในconfig.dไดเรกทอรี:

Include config.d/* 

13
ตรวจสอบเวอร์ชั่นด้วย $ ssh -V
Pieter

7
ใช้เพื่อรวมรายการทั้งหมดในInclude config.d/* config.d
Simon Woodside

17
Ftr: สิ่งนี้จะต้องอยู่ด้านบนของไฟล์และไม่สามารถผนวกเข้ากับHostรายการได้
dtk

2
ลองบน Ubuntu 16.04 แม้ว่ามันจะใช้งานได้ แต่การเติมข้อความอัตโนมัตินั้นเสียซึ่งทำให้มีประโยชน์น้อยกว่า หากคุณต้องการอัปเกรด ssh บน ubuntu ให้ดูที่ลิงค์นี้gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu

@dtk ขอบคุณสำหรับสิ่งนั้น นั่นคือสิ่งที่ทำให้ฉันตกใจ
อดัมคีแนน

28

ไม่สำหรับความรู้ของฉันมันเป็นไปไม่ได้

นี่คือลิงค์ไปยังคำขอคุณลักษณะแบบเปิด / ตั๋วข้อผิดพลาดที่เกี่ยวข้อง:

https://bugzilla.mindrot.org/show_bug.cgi?id=1585

https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495


2
ยังมีข้อบกพร่องนี้ใน Debian: บั๊ก .debian.org/cgi-bin/bugreport.cgi?bug=631189
Lluís

8
พระเจ้าช่วย. มันเกิดขึ้น ตั้งแต่ 2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3
oschrenk

คำตอบนี้ถูกต้องในขณะนั้น แต่ล้าสมัยแล้ว
Mark Stosberg

25

หากคุณต้องการเริ่มต้นไคลเอ็นต์ ssh คุณสามารถทำได้ใน bash:

#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'

จากนั้นคุณใช้ ssh ตามปกติและมันจะมีไฟล์ทั้งสองอ่านตามลำดับ

สำหรับเซิร์ฟเวอร์ daemon sshdคุณสามารถทำได้เหมือนกันเพียงแค่ใช้-fแทน-Fและจดสิ่งนี้ไว้ในตำแหน่งที่คุณเริ่ม daemon โดยตรง คุณไม่ต้องการนามแฝง

ความเป็นไปได้ที่สองตามหน้าคนที่จะนำการกำหนดค่ากว้างในระบบและผู้ใช้คนหนึ่งใน/etc/ssh/ssh_config~/.ssh/config

อัปเดตเห็นได้ชัดว่ามีปัญหาบางอย่างกับเวอร์ชั่นทุบตีและวิธีการสร้างอุปกรณ์ (ดูhttp://bugs.alpinelinux.org/issues/1465 )

นี่เป็นวิธีแก้ปัญหา (แม้ว่าในความคิดของฉันน่าเกลียด):

mkfifo /tmp/ssh_fifo
cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo & 
ssh -F /tmp/ssh_fifo myserver
rm /tmp/ssh_fifo

ดังนั้นหากคุณต้องการคุณสามารถสร้างฟังก์ชั่นได้ (หรือสคริปต์):

ssh() {
    tmp_fifo=$(mktemp -u --suffix=_ssh_fifo)
    mkfifo "$tmp_fifo" 
    cat ~/.ssh/config ~/.ssh/foo.config >"$tmp_fifo" 2>/dev/null & 
    /usr/bin/ssh -F "$tmp_fifo" "$@"
    rm "$tmp_fifo"
}

1
น่าเศร้าที่นี่ใช้ไม่ได้กับ ssh ของ OSX: ไม่สามารถเปิดไฟล์กำหนดค่าผู้ใช้ / dev / fd / 63: ตัวอธิบายไฟล์ไม่ดี
Ash Berlin-Taylor

มันไม่ทำงานสำหรับฉันด้วย (Ubuntu 11.10) Linux ให้ข้อผิดพลาดเดียวกับ @AshBerlin ที่โพสต์ไว้ด้านบน
Szymon Jeż

@AshBerlin คุณอาจลองมันมากเกินไปนี้ควรจะทำงานยังสำหรับ OSX จนกว่าข้อผิดพลาดได้รับการแก้ไข
estani

ให้ ssh ตรวจสอบสามตำแหน่ง, 1. บรรทัดคำสั่ง, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, คุณไม่จำเป็นต้องส่งผ่าน~/.ssh/configบรรทัดคำสั่งด้วย เพียงalias ssh='ssh -F ~/.ssh/foo.config'และ~/.ssh/configควรได้รับหลังจากนั้น ตราบใดที่คุณไม่รังเกียจที่foo.configจะถูกโหลดมาก่อนควรจะสะอาดกว่าวิธีแก้ปัญหาข้างต้น
jim

1
@ จิมไม่มันไม่ทำงานอย่างนั้น คนแรกที่พบถูกนำมาใช้ คุณเคยลองไหม จากหน้า man "-F configfile: ระบุไฟล์การกำหนดค่าต่อผู้ใช้ทางเลือกหากมีการกำหนดไฟล์การกำหนดค่าบนบรรทัดคำสั่งไฟล์การกำหนดค่าทั้งระบบ (/ etc / ssh / ssh_config) จะถูกละเว้น"
estani

17

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

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

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


14

ในทำนองเดียวกันกับ 'น่าเกลียด' อื่น ๆ ที่นี่ฉันซับหนึ่ง:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"

โปรดทราบว่าsftpคำสั่งนั้นจะไม่เรียกการคำนวณการกำหนดค่าใหม่
VasyaNovikov

2
(ฉันยังคงชอบคำตอบเพราะมันใช้ "config.d /" และง่ายมาก.)
VasyaNovikov

2
เรียบง่ายสง่างามและ
แฮ็

6

เอาล่ะฉันโกงที่จะทำสิ่งนี้ ในไฟล์ bash .profile-ish ของฉันฉันมีบล็อกที่แทนที่ส่วนต่างๆของโฮมไดเรกทอรีของฉันในการเข้าสู่ระบบดังนั้นฉันเพิ่งสร้างใหม่ในแต่ละครั้ง ตัวอย่าง:

rm ~/.ssh/config
cat ~/conf/myservers.sshconfig >> ~/.ssh/config

[ -f ~/conf/workservers.sshconfig ] && cat ~/conf/workservers.sshconfig >> ~/.ssh/config
(or something like this:)
for i in `ls ~/conf/sshconfigs` ; do
    cat $i >> ~/.ssh/config
done

chmod 600 ~/.ssh/config

สิ่งนี้ยังช่วยให้ฉันทำสิ่งต่าง ๆ เช่นเพิ่มบล็อกการตั้งค่าลงในไฟล์ ssh ถ้าฉันอยู่บนโฮสต์ A หรือ B แต่ไม่ใช่ในระบบที่บ้านของฉัน

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


3

ฉันเองใช้คำสั่งเหล่านั้นเพื่อรวบรวมการตั้งค่า 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

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


คุณสามารถไปอีกขั้นหนึ่งและรวมสิ่งนี้กับ fswatch เพื่อรวบรวมโดยอัตโนมัติในการเปลี่ยนแปลงไฟล์
cavalcade

3

อีกวิธีการแก้ปัญหาตาม FUSE (ไม่ได้ทดสอบตัวเอง):

https://github.com/markhellewell/sshconfigfs

"แทนที่จะต้องจัดการไฟล์ขนาดใหญ่หนึ่งไฟล์ต่อไป [... ] แทนที่จะสร้างไฟล์" config "แบบไดนามิกจากชิ้นส่วนขนาดเล็กจำนวนมากแบบไดนามิก"

ฉันยังพบบทความที่ทำสิ่งนี้ผ่านทาง FIFOs: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/


1
ฉันพบว่าเนื้อหาความคิดเห็นมีความหมายเพียงพอ - มันบอกว่า "FUSE" (บางทีการขยายคำย่อจะดีกว่า); ลิงก์นี้เป็นเพียงการนำไปปฏิบัติ
aviv

1
ไม่ทราบปัญหาคำตอบสั้น ๆ ขยายคำตอบ ดูเหมือนว่าฉันจะต้องกลับมาตรวจสอบเว็บไซต์สำหรับคำตอบของฉันเป็นครั้งคราวในกรณีที่ไม่มีการแจ้งเตือนอีเมล :) เรียนรู้ที่จะใช้ favs โดยตอนนี้ ขอบคุณสำหรับความคิดเห็น
amontero

2

ไม่มีของเหล่านี้นามแฝงโซลูชั่นสำหรับการทำงานgitหรือโปรแกรมอื่น ๆ sshนอกเหนือจาก

ฉันตบอย่างรวดเร็วและสกปรก แต่คุณอาจต้องการปรับปรุงมัน

เพิ่มไปยังของคุณ ~/.bashrc

mkdir -p ~/.ssh/config.d/
[ -e ~/.ssh/config ] && mv ~/.ssh/config ~/.ssh/config.bak.$(date -Ins)
cat ~/.ssh/config.d/* > ~/.ssh/config

~/.ssh/config.dทุกครั้งที่คุณเริ่มเซสชันก็จะรวมกันไฟล์ทั้งหมดใน (บรรทัดที่ 3)

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


ยอดเยี่ยมด้วยการเพิ่มis_anything_changedเงื่อนไขบางอย่าง
vp_arth

1

คุณสามารถอัพเกรดเวอร์ชั่น SSH บน Ubuntu เป็น v7.3 (ทดสอบบน Ubuntu Xenial 16.04) โดยการติดตั้งแพ็คเกจจาก Yakkety:

echo "deb http://archive.ubuntu.com/ubuntu yakkety main" > /etc/apt/sources.list.d/yakkety.list
apt-get update
apt-get install -y ssh
rm /etc/apt/sources.list.d/yakkety.list
apt-get update

ตรวจสอบเวอร์ชั่น SSH

ssh -V
OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016

กำหนดค่า SSH เพื่อใช้รวมจากไดเรกทอรี ~ / .ssh / config.d

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config

0

คำตอบที่โง่ของฉัน:

  • พยายามติดตั้ง OpenSSH> 7.3 บน Xenial (16.04)
  • ไม่ชอบความยุ่งเหยิง

ดังนั้นฉันจึงตัดสินเรื่องนี้:

  • เก็บไฟล์กำหนดค่า OpenSSH แยกต่างหาก ~/.ssh/config.d/
  • เมื่อคุณเปลี่ยนหนึ่งทำ cat ~/.ssh/config.d/* > ~/.ssh/config
  • ในวันอันรุ่งโรจน์คุณอัปเกรดเป็นรุ่น distro ที่มี OpenSSH 7.3p1 หรือใหม่กว่าคุณสามารถสร้างไฟล์ที่มี

Include config.d/*


0

ฉันไม่สามารถอัพเกรด SSH บนเครื่องของฉันไม่ได้

ฉันใช้ GNU make เพื่อสร้างไฟล์ ssh config เมื่อจำเป็นเท่านั้น :

# Concatenates all the .config files.
aInput  = *.config
aOutput = ~/.ssh/config

aCurrentMakefile = $(lastword $(MAKEFILE_LIST))

$(aOutput): $(shell ls $(aInput)) $(aCurrentMakefile)
    @echo "Generating $(aOutput)"
    @echo "# File generated by $(aCurrentMakefile) on $(shell date +'%F %T.%6N')" > $(aOutput)
    @cat $(aInput) >> $(aOutput)

จากนั้น ssh จะถูกใช้แทน

alias ssh='make -s -f ~/Tools/config.d/makefile -C ~/Tools/config.d && ssh'

มันทำงานเหมือนจับใจ

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