Làm cách nào tôi có thể chạy ssh-add tự động mà không cần nhắc mật khẩu?


247

Tôi muốn giao tiếp giữa một số máy tính trên mạng của mình (Ethernet tĩnh), thông qua SSH. Để làm được điều đó, tôi cần chạy ssh-add mỗi lần tôi đăng nhập vào một máy cụ thể, làm thế nào tôi có thể làm điều đó để nó được thiết lập một lần và nó không yêu cầu tôi nhập cụm mật khẩu mỗi khi tôi đăng nhập hoặc khởi động lại máy của tôi?

Tôi biết rằng có một cách mà bạn nên thêm một số dòng vào bash_profiletệp, nhưng tôi vẫn cần nhập mật khẩu mỗi khi tôi khởi động lại / đăng nhập vào một máy cụ thể.

if [ -z "$SSH_AUTH_SOCK" ] ; then
    eval `ssh-agent -s`
    ssh-add
fi

Câu trả lời:


348

Đây là một ví dụ điển hình về sự đánh đổi giữa an ninh và tiện lợi. May mắn thay, có một số tùy chọn. Giải pháp phù hợp nhất phụ thuộc vào kịch bản sử dụng và mức độ bảo mật mong muốn.

ssh-key với cụm mật khẩu, không ssh-agent

Bây giờ mật khẩu phải được nhập mỗi lần khóa được sử dụng để xác thực. Mặc dù đây là tùy chọn tốt nhất từ ​​quan điểm bảo mật, nó cung cấp khả năng sử dụng tồi tệ nhất. Điều này cũng có thể dẫn đến một cụm mật khẩu yếu được chọn theo thứ tự - để giảm bớt gánh nặng nhập liên tục.

ssh-key với cụm mật khẩu, với ssh-agent

Thêm các mục sau vào ~/.bash_profilesẽ tự động bắt đầu ssh-agentvà tải (các) khóa ssh khi đăng nhập:

if [ -z "$SSH_AUTH_SOCK" ] ; then
  eval `ssh-agent -s`
  ssh-add
fi

Bây giờ mật khẩu phải được nhập vào mỗi lần đăng nhập. Mặc dù tốt hơn một chút từ góc độ khả năng sử dụng, nhưng điều này có nhược điểm ssh-agentnhắc nhở cụm mật khẩu bất kể khóa có được sử dụng hay không trong phiên đăng nhập. Mỗi lần đăng nhập mới cũng sinh ra một thể hiện riêng biệt ssh-agentvẫn đang chạy với các khóa được thêm vào trong bộ nhớ ngay cả sau khi đăng xuất, trừ khi bị giết rõ ràng.

Để tắt ssh_agentkhi đăng xuất, hãy thêm vào như sau~/.bash_logout

if [ -n "$SSH_AUTH_SOCK" ] ; then
  eval `/usr/bin/ssh-agent -k`
fi

hoặc sau đây để ~/.bash_profile

trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0

Tạo nhiều ssh-agenttrường hợp có thể tránh được bằng cách tạo một ổ cắm liên lạc liên tục cho tác nhân tại một vị trí cố định trong hệ thống tệp, chẳng hạn như trong câu trả lời của Collin Anderson . Tuy nhiên, đây là một cải tiến trong việc sinh ra nhiều trường hợp tác nhân, trừ khi rõ ràng đã giết khóa được giải mã vẫn còn trong bộ nhớ sau khi đăng xuất.

Trên máy tính để bàn, các tác nhân ssh đi kèm với môi trường máy tính để bàn, chẳng hạn như Tác nhân SSH của Gnome , có thể là một cách tiếp cận tốt hơn vì chúng thường được sử dụng để nhắc cụm mật khẩu lần đầu tiên sử dụng khóa ssh trong phiên đăng nhập và lưu trữ khóa riêng được giải mã trong bộ nhớ cho đến khi kết thúc phiên.

ssh-key với cụm mật khẩu, với ssh-ident

ssh-identlà một tiện ích có thể quản lý ssh-agentthay mặt bạn và tải danh tính khi cần thiết. Nó chỉ thêm khóa một lần khi cần, bất kể có bao nhiêu thiết bị đầu cuối, ssh hoặc phiên đăng nhập yêu cầu quyền truy cập vào một ssh-agent. Nó cũng có thể thêm và sử dụng một tác nhân khác và bộ khóa khác nhau tùy thuộc vào máy chủ được kết nối hoặc thư mục ssh được gọi từ đó. Điều này cho phép cô lập các khóa khi sử dụng chuyển tiếp tác nhân với các máy chủ khác nhau. Nó cũng cho phép sử dụng nhiều tài khoản trên các trang như GitHub.

