Làm cách nào để thêm khóa riêng với ssh-add trên Ubuntu? [đóng cửa]


474

Tôi có một khóa riêng được bảo vệ bằng mật khẩu để truy cập máy chủ thông qua SSH.

Tôi có 2 máy linux (ubfox 10.04) và hành vi của lệnh ssh-add là khác nhau ở cả hai máy.

Trong một máy, một khi tôi sử dụng "ssh-add .ssh / id" và nhập mật khẩu của mình, khóa sẽ được thêm vĩnh viễn, tức là mỗi lần tôi tắt máy tính và đăng nhập lại, khóa đã được thêm.

Mặt khác, tôi phải thêm khóa mỗi lần tôi đăng nhập.

Theo tôi nhớ, tôi đã làm điều tương tự trên cả hai. Sự khác biệt duy nhất là khóa được tạo trên khóa được thêm vĩnh viễn.

Có ai biết làm thế nào để thêm nó vĩnh viễn vào máy khác không?


1
các đại lý chỉ là tạm thời; nhưng có thể bạn có lệnh ssh-add ở đâu đó trong ~ / .bashrc hoặc tương tự trên một trong cả hai máy
mirek

Câu trả lời:


632

Một giải pháp sẽ là buộc các tệp chính được lưu giữ vĩnh viễn, bằng cách thêm chúng vào ~/.ssh/configtệp của bạn :

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer

Nếu bạn không có tệp 'config' trong thư mục ~ / .ssh, thì bạn nên tạo một tệp. Nó không cần quyền root, vì vậy chỉ cần:

nano ~/.ssh/config

... Và nhập các dòng trên theo yêu cầu của bạn.

Để làm việc này, tập tin cần phải có chmod 600. Bạn có thể sử dụng lệnh chmod 600 ~/.ssh/config .

Nếu bạn muốn tất cả người dùng trên máy tính sử dụng phím, hãy đặt những dòng này vào /etc/ssh/ssh_config và khóa trong một thư mục có thể truy cập được cho tất cả mọi người.

Ngoài ra, nếu bạn muốn đặt khóa cụ thể cho một máy chủ, bạn có thể thực hiện các thao tác sau trong ~ / .ssh / config:

Host github.com
    User git
    IdentityFile ~/.ssh/githubKey

Điều này có lợi thế khi bạn có nhiều danh tính mà máy chủ không từ chối bạn vì trước tiên bạn đã thử nhận dạng sai. Chỉ có danh tính cụ thể sẽ được thử.


82
Quyền trên tệp cấu hình phải là 600.chmod 600 config
generalopinion

6
Tôi phải nhập mật khẩu cho mỗi lần đẩy, tìm nạp hoặc sao chép với điều này, làm cách nào để tránh điều đó?
Asaf

9
Sử dụng thay thế ssh-add ~/.ssh/gitHubKey, nó sẽ ghi nhớ mật khẩu chính của bạn. Giải pháp tôi đề xuất là đặt nó vĩnh viễn trên các lần khởi động lại.
daminetreg

28
Câu trả lời này tốt đến mức không nên tồn tại ssh-add. Ai muốn có một lệnh "tạm thời" khắc phục sự cố và bị hỏng bất ngờ khi bạn chỉ có thể chỉnh sửa tệp cấu hình vĩnh viễn.
RussellStewart

2
Vấn đề là với loại cấu hình này, nếu bạn không thực hiện nó trong .ssh / config cho một Máy chủ cụ thể, bạn sẽ nhận được tất cả khóa được thử đối với tất cả máy chủ mỗi lần.
daminetreg

118

Điều này đã không trả lời cùng một vấn đề cho tôi theo Mac OS X Lion. Tôi đã kết thúc thêm:

ssh-add ~/.ssh/id_rsa &>/dev/null

Đối với .zshrc của tôi (nhưng .profile cũng sẽ ổn thôi), dường như đã sửa nó.

