macOS Sierra dường như không nhớ các khóa SSH giữa các lần khởi động lại


184

Tôi phải chạy lệnh này kể từ khi nâng cấp lên macOS:

ssh-add -K

Khắc phục sự cố sau khi khởi động lại nhưng tôi phải chạy lệnh này mỗi lần tôi đăng nhập vào máy tính của mình.

Nếu tôi không chạy lệnh ở trên, các phím của tôi ~/.sshsẽ bị bỏ qua và tôi đang được hỏi mật khẩu máy chủ để thiết lập kết nối.


1
$ ssh-add -Kcho tôissh-add: illegal option -- K
modius

1
Bạn sẽ cần phải nhập đường dẫn khóa riêng sau -K. Xem câu trả lời của @JakeGould để biết giải pháp.
bisherbas

Bản cập nhật 10.12.2 đã loại bỏ một số yêu cầu mật khẩu máy chủ không cần thiết đối với tôi. Bây giờ bạn có thể không còn cần chạy ssh-add -K.
Stranger Stranger

Câu trả lời:


216

Kể từ macOS Sierra 10.12.2, Apple đã thêm một ssh_configtùy chọn được gọi là UseKeychaincho phép giải quyết vấn đề 'phù hợp' với vấn đề. Thêm vào đây vào ~/.ssh/configtập tin của bạn :

Host *
   AddKeysToAgent yes
   UseKeychain yes     

Từ ssh_config mantrang ngày 10.12.2:

Sử dụng khóa

Trên macOS, chỉ định xem hệ thống có nên tìm kiếm cụm mật khẩu trong móc khóa của người dùng hay không khi cố gắng sử dụng một khóa cụ thể. Khi người dùng cung cấp cụm mật khẩu, tùy chọn này cũng chỉ định liệu cụm mật khẩu có được lưu vào móc khóa hay không khi nó được xác minh là chính xác. Đối số phải là 'có' hoặc 'không'. Mặc định là 'không'.


2
Theo liên kết này: openradar.appspot.com/27348363 Apple đã "sắp xếp lại hành vi [của họ] với OpenSSH chính thống trong lĩnh vực này".
ThomasW

15
Thật vô lý khi Apple sửa đổi hành vi theo cách sẽ gây ra vấn đề cho đại đa số các nhà phát triển (vì GitHub thúc đẩy nếu không có gì khác) và không nói gì với bất kỳ ai!
mluisbrown

9
Tôi nghĩ rằng IdentityFile ~/.ssh/id_rsanó là dư thừa và không cần thiết (khi nhìn vào các tùy chọn mặc định). Tôi chưa bao giờ đặt tùy chọn đó trong tệp cấu hình ssh của mình.
Therealmarv

9
@JakeGould IMO thay đổi ~/.ssh/config~là thích hợp hơn vì nó giải quyết vấn đề ở sshcấp độ. Không chắc chắn 100% rằng .bash_profilemod sẽ hoạt động cho các máy khách GUI sử dụng ssh mà không cần sử dụng shell.
mluisbrown

7
Apple công bố Lưu ý kỹ thuật TN2449 liên quan đến thay đổi đó.
Kentzo

106

Tôi cũng gặp vấn đề này khi cố gắng triển khai một số mã bằng Capistrano . Rất bực bội. Đây là hai phương pháp tôi biết để giải quyết vấn đề này.

Phương pháp 1: Thêm tất cả các khóa đã biết vào tác nhân SSH.

Vì vậy, một giải pháp tôi tìm thấy là chạy ssh-addvới -Atùy chọn, trong đó thêm tất cả các danh tính đã biết vào tác nhân SSH bằng cách sử dụng bất kỳ cụm mật khẩu nào được lưu trữ trong móc khóa của bạn như thế này:

ssh-add -A

Bây giờ điều này hoạt động nhưng nó sẽ không tiếp tục trên các lần khởi động lại. Vì vậy, nếu bạn muốn không bao giờ lo lắng về điều này một lần nữa, chỉ cần mở ~/.bash_profiletệp người dùng của bạn như thế này:

nano ~/.bash_profile

Và thêm dòng này vào dưới cùng:

ssh-add -A 2>/dev/null;

