ทำไมกฎไม่รวมในไฟล์กำหนดค่า ssh


12

ดูเหมือนว่าสิ่งต่อไปนี้จะทำงานได้ตามที่คาดไว้นั่นคือกฎข้อที่สองมีชื่อโฮสต์ที่ตรงกับกฎข้อแรกจะนำไปใช้

Host *.hostname.com
 User myuser
 IdentityFile ~/.ssh/myidentity

Host blah
 HostName complicated.hostname.com

อย่างไรก็ตามการพิมพ์ssh blahจะใช้กฎที่สองเท่านั้น (และไม่ใช่ไฟล์ผู้ใช้หรือข้อมูลประจำตัวของกฎข้อแรก)

ฉันมีสองคำถาม:

  1. ทำไมสิ่งนี้จึงเกิดขึ้น
  2. เป็นไปได้หรือไม่ที่จะทำในสิ่งที่ฉันพยายามทำ

คำตอบ:


9

จากssh_configหน้าคน:

สำหรับแต่ละพารามิเตอร์จะได้รับค่าแรกที่ได้รับ ไฟล์การกำหนดค่าประกอบด้วยส่วนที่คั่นด้วยข้อมูลจำเพาะ“ โฮสต์” และส่วนนั้นจะใช้กับโฮสต์ที่ตรงกับหนึ่งในรูปแบบที่กำหนดในข้อกำหนด ชื่อโฮสต์ที่ตรงกันคือชื่อที่ให้ในบรรทัดคำสั่ง

เนื่องจากใช้ค่าที่ได้รับครั้งแรกสำหรับแต่ละพารามิเตอร์จึงควรกำหนดค่าการประกาศเฉพาะโฮสต์เพิ่มเติมใกล้จุดเริ่มต้นของไฟล์และค่าเริ่มต้นทั่วไปในตอนท้าย

นอกจากนี้ฉันต้องแน่ใจว่าฉันเข้าใจ 2 ส่วนเหล่านี้หากคุณไม่ชัดเจนว่าโฮสต์และรูปแบบการทำงานเป็นอย่างไร การจับคู่เกิดขึ้นเพียง 1 ระดับเท่านั้น สถานที่นี้เป็นพื้นฐานในความสามารถของ regex แต่ยังคงมีประสิทธิภาพเมื่อคุณค้นหา

ส่วนโฮสต์

 The possible keywords and their meanings are as follows (note that keywords 
 are case-insensitive and arguments are case-sensitive):

 Host    Restricts the following declarations (up to the next Host keyword) 
         to be only for those hosts that match one of the patterns given
         after the keyword.  If more than one pattern is provided, they 
         should be separated by whitespace.  A single ‘*’ as a pattern can 
         be used to provide global defaults for all hosts.  The host is the 
         hostname argument given on the command line (i.e. the name is not
         converted to a canonicalized host name before matching).

         A pattern entry may be negated by prefixing it with an exclamation 
         mark (‘!’).  If a negated entry is matched, then the Host entry is      
         ignored, regardless of whether any other patterns on the line 
         match.  Negated matches are therefore useful to provide exceptions 
         for wildcard matches.

         See PATTERNS for more information on patterns.

รูปแบบ

 A pattern consists of zero or more non-whitespace characters, ‘*’ (a 
 wildcard that matches zero or more characters), or ‘?’ (a wildcard that
 matches exactly one character).  For example, to specify a set of 
 declarations for any host in the “.co.uk” set of domains, the following
 pattern could be used:

       Host *.co.uk

 The following pattern would match any host in the 192.168.0.[0-9] network 
 range:

       Host 192.168.0.?

 A pattern-list is a comma-separated list of patterns.  Patterns within 
 pattern-lists may be negated by preceding them with an exclamation
 mark (‘!’).  For example, to allow a key to be used from anywhere within an 
 organisation except from the “dialup” pool, the following entry
 (in authorized_keys) could be used:

       from="!*.dialup.example.com,*.example.com"

กฎการเลเยอร์

ปัญหาเกี่ยวกับวิธีการของคุณคือรูปแบบที่ตรงกับส่วนโฮสต์ที่ 1 ไม่ตรงกับส่วนที่ 2 ฉันมักจะทำสิ่งนี้:

Host *
 User myuser
 IdentityFile ~/.ssh/myidentity


Host blah
 HostName complicated.hostname.com

สิ่งหนึ่งที่ผู้คนมักจะไม่ทำตามกฎเหล่านี้คือพวกเขาสามารถทำซ้ำได้ ดังนั้นสิ่งที่ฉันบ่อยครั้งทำคือมีหลายส่วนและฉันทำลายพวกเขาใช้Host *'s

Host *
 User user1

Host blah1
 HostName complicated1.hostname.com

Host blah2
 HostName complicated2.hostname.com

Host *
 User user2