(Như được đề xuất ở đây: http://geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/ )


6
Đây là cách tôi nghĩ tốt hơn giải pháp tôi đề xuất, vì ssh-add sử dụng một tác nhân xác thực có thể nhớ cụm mật khẩu của khóa riêng được bảo vệ, do đó bạn không cần phải nhập nó mỗi khi bạn cố gắng xác thực. Một ưu điểm khác của giải pháp mà bạn đề xuất là nếu bạn có nhiều khóa, máy khách ssh sẽ không đề xuất các khóa không liên quan cho máy chủ mà bạn cố gắng kết nối, thực sự nó sẽ chỉ cung cấp các khóa dành cho máy chủ này và đã thắng ' T dẫn đến máy chủ từ chối kết nối vì đạt được MaxAuthTries, trong khi thử tất cả các khóa được liệt kê trong ssh / config.
daminetreg

1
Cảm ơn @daminetreg. Vấn đề cụ thể của tôi là cần truy cập gitosis trên máy phát triển mà không chuyển khóa riêng của tôi sang nó. Giải pháp này (cùng với việc thêm ForwardAgent yesvào của tôi .ssh/config) đã giải quyết vấn đề đó một cách tuyệt vời. Hóa ra, nó có thể giống ssh-add &>/dev/nullnhư hành vi mặc định ssh-adddường như là thêm các khóa tìm thấy trong .sshthư mục của bạn .
Aaron

1
Tôi hiểu rằng có một công tắc -K trong Mac OS: stackoverflow.com/questions/1909651/
mẹo

3
@TNick -Kthêm khóa vào móc khóa của OS X, mà GUI OS X sử dụng để xác thực với máy chủ nước ngoài. Người đăng trong Q đang kết nối thông qua Đường hầm SSH, nhưng vẫn chỉ kết nối với máy chủ từ xa. A - [Đường hầm SSH] -> B Trường hợp tôi tham gia là tôi đang ở trên một máy chủ từ xa nhưng muốn xác thực chống lại thông tin đăng nhập trên hệ thống nhà của tôi. A <- [Auth] - B - [Kết nối] -> C Vì vậy, -Kkhông thực sự có ích, nhưng là một giải pháp tuyệt vời cho Q. khác
Aaron

112

Tôi đã giải quyết vấn đề đó trên Mac OSX (10.10) bằng cách sử dụng tùy chọn -K cho ssh-add:

ssh-add -K ~/.ssh/your_private_key

Đối với macOS 10.12 trở lên, bạn cần chỉnh sửa thêm cấu hình ssh của mình như được mô tả tại đây: https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain


3
đây là một câu trả lời tốt hơn cho những người muốn đặt nó vĩnh viễn
punkrockpolly

12
Do đó bit này: "trên Mac OSX (10.10)" ...
Andrew K.

1
Điều này tốt và hoạt động trên Mac OSX, nhưng không hoạt động trên Ubuntu (14.04 trong thử nghiệm của tôi).
haxpor

5
Điều này không hiệu quả với tôi (trên OSX 10.12.4)
guptron

2
Theo man ssh-addmacOS High Sierra, ssh-add -Ksẽ lưu cụm mật khẩu vào móc khóa và sau khi khởi động lại, chỉ cần sử dụng ssh-add -A, không cần bạn nhập cụm mật khẩu.
DawnSong

36

Chỉ cần thêm móc khóa, như được tham chiếu trong Mẹo nhanh về Ubuntu https://help.ubfox.com/community/QuickTips

Thay vì liên tục khởi động ssh-agent và ssh-add, có thể sử dụng móc khóa để quản lý các khóa ssh của bạn. Để cài đặt móc khóa, bạn chỉ cần nhấp vào đây hoặc sử dụng Synaptic để thực hiện công việc hoặc apt-get từ dòng lệnh.

Dòng lệnh

Một cách khác để cài đặt tệp là mở thiết bị đầu cuối (Ứng dụng-> Phụ kiện-> Thiết bị đầu cuối) và gõ:

sudo apt-get install keychain

Chỉnh sửa tập tin

Sau đó, bạn nên thêm các dòng sau vào $ {HOME} /. Bashrc hoặc /etc/bash.bashrc:

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh

Chính xác thì lệnh thứ hai làm gì, vì tò mò? Điều này chỉ mở quyền cho người dùng hiện tại?
Vincent Buscarello

1
Đây .là bí danh chosource
Brad Solomon

18

Tôi đã thử giải pháp của @ Aaron và nó không hiệu quả với tôi, vì nó sẽ thêm lại các khóa của tôi mỗi khi tôi mở một tab mới trong thiết bị đầu cuối của mình. Vì vậy, tôi đã sửa đổi nó một chút (lưu ý rằng hầu hết các khóa của tôi cũng được bảo vệ bằng mật khẩu để tôi không thể gửi đầu ra tới / dev / null):

added_keys=`ssh-add -l`

if [ ! $(echo $added_keys | grep -o -e my_key) ]; then
    ssh-add "$HOME/.ssh/my_key"
fi

Điều này làm là nó kiểm tra đầu ra của ssh-add -l(liệt kê tất cả các khóa đã được thêm vào) cho một khóa cụ thể và nếu nó không tìm thấy nó, thì nó sẽ thêm nó vào ssh-add.

Bây giờ, lần đầu tiên tôi mở thiết bị đầu cuối, tôi đã hỏi mật khẩu cho các khóa riêng của mình và tôi không được hỏi lại cho đến khi tôi khởi động lại (hoặc đăng xuất - tôi chưa kiểm tra) máy tính của mình.

Vì tôi có một loạt các khóa, tôi lưu trữ đầu ra của ssh-add -lmột biến để cải thiện hiệu suất (ít nhất tôi đoán nó sẽ cải thiện hiệu suất :))

