Tại sao các quy tắc không kết hợp trong một tập tin cấu hình ssh?


12

Có vẻ như sau đây sẽ hoạt động như mong đợi, nghĩa là quy tắc thứ hai, có tên máy chủ phù hợp với quy tắc đầu tiên, sẽ áp dụng quy tắc đó.

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

Host blah
 HostName complicated.hostname.com

Tuy nhiên, gõ ssh blahchỉ áp dụng quy tắc thứ hai (và không áp dụng tệp người dùng hoặc danh tính của quy tắc thứ nhất).

Tôi có hai câu hỏi:

  1. Tại sao chuyện này đang xảy ra?
  2. Có thể (đơn giản) làm những gì tôi đang cố gắng làm?

Câu trả lời:


9

Từ ssh_configtrang người đàn ông:

Đối với mỗi tham số, giá trị thu được đầu tiên sẽ được sử dụng. Các tệp cấu hình chứa các phần được phân tách bằng thông số kỹ thuật của Máy chủ lưu trữ và phần đó chỉ được áp dụng cho các máy chủ khớp với một trong các mẫu được cung cấp trong thông số kỹ thuật. Tên máy chủ phù hợp là tên được đưa ra trên dòng lệnh.

Vì giá trị thu được đầu tiên cho mỗi tham số được sử dụng, nên khai báo cụ thể hơn về máy chủ ở gần đầu tệp và mặc định chung ở cuối.

Ngoài ra, tôi chắc chắn rằng tôi hiểu 2 phần này nếu bạn không rõ chức năng của Host và PATTERNS. Chỉ có 1 cấp độ phù hợp đang diễn ra. Cơ sở này rất cơ bản trong khả năng regex của nó, nhưng vẫn mạnh mẽ một khi bạn mò mẫm nó.

Phần lưu trữ

 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.

THỰC TRẠNG

 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"

Quy tắc phân lớp

Vấn đề với cách tiếp cận của bạn là mẫu phù hợp với phần Máy chủ thứ nhất không khớp với phần 2. Tôi thường làm một cái gì đó như thế này:

Host *
 User myuser
 IdentityFile ~/.ssh/myidentity


Host blah
 HostName complicated.hostname.com

Một điều mà mọi người thường không tuân theo các quy tắc này là họ có thể lặp lại. Vì vậy, những gì tôi thường làm là có nhiều phần và tôi chia chúng ra bằng cách sử dụng Host *.

Host *
 User user1

Host blah1
 HostName complicated1.hostname.com

Host blah2
 HostName complicated2.hostname.com

Host *
 User user2

3
Trong ví dụ của bạn, "user2" được đặt như thế nào? Tôi nghĩ rằng giá trị thu được đầu tiên cho một máy chủ được sử dụng, vì vậy mọi máy chủ sẽ khớp với khối đầu tiên và có "user1" được đặt không?
jdm

@jdm - Các quy tắc lưu trữ xuất hiện sau lần thứ 2 Host *được khớp sẽ sử dụng user2 làm người dùng mặc định của họ, trừ khi chính họ chỉ định rõ ràng.
slm

@slm: Tôi thực sự thấy rằng không hoạt động. Nếu bạn xâu chuỗi hai Máy chủ * Người dùng xxx và sau đó Máy chủ * Người dùng yyy, quy tắc tiếp theo sẽ là sử dụng "xxx" - trừ khi tôi đang làm gì đó sai.
Jérémie

@slm, ví dụ của bạn không hoạt động. Tại thời điểm thứ 2 Host *đạt được quy tắc 'đầu tiên thu được giá trị cho mỗi tham số được sử dụng', do đó, điều này và tất cả các Userđịnh nghĩa sau đây đều bị bỏ qua. Một ngoại lệ từ quy tắc này là IdentityFiletừ khóa, btw.
maxschlepzig

5

SSH áp dụng tất cả các phần khớp với tên máy chủ như được cung cấp trên dòng lệnh (nghĩa là các HostNamequy tắc mà nó gặp phải không ảnh hưởng đến việc kiểm tra các điều kiện tiếp theo). Nếu CanonicalizeHostnameđược bật, nó sẽ áp dụng lại các tệp cấu hình một lần nữa khi kết thúc, sử dụng tên máy chủ được cập nhật. (Một số phiên bản SSH đã làm điều này bất kể CanonicalizeHostnamevà ví dụ của bạn sẽ hoạt động với các phiên bản đó; nhưng đó được coi là lỗi của các nhà phát triển SSH. Xem # 2267. )

Điều đó có nghĩa là bạn có thể sử dụng CanonicalizeHostnameđể làm cho ví dụ của bạn hoạt động, bằng cách thêm

Host *
  CanonicalizeHostname yes
  CanonicalizeFallbackLocal no

sẽ không thực hiện bất kỳ quy chuẩn nào nhưng sẽ cho phép thực hiện lần thứ hai với tên máy chủ được cập nhật. (Lưu ý rằng nó vẫn sẽ không làm cho phân tích cú pháp cấu hình thành "đệ quy", chỉ cần lặp lại một lần. Vì vậy, nếu bạn thay đổi tên máy chủ hai lần, điều đó sẽ không hoạt động.)


1
Gần đây tôi đã nâng cấp Ubuntu 14.04 lên 16.04 và gặp phải lỗi này. Câu trả lời này là hoàn hảo; nó đưa tôi trở lại hành vi ban đầu. Cảm ơn!
Brian Malehorn

ugh # 2267 có nghĩa là Host nickname; Hostname hostnamekhổ thơ không còn có thể cung cấp biệt danh. Nó sẽ hoạt động nếu bạn thêm CanonizalizeHostname yestừ khóa vào mỗi khối biệt danh, nhưng điều đó làm tăng gấp đôi kích thước của các khối biệt danh và trông xấu xí.
studog

1

Từ trang người đàn ông

Đối với mỗi tham số, giá trị thu được đầu tiên sẽ được sử dụng. Các tệp cấu hình chứa các phần được phân tách bằng thông số kỹ thuật của 'Máy chủ' và phần đó chỉ được áp dụng cho các máy chủ khớp với một trong các mẫu được đưa ra trong thông số kỹ thuật. Tên máy chủ phù hợp là tên được đưa ra trên dòng lệnh.

Vì giá trị thu được đầu tiên cho mỗi tham số được sử dụng, nên khai báo cụ thể hơn về máy chủ ở gần đầu tệp và mặc định chung ở cuối.

Hãy thử chuyển đổi thứ tự của các mục của bạn.


Thật không may, việc chuyển đổi thứ tự của các mục không hoạt động (đó thực sự là thứ tự tôi đã sử dụng ban đầu).
Jérémie

Nếu có nhiều định nghĩa Máy chủ khớp với tên máy chủ bạn đang kết nối, tất cả các tham số được xác định trong tất cả chúng sẽ được hợp nhất thành một định nghĩa duy nhất. Khi nó nói "giá trị thu được đầu tiên", nó nói về những thứ ở cấp độ tham số, không phải ở cấp độ Máy chủ. Điều này là phản trực giác nếu bạn nghĩ rằng mỗi khối Máy chủ là một định nghĩa.
Giovanni Tirloni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.