3
ในตัวอย่างของคุณมีการตั้งค่า "user2" เป็นอย่างไร ฉันคิดว่าใช้ค่าที่ได้รับครั้งแรกสำหรับโฮสต์ดังนั้นทุกโฮสต์จะตรงกับบล็อกแรกและตั้งค่า "user1"
jdm

@jdm - กฎของโฮสต์ที่ตามมาในลำดับที่ 2 Host *ซึ่งถูกจับคู่จะใช้ user2 เป็นผู้ใช้เริ่มต้นยกเว้นว่าจะระบุไว้อย่างชัดเจน
slm

@slm: ฉันได้พบจริงว่าไม่ทำงาน หากคุณเชื่อมโยงโฮสต์สองรายการ * ผู้ใช้ xxx จากนั้นโฮสต์ * ผู้ใช้ yyy กฎต่อไปนี้จะใช้ "xxx" - ยกเว้นว่าฉันทำอะไรผิด
Jérémie

@slm ตัวอย่างของคุณไม่ทำงาน ในเวลาที่ถึง 2 Host *กฎ 'แรกที่ได้รับมูลค่าสำหรับแต่ละพารามิเตอร์จะใช้' - ใช้และดังนั้นสิ่งนี้และUserคำจำกัดความต่อไปนี้ทั้งหมดจะถูกละเว้น ข้อยกเว้นจากกฎนี้คือIdentityFileคำหลัก btw
maxschlepzig

5

SSH ใช้ส่วนทั้งหมดที่ตรงกับชื่อโฮสต์ตามที่ระบุในบรรทัดคำสั่ง (เช่นHostNameกฎที่พบจะไม่ส่งผลต่อการตรวจสอบเงื่อนไขที่ตามมา) หากCanonicalizeHostnameเปิดใช้งานจะมีการใช้ไฟล์การกำหนดค่าอีกครั้งเมื่อเสร็จสิ้นโดยใช้ชื่อโฮสต์ที่อัปเดต (บางรุ่น SSH ทำสิ่งนี้โดยไม่คำนึงถึงCanonicalizeHostnameและตัวอย่างของคุณจะทำงานกับเวอร์ชันเหล่านั้น แต่นั่นถือเป็นข้อบกพร่องโดย devs SSH ดู# 2267 )

ซึ่งหมายความว่าคุณสามารถใช้CanonicalizeHostnameเพื่อทำให้ตัวอย่างของคุณทำงานโดยการเพิ่ม

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

ซึ่งจะไม่ทำการอ้างอิงแบบใด ๆ แต่จะเปิดใช้งานการส่งผ่านครั้งที่สองด้วยชื่อโฮสต์ที่อัปเดต (โปรดทราบว่ามันจะยังคงไม่ทำการแยกวิเคราะห์การกำหนดค่า "ซ้ำ" เพียงแค่ทำซ้ำหนึ่งครั้งดังนั้นหากคุณเปลี่ยนชื่อโฮสต์สองครั้งนั่นจะไม่ทำงาน)


1
ฉันเพิ่งอัพเกรด Ubuntu 14.04 เป็น 16.04 และด้วยจุดบกพร่องนี้ คำตอบนี้สมบูรณ์แบบ มันทำให้ฉันกลับไปสู่พฤติกรรมดั้งเดิม ขอบคุณ!
Brian Malehorn

ugh # 2267 หมายความว่าHost nickname; Hostname hostnamestanza ไม่สามารถให้ชื่อเล่นได้อีกต่อไป มันจะทำงานถ้าคุณเพิ่มCanonizalizeHostname yesคำหลักในแต่ละบล็อกชื่อเล่น แต่นั่นจะเพิ่มขนาดของบล็อกชื่อเล่นสองเท่าและดูน่าเกลียด
studog

1

จากหน้าคน

สำหรับแต่ละพารามิเตอร์จะได้รับค่าแรกที่ได้รับ ไฟล์การกำหนดค่าประกอบด้วยส่วนที่คั่นด้วยข้อมูลจำเพาะ '' โฮสต์ '' และส่วนนั้นจะใช้กับโฮสต์ที่ตรงกับหนึ่งในรูปแบบที่กำหนดในข้อกำหนด ชื่อโฮสต์ที่ตรงกันคือชื่อที่ให้ในบรรทัดคำสั่ง

เนื่องจากใช้ค่าที่ได้รับครั้งแรกสำหรับแต่ละพารามิเตอร์จึงควรกำหนดค่าการประกาศเฉพาะโฮสต์เพิ่มเติมใกล้จุดเริ่มต้นของไฟล์และค่าเริ่มต้นทั่วไปในตอนท้าย

ลองสลับลำดับรายการของคุณ


น่าเสียดายที่การเปลี่ยนลำดับของรายการใช้งานไม่ได้ (เป็นจริงตามคำสั่งที่ฉันเคยใช้)
Jérémie

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