PS: Tôi đang dùng linux và mã này đã chuyển đến ~/.bashrctệp của tôi - nếu bạn đang dùng Mac OS X, thì tôi giả sử bạn nên thêm nó vào .zshrchoặc.profile

EDIT: Như được chỉ ra bởi @Aaron trong các nhận xét, .zshrctệp được sử dụng từ zshshell - vì vậy nếu bạn không sử dụng nó (nếu bạn không chắc chắn, thì rất có thể, bạn đang sử dụng bashthay thế), mã này nên đi đến .bashrctập tin của bạn


3
.zshrclà cho zshvỏ, mà tôi sử dụng thay vì bash. Nếu bạn đang sử dụng bashtrên Mac OS X (mặc định), nó cũng sẽ .bashrcở đó.
Aaron

1
Sau khi ssh-add -ltrả về mã echo $?có thể được sử dụng để quyết định có thêm khóa hay không. Im máy linux của tôi với bash, ssh-add -lsẽ không xuất tên tệp chính. Mã trả về luôn hoạt động.
Bharat G

12

Trong trường hợp của tôi, giải pháp là:

Quyền trên tệp cấu hình phải là 600. chmod 600 config

Như đã đề cập trong các ý kiến ​​trên bởi generalopinion

Không cần phải chạm vào nội dung tập tin cấu hình.


Không đủ cho tôi trên Linux Mint 17.1.
Benares

Tôi không nghĩ 600 có ý nghĩa. man ssh cho chúng ta biết rằng ~/.ssh/configtập tin đọc / ghi cho người dùng và không thể ghi bởi người khác.
DawnSong

600 chỉ được đọc và viết cho người dùng
Nhiệt tình

6

Tôi gặp vấn đề tương tự trên Ubuntu 16.04: một số khóa được thêm vĩnh viễn, đối với những khóa khác tôi phải thực hiện ssh-addtrên mỗi phiên. Tôi phát hiện ra rằng các khóa được thêm vĩnh viễn có cả khóa riêng và khóa chung được đặt trong đó ~/.sshvà các khóa bị quên trên mỗi phiên chỉ có khóa riêng trong ~/.sshthư mục. Vì vậy, giải pháp rất đơn giản: bạn nên sao chép cả khóa riêng và khóa chung ~/.sshtrước khi thực hiện ssh-add.

PS: Theo như tôi hiểu từ Gnome wiki, phương pháp của tôi hoạt động nhờ vào công cụ khóa gnome, một phần của Môi trường máy tính để bàn Gnome. Do đó, phương pháp của tôi có lẽ chỉ hoạt động nếu bạn sử dụng DE dựa trên Gnome hoặc Gnome.