Bây giờ khi bạn mở một cửa sổ Terminal mới, tất cả sẽ tốt!

Phương pháp 2: Chỉ thêm các khóa SSH có trong móc khóa vào tác nhân.

Vì vậy, trong khi ssh-add -Atùy chọn nên hoạt động cho hầu hết các trường hợp cơ bản, tôi đã gặp phải một vấn đề gần đây khi tôi có 6-7 hộp Vagrant (sử dụng các khóa / nhận dạng SSH để truy cập) trên một máy phổ biến hơn id_rsa.pub.

Tóm lại, cuối cùng tôi đã bị khóa khỏi một máy chủ từ xa do có quá nhiều lần thử thất bại dựa trên các khóa / danh tính SSH vì quyền truy cập của máy chủ dựa trên mật khẩu và các khóa / danh tính SSH là các khóa / danh tính SSH. Vì vậy, nhân viên SSH đã thử tất cả các khóa SSH của tôi, không thành công và tôi thậm chí không thể nhận được lời nhắc mật khẩu.

Vấn đề là ssh-add -Asẽ chỉ tùy ý thêm mọi khóa / nhận dạng SSH duy nhất mà bạn có vào đại lý ngay cả khi không cần thiết phải làm như vậy; chẳng hạn như trong trường hợp hộp Vagrant.

Giải pháp của tôi sau nhiều thử nghiệm như sau.

Đầu tiên, nếu bạn có nhiều khóa / danh tính SSH được thêm vào đại lý của mình hơn là bạn cần có như được hiển thị ssh-add -lsau đó sẽ xóa tất cả chúng khỏi tác nhân như vậy:

ssh-add -D

Sau đó, bắt đầu tác nhân SSH làm quy trình nền như sau:

eval "$(ssh-agent -s)"

Bây giờ, nó trở nên kỳ lạ và tôi không chắc tại sao. Trong một số trường hợp, bạn có thể thêm ~/.ssh/id_rsakhóa / danh tính cụ thể vào đại lý như vậy:

ssh-add ~/.ssh/id_rsa

Nhập cụm mật khẩu của bạn, nhấn Returnvà bạn sẽ tốt để đi.

Nhưng trong các trường hợp khác, chỉ cần chạy nó là đủ để thêm khóa / danh tính:

ssh-add -K

Nếu tất cả đều hoạt động, hãy nhập ssh-add -lvà bạn sẽ thấy một khóa / danh tính SSH đơn độc được liệt kê.

Tất cả đều tốt? Bây giờ hãy mở ra .bash_profile:

nano ~/.bash_profile

Và thêm dòng này vào dưới cùng; nhận xét hoặc xóa -Aphiên bản nếu bạn có vị trí đó:

ssh-add -K 2>/dev/null;

Điều đó sẽ cho phép khóa / danh tính SSH được tải lại cho tác nhân SSH trong mỗi lần khởi động / khởi động lại.

CẬP NHẬT: Apple hiện đã thêm một UseKeychaintùy chọn cho các tùy chọn cấu hình SSH đang mở và cũng xem xét ssh-add -Amột giải pháp.

Kể từ macOS Sierra 10.12.2, Apple đã thêm UseKeychaintùy chọn cấu hình cho cấu hình SSH. Kiểm tra trang man (thông qua man ssh_config) hiển thị thông tin sau:

UseKeychain
        On macOS, specifies whether the system should search for
        passphrases in the user's keychain when attempting to use a par-
        ticular key. When the passphrase is provided by the user, this
        option also specifies whether the passphrase should be stored
        into the keychain once it has been verified to be correct.  The
        argument must be ``yes'' or ``no''.  The default is ``no''.

Việc Apple sôi sục khi thấy giải pháp là thêm ssh-add -Avào của bạn .bash_profile như được giải thích trong vé Open Radar này hoặc thêm vào UseKeychainnhư một trong các tùy chọn trong mỗi người dùng ~/.ssh/config.


4
@modius: nếu bạn có khóa được bảo vệ pw, hãy làm ssh-add -K [path to key]và nhập pw khi được nhắc. Keychain sẽ lưu mật khẩu và ssh-add sẽ lấy nó từ đó sau đó.
Timo