Để bật ssh-ident, hãy cài đặt nó và thêm bí danh sau vào ~/bash_profile:

alias ssh='/path/to/ssh-ident'

ssh-key với cụm mật khẩu, với keychain

keychainlà một tiện ích nhỏ quản lý ssh-agentthay mặt bạn và cho phép ssh-agentduy trì hoạt động khi phiên đăng nhập kết thúc. Trong lần đăng nhập tiếp theo, keychainsẽ kết nối với phiên bản hiện có ssh-agent. Trong thực tế, điều này có nghĩa là chỉ phải nhập cụm mật khẩu trong lần đăng nhập đầu tiên sau khi khởi động lại. Trong các lần đăng nhập tiếp theo, khóa không được mã hóa từ phiên bản hiện tại ssh-agentđược sử dụng. Điều này cũng có thể hữu ích để cho phép xác thực RSA / DSA cronkhông mật khẩu trong các công việc mà không cần ssh-key không mật khẩu.

Để kích hoạt keychain, cài đặt nó và thêm một cái gì đó như sau ~/.bash_profile:

eval `keychain --agents ssh --eval id_rsa`

Từ quan điểm bảo mật, ssh-identkeychaintồi tệ hơn các ssh-agenttrường hợp giới hạn trong vòng đời của một phiên cụ thể, nhưng chúng mang lại mức độ tiện lợi cao. Để cải thiện tính bảo mật keychain, một số người thêm --cleartùy chọn vào lệnh ~/.bash_profilegọi móc khóa của họ . Bằng cách thực hiện cụm mật khẩu này phải được nhập lại khi đăng nhập như trên, nhưng các croncông việc vẫn sẽ có quyền truy cập vào các khóa không được mã hóa sau khi người dùng đăng xuất. Các keychain trang wiki có thêm thông tin và ví dụ.

ssh-key không có cụm mật khẩu

Từ quan điểm bảo mật, đây là tùy chọn tồi tệ nhất vì khóa riêng hoàn toàn không được bảo vệ trong trường hợp nó bị lộ. Tuy nhiên, đây là cách duy nhất để đảm bảo rằng cụm mật khẩu không cần phải nhập lại sau khi khởi động lại.

ssh-key với cụm mật khẩu, với ssh-agent , chuyển cụm mật khẩu đến ssh-add từ tập lệnh

Mặc dù có vẻ như là một ý tưởng đơn giản để chuyển cụm mật khẩu đến ssh-addtừ một tập lệnh, ví dụ echo "passphrase\n" | ssh-add, đây không phải là căng thẳng vì nó dường như ssh-add không đọc cụm mật khẩu từ stdin, nhưng mở /dev/ttytrực tiếp để đọc .

Điều này có thể được làm việc xung quanh với expect, một công cụ để tự động hóa các ứng dụng tương tác. Dưới đây là một ví dụ về tập lệnh thêm khóa ssh bằng cụm mật khẩu được lưu trong tập lệnh:

#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact

Lưu ý rằng vì cụm mật khẩu được lưu trữ trong văn bản gốc trong tập lệnh, từ góc độ bảo mật, điều này khó tốt hơn so với việc sử dụng khóa ssh-key không mật khẩu. Nếu cách tiếp cận này được sử dụng, điều quan trọng là phải đảm bảo rằng expecttập lệnh chứa cụm mật khẩu có các quyền thích hợp được đặt cho nó, làm cho nó có thể đọc được, có thể ghi và có thể chạy được bởi chủ sở hữu khóa.


1
Được rồi, nhưng khi tôi đặt mã của bạn vào ~ / .bash_profile, tôi phải nhập mật khẩu mỗi lần tôi đăng nhập, tôi cũng không muốn điều đó. Tôi không quan tâm đến an ninh cả. tiếng vang "vượt qua \ n" | ssh-add không hoạt động
zdun8