1
Câu trả lời không nản lòng. Điều này đã giải quyết vấn đề của tôi mà không cần các tập lệnh hoặc gói bổ sung sau khi tìm kiếm trong hai giờ.
etagenklo

Flarkin tuyệt vời! Công việc thám tử tuyệt vời. Tôi không nghĩ rằng tôi sẽ tìm ra điều này.
nicorellius

4

Thêm các dòng sau vào "~ / .bashrc" đã giải quyết vấn đề cho tôi. Tôi đang sử dụng máy tính để bàn Ubuntu 14.04.

eval `gnome-keyring-daemon --start`
USERNAME="reynold"
export SSH_AUTH_SOCK="$(ls /run/user/$(id -u $USERNAME)/keyring*/ssh|head -1)"
export SSH_AGENT_PID="$(pgrep gnome-keyring)"

3

Trên Ubuntu 14.04 (có thể sớm hơn, có thể vẫn còn), bạn thậm chí không cần bàn điều khiển:

  • bắt đầu seahorsehoặc khởi chạy thứ mà bạn thấy đang tìm kiếm "key"
  • tạo khóa SSH ở đó (hoặc nhập một khóa)
    • không cần để trống cụm mật khẩu
    • nó được cung cấp cho bạn để thậm chí đẩy khóa chung tới một máy chủ (hoặc hơn)
  • bạn sẽ kết thúc với một ssh-agent đang chạy và khóa này được tải, nhưng bị khóa
  • sử dụng sshsẽ nhận danh tính (tức là khóa) thông qua tác nhân
  • trong lần sử dụng đầu tiên trong phiên, cụm mật khẩu sẽ được kiểm tra
    • và bạn có tùy chọn tự động mở khóa khi đăng nhập
    • điều này có nghĩa là xác thực đăng nhập sẽ được sử dụng để bọc cụm mật khẩu của khóa
  • lưu ý: nếu bạn muốn chuyển tiếp danh tính của mình (tức là chuyển tiếp tác nhân) gọi bạn sshvới -Ahoặc đặt mặc định đó
    • nếu không, bạn không thể xác thực bằng phím đó trên máy bạn đăng nhập sau này sang máy thứ ba

3

Tôi chạy Ubuntu bằng hai khóa id_rsa. (một cá nhân cho công việc). ssh-add sẽ nhớ một khóa (khóa cá nhân) và quên công ty mỗi lần.

Kiểm tra sự khác biệt giữa hai cái tôi thấy khóa cá nhân của tôi có 400 quyền trong khi công ty có 600 quyền. (đã có u + w). Việc xóa người dùng ghi ngay từ khóa công ty (uw hoặc đặt thành 400) đã khắc phục sự cố của tôi. ssh-add bây giờ nhớ cả hai phím.


2

Điều này làm việc cho tôi.

ssh-agent /bin/sh
ssh-add /path/to/your/key

1

rất đơn giản ^ _ ^ hai bước

1.yum cài đặt móc khóa

2.add code bên dưới để .bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh

12
Ubuntu không có yum ngớ ngẩn;)
Adam F

1

Đối với những người sử dụng Fish shell, bạn có thể sử dụng chức năng sau đây sau đó gọi nó trong ~/.config/fish/config.fishhoặc trong một tệp cấu hình riêng biệt ~/.config/fish/conf.d/loadsshkeys.fish. Nó sẽ tải tất cả các khóa bắt đầu bằng id_rsa vào ssh-agent.

# Load all ssh keys that start with "id_rsa"
function loadsshkeys
  set added_keys (ssh-add -l)
   for key in (find ~/.ssh/ -not -name "*.pub" -a -iname "id_rsa*")
    if test ! (echo $added_keys | grep -o -e $key)
      ssh-add "$key"
    end
  end
end

# Call the function to run it.
loadsshkeys

Nếu bạn muốn ssh-agenttự động khởi động khi bạn mở một thiết bị đầu cuối, bạn có thể sử dụng tuvistavie / fish-ssh-agent để làm điều nà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.