2
Lưu ý -A là để thêm danh tính cho tác nhân bằng cách sử dụng bất kỳ cụm mật khẩu được lưu trong móc khóa của bạn. Nếu bạn cũng có danh tính không có cụm mật khẩu, bạn sẽ cần bỏ tùy chọn -A để thêm chúng vào đại lý của mình.
Evan Pon

12
Chỉ cần thêm một chút khả năng hiển thị cho điều này, Apple đã cập nhật trang man cho ssh_config để đưa vào UseKeychainAddKeysToAgenttự động thêm các khóa của bạn từ ssh_config. Không có kịch bản shell cần thiết. Xem câu trả lời @mluisbrown bên dưới để biết thông tin cập nhật cho 10.12.2
Ryan Gibbons

1
@JakeGould Tôi hiểu những gì bạn đang nói, tôi thực sự thích những gì họ đang làm. Thay vì tự động lưu cụm mật khẩu vào Keychain và tải nó khi khởi động, chúng sẽ cho bạn quyền kiểm soát bảo mật của bạn. / nhún vai
Ryan Gibbons

1
@RyanGibbons FWIW, nhìn vào đề nghị chính thức từ Quan hệ nhà phát triển của Apple trong câu trả lời này trên OpenRadar: “Bạn có thể khắc phục điều này khá dễ dàng bằng cách chạy ssh-add -Atrong script rc của bạn nếu bạn muốn phím của bạn để luôn được nạp.” ¯\_(ツ)_/¯
JakeGould

16

Như đã giải thích ở đây , đây là phương pháp được đề xuất kể từ macOS 10.12.2 :

  1. Thêm các dòng sau vào ~/.ssh/configtập tin của bạn :

    Host *
        UseKeychain yes
        AddKeysToAgent yes
  2. Bất kỳ khóa nào bạn thêm vào ssh-agent bằng ssh-add /path/to/your/private/key/id_rsalệnh sẽ được tự động thêm vào móc khóa và sẽ được tự động tải khi khởi động lại.


Tôi đang thêm câu trả lời này vì:

  • Các câu trả lời khác yêu cầu bạn thêm IdentityFile ~/.ssh/id_rsadòng, nhưng tùy chọn đó không cần thiết để tự động tải các khóa (và nó thực sự sẽ liên kết khóa cụ thể đó cho phần máy chủ mà bạn thêm vào, bạn sẽ không muốn nếu bạn sử dụng các khóa khác nhau cho nóng khác nhau).
  • Câu trả lời được chấp nhận đề cập UseKeychain, nhưng điều đó là không đủ để duy trì các khóa ssh-agentsau khi khởi động lại.

1
Về điểm thứ hai. Làm thế nào chắc chắn là bạn? Không có gì thực sự xảy ra khi khởi động lại và nó cũng không được đề cập trong tài liệu tham khảo của bạn. Điều xảy ra với cấu hình trên là máy khách SSH của bạn sẽ tải khóa vào tác nhân khi kết nối lần đầu (và nó cũng sẽ lấy cụm mật khẩu từ móc khóa), sau đó khóa sẽ được tải. Bạn có thể xác minh tuyên bố này bằng cách liệt kê các khóa ngay sau khi khởi động lại thông qua ssh-add -Lvà nó sẽ báo cáo The agent has no identities. Không có gì sẽ ở đó cho đến khi bạn kết nối. Các AddKeysToAgentphím không tồn tại giữa các lần khởi động lại theo bất kỳ cách nào!
Danila Vershinin

15

Tôi đã viết một bài viết ngắn về chủ đề này có thể giúp bạn.

Một giải pháp là gọi ssh-add -Alệnh trên mỗi lần khởi động.

Chỉ cần thêm .plisttệp có nội dung sau vào đường dẫn ~/Library/LaunchAgents/hoặc tạo tệp có ứng dụng Lingon :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>ssh-add-a</string>
    <key>ProgramArguments</key>
    <array>
        <string>ssh-add</string>
        <string>-A</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

<!-- @@@@LingonWhatStart:ssh-add -A@@@@LingonWhatEnd -->

8