3
@ user1607072 Vâng, đó là cách ssh-agentđoạn trích ~/.bash_profilehành xử như được giải thích trong câu trả lời. Bạn có thể muốn xem các keychaintiện ích. Với keychainbạn cần nhập mật khẩu vào lần đăng nhập đầu tiên sau khi khởi động lại, nhưng trong lần đăng nhập tiếp theo keychainsẽ kết nối với một phiên bản hiện có ssh-agentvới khóa được giải mã trong bộ nhớ. Ngoài ra, còn có tùy chọn tạo khóa ssh mà không cần cụm mật khẩu, nhưng điều này tất nhiên là không nên.
Thomas Nyman

3
@ user1607072 Mặc dù tôi rất muốn đề xuất một trong những cách tiếp cận an toàn hơn, có một cách để chuyển cụm mật khẩu đến ssh-addtừ một tập lệnh. Lý do echo "pass\n" | ssh-addkhông hoạt động là ssh-addkhông đọc mật khẩu stdin, nhưng mở /dev/ttytrực tiếp để đọc. Đã cập nhật câu trả lời để bao gồm một cách giải quyết cho việc này, bằng cách sử dụng một tiện ích được gọi là expect.
Thomas Nyman

1
@ user1607072 Có thể hơi quá mức cho trường hợp sử dụng của bạn, nhưng Kerberos kết hợp với hỗ trợ ssh GSSAPI cũng có thể được sử dụng cho đăng nhập ssh không mật khẩu. Phương thức xác thực tương ứng trong ssh được gọi gssapi-with-mic. Điều này thường được sử dụng trong các mạng lớn hơn, nhưng tất nhiên nếu bạn quan tâm đến điều này thì nó có thể đáng để xem xét.
Thomas Nyman

1
@ErickBrown: Đã trả lời ở đây . Nên dừng đơn vị SSH Agent khi đăng xuất nếu bạn bị vô hiệu hóa người dùng trong trình quản lý đăng nhập systemd . Nếu tính năng nán lại của người dùng được bật, phiên bản người dùng systemd và đơn vị SSH Agent sẽ tiếp tục chạy ngay cả sau khi phiên đăng nhập cuối cùng được đóng lại.
Thomas Nyman

93

Thêm cái này vào của bạn ~/.bashrc, sau đó đăng xuất và đăng nhập lại để có hiệu lực.

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add

Điều này chỉ nên nhắc mật khẩu lần đầu tiên bạn đăng nhập sau mỗi lần khởi động lại. Nó sẽ tiếp tục sử dụng lại ssh-agentmiễn là nó vẫn chạy.


