Làm thế nào để bạn sao chép khóa công khai vào máy chủ ssh?


33

Đây là những gì tôi đã thử và tôi đã gặp một lỗi:

$ cat /home/tim/.ssh/id_rsa.pub | ssh tim@just.some.other.server 'cat >> .ssh/authorized_keys'
Password: 
cat: >>: No such file or directory
cat: .ssh/authorized_keys: No such file or directory

Tại sao không làm điều đó trong hai bước? Sao chép nó qua và sau đó nối nó?
Faheem Mitha

@FaheemMitha: Điều đó hiệu quả, cảm ơn! Tôi thực sự có thể nhận ra nguyên nhân của rắc rối. Xin vui lòng xem bài viết mới của tôi ?
Tim

Với tham số -f bạn không cần khóa riêng, vì vậy bạn chỉ có thể chuyển khóa cho họ chỉ với khóa chung của ai đó!
Kzqai

Câu trả lời:


67

OpenSSH đi kèm với một lệnh để làm điều này , ssh-copy-id. Bạn chỉ cần cung cấp cho nó địa chỉ từ xa và nó thêm khóa công khai của bạn vào authorized_keystệp trên máy từ xa:

$ ssh-copy-id tim@just.some.other.server

Bạn có thể cần sử dụng -icờ để xác định khóa công khai trên máy cục bộ của mình:

$ ssh-copy-id -i ~/.ssh/id_rsa.pub tim@just.some.other.server

1
Cảm ơn! Tại sao lệnh của tôi không hoạt động?
Tim

@Tim Câu trả lời này đã giải thích nó; >>được xử lý bởi trình bao của bạn và bạn đang chạy lệnh thông qua SSH thay vì thông qua trình bao. Bản sửa lỗi của anh ta về việc SSH chạy shell, sau đó chạy lệnh của bạn, sẽ hoạt động
Michael Mrozek

Cảm ơn! (1) ssh-copy-id cũng không hoạt động. Tôi tự sao chép tệp vào điều khiển từ xa và nối thêm nội dung của nó, sau đó nó hoạt động. Tôi tự hỏi tại sao lại thế này? Tôi thấy rằng trình bao mặc định của tôi trên máy chủ là một số tập lệnh mà tôi cập nhật lên bài viết gốc của mình và có thể là lý do. Xin hãy xem. (2) Tôi tự hỏi nếu ssh-copy-id chỉ sao chép khóa chung vào điều khiển từ xa, nó không tạo khóa riêng và khóa chung, phải không?
Tim

1
Giả sử máy chủ SSH được cấu hình theo cách nó chỉ chấp nhận xác thực khóa chung làm cơ chế xác thực. Trong trường hợp đó, sử dụng ssh-copy-idsẽ không hoạt động, phải không?
Abdull

1
@Abdull Không trừ khi bạn đã có một số phím khác trên máy đó để kết nối. Nó chỉ kết nối qua SSH
Michael Mrozek

31

Bạn luôn có thể làm một cái gì đó như thế này:

scp ~/.ssh/id_rsa.pub user@remote.example.com:/tmp/id_rsa.pub
ssh user@remote.example.com 
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

Tôi không chắc chắn nếu bạn có thể cattừ một máy cục bộ vào một phiên ssh. Chỉ cần di chuyển nó đến / tmp như đề xuất.

Chỉnh sửa: Đây là chính xác những gì ssh-copy-idlàm. Đúng như Michael nói.


Cảm ơn! Tôi tự hỏi nếu ssh-copy-id chỉ là sao chép khóa chung vào điều khiển từ xa. Nó không tạo khóa riêng và khóa chung, phải không?
Tim

Không, nó không tạo ra nó. Chỉ cần thêm nó.
Ông Khỉ

@ Mr.Monkey Có, bạn có thể chuyển dữ liệu vào một phiên ssh (từ cathoặc nếu không). Những gì bạn đang mô tả là cách thức lỗi thời; ssh-copy-idđược khuyến nghị vì có ít rủi ro về lỗi chính tả hoặc cho phép các tệp sai.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles, Không phải lúc nào bạn cũng có quyền truy cập vào máy chủ, đặc biệt là khi bạn chuẩn bị máy tính cho hoạt động của nó, vì vậy phương pháp này tốt hơn nhiều so với sử dụng ssh-cpy-id vì bạn không cần phải lấy thiết bị hoặc kết nối với mạng trước khi cài đặt.
điện tử

