Làm thế nào để làm cho ssh-agent tự động thêm khóa theo yêu cầu?


51

Tôi muốn chạy ssh-agent (với tùy chọn trọn đời tối đa), nhưng không thêm bất kỳ khóa nào khi khởi động, mà thay vào đó hãy thêm chúng theo yêu cầu.

Giống như lần đầu tiên tôi đăng nhập vào một số máy chủ, nó sẽ yêu cầu mật khẩu, lần sau (trừ khi tôi đợi hơn một giờ), nó sẽ kết nối sạch sẽ:

ssh server1
Enter passphrase for key '/home/vi/.ssh/id_dsa':
server1> ...

ssh server2
server2> # no passphrase this time

# wait for lifetime

ssh server2
Enter passphrase for key '/home/vi/.ssh/id_dsa':

Tôi không muốn nhớ thủ công về việc chạy 'ssh-add' mỗi lần. (ví dụ: nhập cụm mật khẩu chỉ cho ssh và "Ồ, nó không nhớ, cần phải gõ lại").

Làm cách nào để định cấu hình ssh để tự động thêm khóa vào ssh-agent nếu người dùng cung cấp cụm mật khẩu?


Câu trả lời:


58

ssh hỗ trợ thêm khóa vào tác nhân trong lần sử dụng đầu tiên (kể từ phiên bản 7.2). Bạn có thể kích hoạt tính năng đó bằng cách đưa các mục sau vào ~/.ssh/config:

AddKeysToAgent yes

Điều này cũng hoạt động khi sử dụng các công cụ phái sinh, chẳng hạn như git.

Từ thay đổi 7.2 :

  • ssh (1): Thêm tùy chọn máy khách AddKeysToAgent có thể được đặt thành 'có', 'không', 'hỏi' hoặc 'xác nhận' và mặc định là 'không'. Khi được bật, một khóa riêng được sử dụng trong quá trình xác thực sẽ được thêm vào ssh-agent nếu nó đang chạy (với xác nhận được bật nếu được đặt thành 'xác nhận').

Điều này đòi hỏi một tác nhân ssh để được chạy. Tham khảo stackoverflow.com/a/24347344/4573065 + nhận xét của nó để biết cách tốt để bắt đầu nó (chỉ một lần).
ST-DDT

18

Bạn có thể gian lận và đặt một cái gì đó như alias ssh='ssh-add -l || ssh-add && ssh'trên .bashrc/ .profile. Lần chạy đầu tiên này ssh-add -l, có thể trả về 0 (có các khóa trên tác nhân), 1 (không có khóa) hoặc 2 (không có tác nhân nào đang chạy); nếu nó trả về 0, sshsẽ chạy; nếu 1, ssh-addsẽ chạy và sau đó ssh; nếu 2, ssh-addsẽ thất bại và sshsẽ không được chạy. Thay thế &&bằng ;nếu bạn muốn sshchạy ngay cả khi không có tác nhân nào đang chạy.


3
Nó sẽ yêu cầu cụm mật khẩu cho khóa ngay cả khi lệnh ssh tiếp theo không sử dụng nó.
Vi.

@Vi. đúng, nhưng hiếm là các lệnh không sử dụng chúng (trừ khi bạn kết nối với máy chủ sử dụng tương tác bàn phím). Chìa khóa sẽ ở trong đại lý bất cứ khi nào bạn cần chúng sau đó. Ngoài ra, bí danh may mắn thay (hoặc không may) không thay đổi cách sử dụng phụ trợ của ssh (chẳng hạn như với git hoặc rsync).
Jessidhia

2
(suy nghĩ về việc viết bản vá tự động gọi-ssh-add cho máy khách ssh)
Vi.

Dựa trên câu trả lời này, bạn có thể tạo bí danh cho một máy chủ lưu trữ cụ thể : alias ssh-hostname='(ssh-add -l | grep hostname > /dev/null) || ssh-add ~/.ssh/id_rsa_hostname && ssh -p 12345 username@hostname'. Bạn thậm chí có thể đặt nó trong một vòng lặp cho tất cả các khóa ssh của bạn và tạo bí danh. Một hack bẩn, nhưng nó hoạt động.
dset0x

5

Cho đến khi tự động gọi-ssh-add được hỗ trợ bởi ssh, tôi đã thêm phần này vào .bashrc, dựa trên đề xuất của Kovensky:

ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'

Bí danh chỉ được tạo nếu danh tính không được thêm và bí danh sẽ tự hủy khi chạy.

Bằng cách này, lệnh ssh thông thường được sử dụng sau khi danh tính đã được thêm vào.


Sẽ không hoạt động trong trường hợp của tôi vì ssh-add cũng có thời gian chờ được cấu hình, nhưng ý tưởng là đủ tốt.
Vi.

@Vi. Làm thế nào một thời gian chờ sẽ ảnh hưởng đến điều này? Nó dường như làm việc tuyệt vời cho tôi.
lanrat

1
@lanrat, Điều này kiểm tra nếu khóa có trong ssh-agent và cấu hình bí danh tùy thuộc vào sự hiện diện. Nhưng do hết thời gian ( ssh-add -t ...), khóa được thêm vào ssh-agent có thể biến mất đột ngột, nhưng bí danh sẽ ở lại vì khóa vẫn còn trong bộ nhớ.
Vi.

1

Tôi đang sử dụng hàm shell sau:

ssh() {
    local possible_keys=($(/usr/bin/env ssh -G $@ | grep '^identityfile' \
                           | cut -d " " -f 2- | sed -e "s|^~|$HOME|"))
    for k in $possible_keys; do
        if [[ -f $k ]]; then
            local fingerprint=$(ssh-keygen -lf $k)
            ssh-add -l | grep -q "$fingerprint" || ssh-add $k
        fi
    done
    /usr/bin/env ssh $@
    return $?
}

Đầu tiên, nó giải quyết cấu hình cho máy chủ mà tôi đang cố gắng kết nối, sau đó thêm các khóa có thể cho máy chủ đó vào ssh-agent nếu chúng chưa được thêm và cuối cùng kết nối với máy chủ. Tôi chắc chắn rằng nó có thể được cải thiện, vì vậy tôi mở phản hồi.

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.