1
rất gọn gàng, theo cách này bạn chỉ có một ssh-agent đang chạy (: Nhiều tác nhân như trong giải pháp thứ hai của @ thomasNyman dường như là một rủi ro bảo mật đối với tôi ...
drevicko 10/2/2016

1
Sau khi nghiên cứu trong các trang web khác nhau và đọc các giải pháp khác nhau, điều này ở đây dường như là rõ ràng nhất, đi thẳng vào vấn đề. Rất đẹp. +1
Bác sĩ Beco

1
tốt hơn để làm điều này: `alias ssh = ssh-check-agent" và có phiên bản tác nhân kiểm tra làm như trên. Bằng cách đó: a) bạn chỉ nhận được một tác nhân và b) bạn chỉ nhận được tác nhân nếu bạn cần nó
Erik Aronesty

2
Tôi nghĩ -s là mặc định, vì vậy chúng tôi đã làm điều đó.
Collin Anderson

1
ssh-add -ltrả về mã thoát là 0 khi tác nhân có danh tính và 1 khi không có để bạn có thể cắt grep ra khỏi lệnh cuối cùng và sử dụngssh-add -l > '/dev/null' || ssh-add
Grant Humphries

16

Không liên quan chặt chẽ đến câu hỏi của OP, nhưng nó có thể hữu ích cho những người khác: vì 7.2.0 ssh (1) có một tùy chọn cho phép thêm khóa vào ssh-agent khi xác thực lần đầu; tùy chọn là AddKeysToAgentvà có thể được thiết lập để yes, no, ask, hay confirm, toàn hệ thống hoặc cá nhân của bạn .ssh/configtập tin.

Tham khảo: https://www.openssh.com/txt/release-7.2


2
Áp dụng cho những người mới sử dụng .ssh/configtệp: điều này áp dụng cho sshvà bất cứ điều gì sử dụng sshđằng sau nó, ví dụ scp, và có thể được thực hiện trên cơ sở mỗi máy chủ lưu trữ.
SEoF

Nó vẫn hỏi tôi mật khẩu mỗi lần tôi đăng nhập và thử git pull chẳng hạn.
đào tạo

@trainosis Vấn đề là có lẽ bạn không có phiên bản ssh-agent đang chạy để giữ (các) khóa được giải mã trong bộ nhớ để sử dụng trong tương lai. Bạn chỉ cần nhập mật khẩu cho một khóa đã cho một lần cho mỗi phiên đăng nhập khi sử dụng ssh-agent.
eestrada

7

ssh-agent lưu trữ các khóa ssh được mở khóa khác nhau, do đó bạn có thể có các khóa ssh được bảo vệ bằng mật khẩu, nhưng không phải gõ chúng mỗi lần.

Để lưu trữ các khóa đã được mở khóa, rõ ràng cần phải mở khóa các khóa đó. Để mở khóa các khóa được khóa bằng cụm mật khẩu, rõ ràng cần phải biết các cụm mật khẩu này.

Bất kỳ phương pháp nào không yêu cầu ủy quyền từ con người (ví dụ: "nhập mật khẩu") sẽ không chỉ khiến hệ thống của bạn không an toàn; nó cũng sẽ khiến toàn bộ mục đích của ssh-agent trở nên vô nghĩa.

Đã nói tất cả những điều này, bạn chỉ có thể sử dụng các khóa ssh không được bảo vệ bằng mật khẩu (nhấn Enterkhi được yêu cầu nhập mật khẩu trong quá trình tạo khóa). Vì không có bất kỳ mật khẩu nào, nên ssh-agentbạn không cần yêu cầu bạn nhập một mật khẩu để (không) lưu trữ nó.


Tôi đồng ý, miễn là các khóa của bạn chỉ được phép sử dụng đúng cách, có rất ít lợi thế cho ssh-agent so với các khóa không được phép. Tôi thích ssh vào một máy chủ đăng nhập, và sau đó, máy chủ đó có một loạt các khóa không cho phép, mỗi khóa chỉ có thể được sử dụng để mở khóa một máy chủ khác. máy chủ đăng nhập không làm gì khác, vì vậy việc hack / giả mạo khó khăn hơn nhiều, v.v ... các máy chủ khác không có quyền truy cập mật khẩu, chỉ có khóa.
Erik Aronesty

5

Đây là một cách giải quyết để tự động hóa cụm mật khẩu SSH của bạn.

  1. Tạo tập lệnh một lớp lót in cụm mật khẩu của bạn thành đầu ra tiêu chuẩn, ví dụ:

     echo 'echo MY_SSH_PASSWORD' > ~/.print_ssh_password && chmod 700 ~/.print_ssh_password
    

    Quan trọng: Đảm bảo bạn sao chép không gian hàng đầu để ngăn lưu trữ mật khẩu vào lịch sử của bạn .

Và sử dụng một trong các phương pháp dưới đây.

  • sử dụng cách tiếp cận đầu vào tiêu chuẩn:

    cat ~/.ssh/id_rsa | SSH_ASKPASS=~/.print_ssh_password ssh-add -
    
  • hoặc đặt tên phương pháp đường ống :

    1. Tạo một đường ống có tên (bạn cũng có thể thử thay thế quy trình ):

      mkfifo --mode 0600 ~/.ssh_fifo
      
    2. Chạy ssh-addbằng cách chỉ định chương trình được sử dụng để xác thực:

      cat ~/.ssh/id_rsa >~/.ssh_fifo | SSH_ASKPASS=~/.print_ssh_password ssh-add ~/.ssh_fifo
      

    Xem: man ssh-addđể đọc thêm về SSH_ASKPASS.


2
Đây echo my_passphraselà một lỗ hổng bảo mật lớn. Đầu tiên sau khi bạn đã gõ nó, mật khẩu ở dạng văn bản rõ ràng trong tệp lịch sử của những gì bạn từng sử dụng. Và các đối số dòng lệnh thứ hai có thể đọc được trên thế giới trên Unix ( ps -ef). Không bao giờ đặt mật khẩu trong các đối số dòng lệnh!
ceving

1
@ceving Thêm không gian hàng đầu bổ sung giải quyết vấn đề với tệp lịch sử. Đã thêm thông tin.
kenorb

@kenorb: Điều đó không giải quyết được vấn đề lớn hơn về mật khẩu hiển thị ở psđầu ra. Tệp lịch sử thường chỉ có thể đọc được bởi người dùng sở hữu, nhưng tất cả các dòng lệnh đều có thể đọc được bởi tất cả người dùng trên một hệ thống.
Thomas Nyman

4

Tôi sẽ không đề xuất bạn ssh-add (cần mở đại lý ssh) khi đăng nhập. Điều này là do bạn không thể kiểm soát khi phần ssh-agent kết thúc và có thể tạo ra rủi ro bảo mật khi bạn không cần sử dụng các keyfiles tại một phần đăng nhập.

Thay vào đó, tôi khuyên bạn nên viết một tập lệnh mở lớp vỏ phụ của phần ssh-agent, với tất cả các keyfiles được thêm tự động và được gọi khi cần sử dụng ssh. Nếu bạn có thể chấp nhận như vậy, đọc tiếp.

Bạn sẽ có hai lựa chọn:

  1. Xóa tất cả cụm mật khẩu cho khóa của bạn, có bảo mật yếu nếu các tệp khóa của bạn bị đánh cắp. (do đó không được khuyến khích )

  2. Sử dụng cùng một mật khẩu cho các phím của bạn. Sau đó, khi bạn ssh-add keyfile1 keyfile2 ..., bạn sẽ chỉ cần nhập cụm mật khẩu một lần, mỗi phần.

Trong cả hai trường hợp, bạn có thể viết tệp tập lệnh như vậy "ssh_keys_section.sh" như dưới đây:

#!/bin/bash
# This script run a ssh-agent on a sub-shell and automatically ssh-add all keyfiles at once.
# This agent ends when you type `exit` to close the sub-shell.
exec ssh-agent bash -c "ssh-add /path/to/keyfile1 /path/to/keyfile2 ...; exec bash"

Nhận xét:

  • Lệnh thay đổi hoặc xóa cụm mật khẩu: ssh-keygen -p -f keyfile
  • Trong lớp vỏ phụ, bạn thậm chí có thể rẽ nhánh nhiều thiết bị đầu cuối có chung các khóa được mở khóa, bằng cách sử dụng một lệnh như /path/to/yourterminal &(phụ thuộc vào HĐH)

Ví dụ: Trên Windows trong Cygwin, /path/to/yourterminal &==>mintty &
Johnny Wong

2
if [ ! -S ${HOME}/.ssh/ssh_auth_sock ]; then
  eval $(ssh-agent)
  ln -sf "${SSH_AUTH_SOCK}" ${HOME}/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=${HOME}/.ssh/ssh_auth_sock

ssh_keys=$(find -E ~/.ssh -type f -regex '.*(rsa$|pem)')
ssh_agent_keys=$(ssh-add -l | awk '{key=NF-1; print $key}')

for k in "${ssh_keys}"; do
    for l in "${ssh_agent_keys}"; do
        if [[ ! "${k}" = "${l}" ]]; then
            ssh-add "${k}" > /dev/null 2>&1
        fi
    done
done

2

Tôi đã từng sử dụng tập lệnh được đề cập bởi steampowered, bây giờ tôi đã tạo tập lệnh dưới đây, vì nó không để các tập tin nằm xung quanh.

Chỉ làm việc trên zshvỏ.

#!/bin/sh

AGENT_BIN=`which ssh-agent`
AGENT_ADD_BIN=`which ssh-add`
AGENT_PID=`ps -fe | grep ${AGENT_BIN} | awk -vuser=$USER -vcmd="$AGENT_BIN" '$1==user && $8==cmd{print $2;exit;}'`
if [ -z "$AGENT_BIN" ]; then
    echo "no ssh agent found!";
    return
fi
if [ "" -eq "$AGENT_PID" ]; then
    if read -sq "YN?Do you want to unlock your ssh keys?"; then
        echo ""
        output=`$AGENT_BIN | sed 's/echo/#echo/g'`
        eval $output
        $AGENT_ADD_BIN
    fi
else
    for f in "/proc/"*
    do
        cmdline=`cat "$f/cmdline"`
        if [ "${AGENT_BIN}" -ef "${cmdline}" ]; then
            export SSH_AUTH_SOCK=`cat $f/net/unix | grep --binary-file=text -oP '((/[^/]*?)+/ssh-[^/]+/agent\.\d+$)'`
            export SSH_AGENT_PID=${f##*/}
            break;
        fi
    done
fi

1
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
     echo succeeded
     chmod 600 "${SSH_ENV}"
     . "${SSH_ENV}" > /dev/null
     /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . "${SSH_ENV}" > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

Cung cấp tín dụng tại đây: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html

Giải pháp này cũng được chứng thực ở đây: http://mah.everybody.org/docs/ssh


1

Dấu hiệu duy nhất về giải pháp cho SSH có thể dẫn tôi đến pam_ssh.

Theo bài viết này , khái niệm này là:

Nếu bạn làm việc với nhiều máy dựa trên * nix qua ssh, có lẽ bạn sẽ mệt mỏi vì phải liên tục nhập mật khẩu mỗi khi bạn muốn truy cập vào hộp khác. Có một cách an toàn để cho phép bạn truy cập mọi máy mà bạn có quyền truy cập ssh mà không cần phải nhập mật khẩu khác (ngoài mật khẩu bạn đã đăng nhập ban đầu.)


Điều này thực sự khá đơn giản, về cơ bản, bạn chỉ cần tạo một cặp khóa công khai / riêng để tự xác thực với các máy khác của mình, sau đó PAM tạo ra một tác nhân để tải các khóa của bạn sau khi bạn đăng nhập, cung cấp một giải pháp đăng nhập duy nhất để truy cập tất cả các điều khiển từ xa của bạn máy móc. Hướng dẫn này sẽ hướng dẫn bạn thông qua việc thiết lập này.

Tôi đã không xác minh điều này sẽ thực sự làm việc.


0

Thêm phần này vào ~/.bashrctập tin của bạn :

ssh-add -L|grep identities > /dev/null && ssh-add /path/to/ssh/private/key

Tôi không thấy điều này liên quan đến câu hỏi như thế nào, về việc không được nhắc nhập mật khẩu trong các lần đăng nhập tiếp theo.
Chris Down

0

Để thêm khóa (có thể không có mật khẩu) và đảm bảo rằng ssh-addsẽ không nhắc mật khẩu, bất kể là gì, ngay cả khi chạy dưới X :

DISPLAY= ssh-add -k /path/to/key </dev/null &>/dev/null

Trạng thái thoát cho thấy thành công hay thất bại.


0

Nếu bạn đang chạy cá ngựa với tư cách là người quản lý mật khẩu của mình ... Bạn có thể là ai; D

Một giải pháp khác đạt được mục tiêu bạn đang tìm kiếm chỉ đơn giản là thêm các phím ssh vào cá ngựa để tự động mở khóa khi đăng nhập. Lợi ích chính cho điều này là bạn không bao giờ phải nhập mật khẩu cho các khóa sau khi bạn đăng nhập qua gdm hoặc bất cứ điều gì bạn đăng nhập ngay cả khi các khóa có mật khẩu. Điều này YÊU CẦU cả khóa riêng và khóa chung. Họ cũng PHẢI tuân theo một quy ước đặt tên cho cá ngựa. Mặc định là chấp nhận được (id_rsa cho khóa riêng và id_rsa.pub cho khóa chung ... Thực sự mọi thứ là privatekeynameprivatekeyname.pub )

Để thêm khóa ssh cho cá ngựa để mở khóa tự động khi đăng nhập; (trên fedora25, tôi không chắc đường dẫn ở đâu trên các bản phát hành khác mặc dù rất có thể nó rất giống nhau)

/lib64/seahorse/seahorse-ssh-askpass /path/to/keys/here

Đối với tôi, nó là

/lib64/seahorse/seahorse-ssh-askpass ~/.ssh/id_rsa

(cá ngựa sẽ tự động cho rằng khóa công khai trong trường hợp của tôi là id_rsa.pub)

Sau khi thực hiện lệnh, cá ngựa sẽ bật mở một trường mật khẩu gtk nhỏ dễ thương để nhập mật khẩu cho khóa riêng vào. hoặc chỉ để trống nếu bạn tạo khóa mà không có mật khẩu.

Seahorse sẽ không nhắc bạn nếu mọi thứ đều ổn. Bạn sẽ cần cố gắng ssh vào máy đích. Sau đó, cá ngựa sẽ nhắc bạn mở khóa bằng mật khẩu bằng đồ họa (NÀY S ONLY CHỈ CÓ MỘT LẦN NỮA) nhưng lần này nó sẽ trông hơi khác một chút; P (đây cũng là phần mà cá ngựa có thể sử dụng phép thuật cá ngựa để thêm ma thuật ) và cung cấp TÙY CHỌN để mở khóa khi đăng nhập, bạn phải kiểm tra tùy chọn này để đạt được mục tiêu của mình.

Chỉ vì tôi không đọc tất cả các câu trả lời, tôi sẽ khuyên bạn nên hoàn tác những gì mọi người bảo bạn làm với ssh-add trước khi thử câu trả lời này. Làm như vậy nếu không có thể dẫn đến một cái gì đó xấu xảy ra với chìa khóa của bạn, idk.


0

Đây là kịch bản dứt khoát.

Cập nhật $ PASSW, sau đó sao chép-dán nó vào Terminal của bạn

# <sshpass> via typinator
# Updated: 2017-01-18_21h36
#
# apt-get update -y; apt-get install expect -qy

# Pass this value to ssh-add
PASSW="myfancypass123"

# Define a name for this script
THIS_SCRIPT="$(date +%Y-%m-%d_%H-%M-%S-%N)".sh

# Create a fresh directory to work from / Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la


# Output our bash script file - BEGIN
cat <<< '
#!/bin/bash

set -u     # Stop if an unbound variable is referenced
set -e     # Stop on first error
export HISTIGNORE="expect*";

# Normal CMDs
echo && echo "The process should take about 10 seconds:" && echo
eval "$(ssh-agent -s)"; sleep 0.5;

# Define VAR passed when this bash-script was launched
password="$@"

# Launch the expect magic
expect -c "
    spawn ssh-add /root/.ssh/id_rsa
    expect "?assword:"
    send \"$password\r\"
    expect "?password:"
    send \"$password\r\"
    expect eof"

export HISTIGNORE="";
export password="";
' > $THIS_SCRIPT
# Output our bash script file - END


# Ensure we are in the right path
cd ~/temp; ls -la; sleep 1;

# Run the bash script
chmod +x ./$THIS_SCRIPT; ./$THIS_SCRIPT "$PASSW"; unset password;

# Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la

0

Cách tốt nhất tôi biết là sử dụng tập lệnh đăng nhập PAM mà tôi đã điều chỉnh từ công việc trước đó vì tôi không thể tìm thấy câu trả lời thỏa mãn trong câu hỏi này.

Cụm mật khẩu của bạn được lưu trữ được mã hóa bằng mật khẩu hệ thống của bạn và chức năng phái sinh nặng. Khi đăng nhập, mật khẩu hệ thống của bạn được sử dụng để giải mã cụm mật khẩu của bạn và thêm nó vào tác nhân.

https://github.com/capocasa/systemd-user-pam-ssh

Ưu điểm so với mọi giải pháp khác được trình bày là nó kết hợp bảo mật tương đương với việc chạy ssh-add thủ công khi khởi động mà không cần nỗ lực. Nó không yêu cầu thêm công cụ và có thêm một phụ thuộc đã được cài đặt theo mặc định trên hầu hết các hệ thống (OpenSSL).


0

Thiết lập của tôi trên macOS là như sau (trong .zshrchoặc .bash_profilecho bash folks):

# Kill then Load the ssh-agent and set the necessary env variables it outputs
sshRestart() {
    # if all else fails
    # pkill -u $(whoami) ssh-agent;

    if [ -n "$SSH_AUTH_SOCK" ] ; then
        eval `/usr/bin/ssh-agent -k`
    fi
    eval `ssh-agent -s`
    ssh-add ~/.ssh/YOUR_KEY_FILE
    echo "Restarted SSH agent"
}

if [ -z "$SSH_AUTH_SOCK" ] || [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]] ; then
    eval `ssh-agent -s` > /dev/null 2>&1
    ssh-add ~/.ssh/YOUR_KEY_FILE > /dev/null 2>&1
fi

Phần || [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]này là cần thiết trên macOS vì giá trị mặc định là /private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners. Nếu không, câu trả lời toàn diện @Thomas Nyman không thành công vì $SSH_AUTH_SOCKluôn được đặt thành một cái gì đó.

Sau đó trong .zlogout(hoặc .bash_logoutcho bash folks):

if [ -n "$SSH_AUTH_SOCK" ] ; then
    eval `/usr/bin/ssh-agent -k`
fi

Đã thử nghiệm trên macOS Mojave 10.14.5

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.