1
Hoặc bạn chỉ có thể đường ống trực tiếp đến đích : cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> ~/.ssh/authorized_keys'.
Pablo A

7

Câu trả lời này mô tả cách làm cho cách dự định được hiển thị trong câu hỏi hoạt động.

Bạn có thể thực thi một shell trên máy tính từ xa để diễn giải ý nghĩa đặc biệt của >>toán tử chuyển hướng:

ssh tim@just.some.other.server sh -c "'cat >> .ssh/authorized_keys'" < /home/tim/.ssh/id_rsa.pub

Toán tử chuyển hướng >>thường được giải thích bởi một vỏ.

Khi bạn thực thi ssh host 'command >> file'thì nó không được đảm bảo command >> filesẽ được diễn giải bằng shell. Trong trường hợp của bạn command >> fileđược thực thi thay vì shell mà không có giải thích đặc biệt và >>được trao cho lệnh dưới dạng đối số - giống như cách chạy command '>>' filetrong shell.

Một số phiên bản SSH (OpenSSH_5.9) sẽ tự động gọi shell trên máy chủ từ xa và truyền (các) lệnh cho nó khi chúng phát hiện các mã thông báo được giải thích bởi shell như ; > >>v.v.


3

opensshkhông cung cấp ssh-copy-id. Trình tự sẽ là:

  • Tạo khóa 4k khá

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa4k
    
  • Bắt đầu đại lý ssh của bạn và hút thông tin như SSH_AGENT_PID, vv

    ssh-agent -s > ~/mysshagent
    source ~/mysshagent
    rm ~/mysshagent
    
  • Bây giờ hãy bắt đầu tải khóa vào Tác nhân SSH của bạn

    ssh-add ~/.ssh/id_rsa4k
    
  • Kiểm tra xem nó đã được tải chưa

    ssh-add -l
    ssh-add -L
    

    Điều này sẽ cho bạn thấy những gì bạn có trong ssh-agent

  • Bây giờ thực sự SSH đến một hệ thống từ xa

    ssh username@remotehost.network
    
  • Bây giờ bạn có thể chạy ssh-copy-id mà không có đối số:

    ssh-copy-id
    

    Điều này tạo ~/.ssh/authorized_keysvà điền vào thông tin cơ bản được yêu cầu từ ssh-agent.


BTW, tôi đã tạo một tập lệnh nhỏ tại github.com/centic9/generate-and-send-ssh-key chạy hầu hết các bước này trong một lần và cũng đảm bảo quyền truy cập tệp / thư mục thường khiến tôi đau đầu ...
centic

Đây là một phương pháp tuyệt vời để sử dụng khi đăng nhập mật khẩu bị vô hiệu hóa. Nó cho phép thêm khóa mới trong khi xác thực bằng khóa trước.
MountainX

1

Tôi gặp rắc rối với ssh-copy-id khi chọn một cổng khác ngoài 22 ... vì vậy đây là oneliner của tôi với một cổng ssh khác (ví dụ 7572):

ssh yourServer.dom -p7572 "mkdir .ssh; chmod 700 .ssh; umask 177; sh -c 'cat >> .ssh/authorized_keys'" < .ssh/id_rsa.pub

0

Thật vậy , the ssh-copy-idlệnh thực hiện chính xác điều này (từ openssh-clientgói):

ssh-copy-id user@host

Lưu ý:
hostcó nghĩa là địa chỉ IP hoặc tên miền .


Tôi cũng muốn thêm một số thông tin bổ sung vào đây

1) Chúng tôi có thể chỉ định một cổng khác cho SSH trên máy chủ đích:

ssh-copy-id "-p 8127 user@host"

Lưu ý:
Các cảng phải ở phía trước của user@hosthoặc nó sẽ không giải quyết được.

Nguồn

2) Chúng tôi có thể chỉ định một tệp có khóa chung :

ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

Lưu ý:
Các -itùy chọn cho phép chúng tôi để chỉ ra vị trí thích hợp của tên với tập tin có chứa khóa công khai.

Đôi khi nó có thể có ích, đặc biệt nếu chúng tôi lưu trữ nó ở một vị trí không chuẩn hoặc chúng tôi có nhiều hơn một khóa công khai trên máy tính của chúng tôi và chúng tôi muốn chỉ ra một khóa cụ thể.

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.