Kể từ macOS 10.12.2, bạn có thể sử dụng UseKeychaintùy chọn. Đọc thêm ở đây hoặc nhìn vào man ssh_config.

     UseKeychain
         On macOS, specifies whether the system should search for passphrases in the user's keychain
         when attempting to use a particular key. When the passphrase is provided by the user, this
         option also specifies whether the passphrase should be stored into the keychain once it has
         been verified to be correct.  The argument must be ``yes'' or ``no''.  The default is ``no''.

Vì vậy, chỉ cần làm như sau:

echo "UseKeychain yes" >> ~/.ssh/config


1
Sử dụng >>có nguy cơ nếu bạn nhập lệnh nhiều lần. Tốt hơn nên làm một phiên bản thủ công của tệp, như được mô tả bởi câu trả lời mluisbrown hoặc câu trả lời của ChrisJF .
Cœur

Bạn đang ở ngay đó :-)
Ben

4

Tôi thấy rằng ssh-add -Kđã cho tôi " tùy chọn bất hợp pháp - K ". Điều này là do ssh-add là một phiên bản lạ đến từ / usr / local / bin (được cài đặt bởi brew?). Tôi đã có thể thêm khóa bằng cách sử dụng cụ thể của ssh-add nằm trong / usr / bin:

/usr/bin/ssh-add -K ~/.ssh/id_rsa

đây là những gì làm việc cho tôi sau khi không làm việc dễ dàng trong nhiều năm.
nyxee

4

Tôi đã có vấn đề này trước đây và tôi đã tìm ra cách để vượt qua điều này. Tôi vừa tạo một tệp có tên configtrong ~/.sshthư mục của mình , nơi tôi đã thêm các dòng sau:

Host github.com
HostName github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes

Tôi không chắc tại sao, nhưng HostHostNamecả hai đều quan trọng. Trong trường hợp của tôi nếu một trong số họ không có mặt thì giải pháp đã không hoạt động.

Sau đó, tôi chỉ làm một ssh-add -Kvà nó đã hoạt động ngay cả sau khi khởi động lại.


1
Máy chủ là tên / bí danh do người dùng xác định cho một máy chủ cụ thể và phân định các mục nhập trên mỗi máy chủ: về mặt phong cách, thật tuyệt khi thụt dòng theo sau mục Máy chủ. HostName cho biết tên địa chỉ mạng của máy chủ như github.com, nhưng bạn cũng có thể sử dụng địa chỉ IP. Host và HostName không phải là cùng một thứ, nhưng vâng, cả hai đều không thể tách rời với định dạng cấu hình ssh.
Đánh dấu Fox

4

Nếu bạn đang sử dụng một phiên bản khác của ssh (ví dụ: được cài đặt qua homebrew), các giải pháp trên sẽ không hoạt động. Chẳng hạn, AddKeysToAgent yesUseKeychain yestrong .ssh/configtệp không được nhận dạng bởi các phiên bản ssh không phải của Apple và sẽ gây ra lỗi. Tương tự cho -Ahoặc -Ktùy chọn cho sshkhách hàng.

Điều đó có nghĩa là câu trả lời của @mluisbrown hoàn toàn không hoạt động. Bạn có thể sử dụng phương pháp 1 trong câu trả lời của @JakeGould và sử dụng rõ ràng ssh-addtiện ích macOS trong của bạn .bash_profileđể thêm tất cả các khóa vào móc khóa, tức là:

/usr/bin/ssh-add -A

Như đã đề cập bởi một nhận xét ở trên , trước tiên bạn có thể phải thêm khóa vào móc khóa: vd/usr/bin/ssh-add -K .ssh/github


2

Sửa đổi ~ / .ssh / config để thêm UseKeyChain cho tất cả các máy chủ là đủ để ngăn cơn ác mộng tái diễn này;)

Host *
 UseKeychain yes

Nếu tệp trống hoặc không tồn tại, hãy tạo và / hoặc thêm cấu hình ở trên.


1

Tôi đã cập nhật lên Mac OS X Sierra (10.12.6). Tôi có thể ssh vào các máy chủ khác nhưng không vào github.com.

Đây là những gì tôi đã phải chèn vào ~ / .ssh / config:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

Sau thay đổi đó, tôi có thể sử dụng github như trước đây.

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.