Tại sao lệnh ssh không theo RFC trên URI?


9

RFC:

trình bày SSH URI như sau:

ssh://[<user>[;fingerprint=<host-key fingerprint>]@]<host>[:<port>]

Có bất kỳ lý do đã biết tại sao lệnh ssh OpenSSH không tuân theo tiêu chuẩn này với tùy chọn tên máy chủ không? Nó không chấp nhận một cổng sau một dấu hai chấm.

Ví dụ về một URI mà tôi đang mong đợi hoạt động:

$ ssh user@host:2222
ssh: Could not resolve hostname host:2222: Name or service not known

Tôi nghĩ @ MichaelKjorling là chính xác. Dấu hai chấm là ranh giới nơi tên máy chủ dừng lại và đường dẫn bắt đầu trên máy chủ đó. Bạn cần sử dụng công -ptắc để truyền tải một cổng thay thế.
slm

6
Đó không phải là RFC, đó là một dự thảo chưa được thực hiện từ năm 2006.
Stéphane Chazelas

Tôi đồng ý rằng rfc3986 sẽ thích hợp hơn để trích dẫn.
Tomasz Wasiluk

Câu trả lời:


5

sshtrước định dạng URI tổng quát hơn ( 1998 ) trong vài năm (1995 IIRC).


Vì vậy, bạn đang nói rằng dự thảo RFC 1738 được xuất bản vào tháng 12 năm 1994 không thể ảnh hưởng đến sự phát triển OpenSSH? OpenSSH lần đầu tiên xuất hiện trong OpenBSD 2.6 và bản phát hành di động đầu tiên được thực hiện vào tháng 10 năm 1999 sau Wikipedia . Trừ khi nó phải tương thích với các công cụ ssh.com?
Tomasz Wasiluk

RFC 1738 dành cho các URL và trong hồi ức của tôi không phải là một định dạng chung chung và sau đó được khái quát hóa trong các URI. openssh muộn hơn nhiều so với ssh, tôi không nhớ đã thực hiện quá trình chuyển đổi nên rất có thể chúng là dòng lệnh tương thích ở mức độ lớn.
Anthon

14

Ban đầu tôi đã đăng bài này như một bình luận, nhưng sẽ đưa ra một chút như một câu trả lời.

OpenSSH chứa một số tiện ích, trong số đáng chú ý nhất là sshscp. Mặc dù sshsẽ chỉ kết nối với một máy tính từ xa (và có thể thực thi một lệnh trên máy tính từ xa đó), các phần khác của OpenSSH như scpcó một cú pháp hơi khác. Do tất cả là một phần của bộ OpenSSH, những thứ này có thể chia sẻ rất nhiều mã.

Với scp, bạn chỉ định một tệp từ xa trên biểu mẫu bộ ba user@host:remotefilename, trong đó remotefilenamecó thể là đường dẫn tương đối hoặc tuyệt đối.

Nếu phần máy chủ được cho phép ở trên biểu mẫuhost:port , điều này sẽ tạo ra sự mơ hồ tiềm ẩn: có jdoe@host.example.com:2222đề cập đến ~jdoe/2222host.example.com khi kết nối trên cổng tiêu chuẩn hoặc không đề cập đến việc không có tệp nào (hoặc tệ hơn ~jdoe) host.example.com khi kết nối qua cổng 2222?

Cú pháp URI mà bạn trình bày bị hạn chế hơn về những gì nó có thể diễn đạt (nó không cho phép đặc tả tên tệp) và quan trọng hơn, không bao giờ có thể có sự mơ hồ trừ khi tên máy chủ thực tế bao gồm một :(mà tôi không nghĩ thậm chí có thể có trong DNS và chắc chắn không được thực hiện phổ biến, trong khi tên tệp tất cả số không phải là bất thường).

Khi SSH ban đầu được phát triển , nó được phát triển như một sự thay thế thả xuống an toàn hơn cho bộ công cụ RSH / rlogin trước đó. Tôi không biết cú pháp dòng lệnh nào đã có từ đầu những năm 1990 (RFC mô tả rlogin là RFC 1282 từ tháng 12 năm 1991 , dự đoán tài liệu bạn trích dẫn khoảng 15 năm), nhưng có vẻ không hợp lý đoán rằng nó đã sử dụng một cú pháp rất giống nhau vì tên người dùng được truyền đặc biệt trong giao thức rlogin. Trích dẫn RFC 1282:

Khi thiết lập kết nối, máy khách sẽ gửi bốn chuỗi kết thúc null đến máy chủ. Đầu tiên là một chuỗi rỗng (nghĩa là nó chỉ bao gồm một byte 0 đơn), theo sau là ba chuỗi không null: tên người dùng máy khách, tên người dùng máy chủ , và loại tốc độ và thiết bị đầu cuối. Nói rõ hơn: ...

Tên người dùng cục bộ có thể được lấy thông qua các cơ sở hệ thống khác nhau, nhưng tên người dùng từ xa phải được chỉ định rõ ràng bằng cách nào đó . Ngoài việc @thường được phát âm là "at" và do đó là một lựa chọn khá tự nhiên để bắt đầu, user@hostánh xạ tốt đến cú pháp được thiết lập cho ví dụ như gửi email (so sánh địa chỉ SMTP của user@host, nơi hostcó thể là máy chủ thực tế hoặc tên DNS với bản ghi MX cho một máy chủ thực tế), vì vậy nó có thể là một lựa chọn dễ dàng hơn là tạo ra một cái gì đó mới.

Cũng đáng chú ý những gì Stephane Chazelas đã chỉ ra trong một bình luận : tài liệu mà bạn đề cập không phải là RFC, đây là một bản nháp bảy năm tuổi, được đánh giá bởi một tìm kiếm nhanh của Google để xác nhận, dường như chưa bao giờ được đưa ra khỏi mặt đất . Điều đó xảy ra tất cả các thời gian; một cái gì đó được đề xuất, nhưng không thu hút được sự hỗ trợ để thực sự biến nó thành một RFC (và thậm chí nhiều, nhiều RFC là không chuẩn).


1
Tôi đoán câu hỏi của tôi phải là "Tại sao các tiện ích OpenSSH không tuân theo các tiêu chuẩn URI chung?". Trong khi tôi đánh giá cao cái nhìn sâu sắc của bạn, nó đã không trả lời câu hỏi của tôi.
Tomasz Wasiluk

Quan điểm lịch sử +1 rất hữu ích trong việc lập biểu đồ biển tiêu chuẩn hỗn loạn
msw

Để mở rộng nhận xét "nhiều RFC là không chuẩn", điều này không thể xa hơn sự thật. Bản chất của RFC là "Yêu cầu Nhận xét"; nó chỉ đơn thuần là thông tin. Nó có thể là một ghi chú, một bản ghi nhớ hoặc tài liệu. Một RFC chỉ là một bản ghi nhớ được xuất bản; RFC đơn giản cũng là một trong nhiều cách tài liệu tiêu chuẩn được công bố, mặc dù đây không phải là mục đích duy nhất của RFC. Một tiêu chuẩn có thể được ghi lại qua RFC, nhưng RFC không phải lúc nào cũng là tài liệu cho một tiêu chuẩn cụ thể. Một quả chuối là một loại trái cây, nhưng không phải tất cả các loại trái cây đều là chuối.
Xoay
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.