암호 프롬프트없이 ssh-add를 자동으로 실행하려면 어떻게해야합니까?


247

SSH를 통해 네트워크의 여러 컴퓨터 (정적 이더넷)간에 통신하고 싶습니다. 그렇게하려면 특정 컴퓨터에 로그인 할 때마다 ssh-add를 실행해야합니다. 한 번 설정하고 로그인하거나 재부팅 할 때마다 암호 문구를 묻지 않도록하려면 어떻게해야합니까? 내 기계?

bash_profile파일 에 몇 줄을 추가 해야하는 방법이 있지만 특정 시스템에 재부팅 / 로그인 할 때마다 암호를 입력해야합니다.

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

답변:


348

이것은 보안과 편리함의 균형을 이루는 전형적인 예입니다. 다행히 여러 가지 옵션이 있습니다. 가장 적합한 솔루션은 사용 시나리오와 원하는 보안 수준에 따라 다릅니다.

암호문이있는 ssh 키 ssh-agent

이제 인증에 키를 사용할 때마다 비밀번호 문구를 입력해야합니다. 이것이 보안 관점에서 가장 좋은 옵션이지만 가장 유용성이 떨어집니다. 이로 인해 약한 암호가 순서대로 선택되어 반복적으로 입력하는 부담이 줄어 듭니다.

암호문이있는 ssh 키 ssh-agent

다음을 추가하면 로그인시 ssh 키 ~/.bash_profile가 자동으로 시작 ssh-agent되고로드 됩니다 .

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

이제 로그인 할 때마다 비밀번호 문구를 입력해야합니다. 사용성 측면에서 약간 ssh-agent나아졌지 만, 로그인 세션 중 키 사용 여부에 관계없이 암호 문구 를 묻는 단점이 있습니다. 각각의 새 로그인은 ssh-agent명시 적으로 종료되지 않는 한 로그 아웃 후에도 메모리에 추가 된 키로 실행중인 상태로 유지되는 고유 한 인스턴스를 생성합니다 .

ssh_agent로그 아웃시 종료 하려면 다음을 추가하십시오.~/.bash_logout

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

또는 다음에 ~/.bash_profile

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

Collin Anderson 's answerssh-agent 과 같이 파일 시스템의 고정 위치에 에이전트에 대한 지속적인 통신 소켓을 작성하면 여러 인스턴스를 작성할 수 없습니다 . 그러나 이는 명시 적으로 종료 된 암호 해독 된 키가 로그 아웃 후에도 메모리에 남아 있지 않으면 여러 에이전트 인스턴스를 생성하는 것보다 개선 된 것입니다.

데스크탑에서 Gnome Keyring SSH Agent 와 같이 데스크탑 환경에 포함 된 ssh-agent는 일반적으로 로그인 세션 중에 ssh-key를 처음 사용할 때 암호문을 프롬프트하도록 만들 수 있으므로 더 나은 접근 방법이 될 수 있습니다. 세션이 끝날 때까지 해독 된 개인 키를 메모리에 저장하십시오.

암호문이있는 ssh 키 ssh-ident

ssh-identssh-agent사용자를 대신하여 관리 하고 필요에 따라 ID를로드 할 수있는 유틸리티입니다 . 에 액세스해야하는 터미널, ssh 또는 로그인 세션 수에 관계없이 필요한만큼 키를 한 번만 추가합니다 ssh-agent. 또한 연결중인 호스트 또는 ssh 디렉토리에서 호출 된 에이전트에 따라 다른 에이전트 및 다른 키 세트를 추가하고 사용할 수 있습니다. 이렇게하면 다른 호스트와 에이전트 전달을 사용할 때 키를 격리 할 수 ​​있습니다. 또한 GitHub와 같은 사이트에서 여러 계정을 사용할 수 있습니다.

을 활성화하려면 ssh-ident설치하고 다음에 다음 별칭을 추가하십시오 ~/bash_profile.

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

암호문이있는 ssh 키 keychain

keychainssh-agent귀하를 대신하여 관리 ssh-agent하며 로그인 세션이 끝날 때 계속 실행되도록 하는 작은 유틸리티입니다 . 이후 로그인시 keychain기존 ssh-agent인스턴스에 연결됩니다 . 실제로 이것은 재부팅 후 첫 번째 로그인 중에 만 암호를 입력해야 함을 의미합니다. 이후 로그인시 기존 ssh-agent인스턴스 의 암호화되지 않은 키 가 사용됩니다. 또한 암호 cron없는 ssh 키가없는 작업 에서 암호없는 RSA / DSA 인증을 허용하는 데 유용 할 수 있습니다 .

사용하려면 keychain설치하고 다음과 같이 추가하십시오 ~/.bash_profile.

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

보안 관점에서, ssh-ident그리고 keychain보다 더 있습니다 ssh-agent특정 세션의 수명에 제한 인스턴스하지만 편의의 높은 수준을 제공합니다. 의 보안을 향상시키기 위해 keychain일부 사람들 --clear~/.bash_profile키 체인 호출에 옵션을 추가합니다 . 이 암호를 사용하면 위와 같이 로그인시 다시 입력해야하지만 cron사용자가 로그 아웃 한 후에도 작업은 여전히 ​​암호화되지 않은 키에 액세스 할 수 있습니다. keychain 위키 페이지는 더 많은 정보와 예제가 있습니다.

암호가없는 ssh 키

보안 관점에서 볼 때 개인 키는 노출 될 경우 완전히 보호되지 않으므로 최악의 옵션입니다. 그러나 이것은 재부팅 후 암호를 다시 입력 할 필요가없는 유일한 방법입니다.

와 암호로 SSH 키, ssh-agent , 에 암호를 전달하는 ssh-add 스크립트

ssh-add예를 들어 echo "passphrase\n" | ssh-add, 스크립트에서 암호를 전달하는 것은 간단한 생각처럼 보일 수 있지만 이는 암호를 ssh-add 읽지 않는stdin/dev/tty 것처럼 보이지만 직접 읽을 수 있도록 개방되어 있습니다 .

이 될 수있다 해결할expect대화 형 응용 프로그램을 자동화하기위한 도구. 아래는 스크립트에 저장된 암호를 사용하여 ssh 키를 추가하는 스크립트의 예입니다.

#!/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

비밀번호 문구는 스크립트의 일반 텍스트로 보안 관점에서 저장되므로 비밀번호가없는 ssh 키를 사용하는 것보다 낫지 않습니다. 이 방법을 사용 expect하려면 암호를 포함하는 스크립트에 적절한 권한이 설정되어 있어야하며 키 소유자 만 읽고 쓸 수 있고 실행할 수 있도록해야합니다.


1
좋아,하지만 ~ / .bash_profile에 코드를 넣을 때마다 로그인 할 때마다 암호를 입력해야합니다. 나는 보안에 전혀 관심이 없습니다. 에코 "통과 \ n"| ssh-add가 작동하지 않음
zdun8

3
@ user1607072 예, 이것이 ssh-agent스 니펫 ~/.bash_profile이 응답에서 설명한대로 작동 하는 방식 입니다. keychain유틸리티 를보고 싶을 수도 있습니다 . 함께 keychain사용하면 재부팅 후 처음 로그인 암호를 입력해야하지만 이후 로그인에 keychain기존에 연결 ssh-agent메모리에 암호 해독 키를 사용하여 인스턴스입니다. 그 외에도 암호없이 ssh 키를 생성하는 옵션이 있지만 물론 권장하지는 않습니다.
Thomas Nyman

3
@ user1607072 더 안전한 접근 방법 중 하나를 강력히 제안하지만 ssh-add스크립트에서 암호를 전달하는 방법 이 있습니다. echo "pass\n" | ssh-add작동하지 않는 이유 는 ssh-add의 비밀번호를 읽지 않지만 읽을 수 있도록 직접 stdin열립니다 /dev/tty. 라는 유틸리티를 사용하여 이에 대한 해결 방법을 포함하도록 답변을 업데이트했습니다 expect.
토마스 Nyman

1
@ user1607072 사용 사례에 약간 과잉이 될 수 있지만 ssh GSSAPI 지원 과 함께 사용되는 Kerberos 를 암호없는 ssh 로그인에 사용할 수도 있습니다. ssh의 해당 인증 방법을 호출 합니다. 이것은 일반적으로 더 큰 네트워크에서 사용되지만 물론 관심이 있다면 살펴볼 가치가 있습니다. gssapi-with-mic
Thomas Nyman

1
@ErickBrown : 이미 여기에 대답 했습니다 . systemd 로그인 관리자 에서 사용자 대기 기능이 비활성화되어 있으면 로그 아웃시 SSH 에이전트 장치를 중지해야합니다 . 사용자 대기가 활성화 된 경우 마지막 로그인 세션이 닫힌 후에도 시스템 사용자 인스턴스와 SSH 에이전트 장치가 계속 실행됩니다.
Thomas Nyman

93

이것을에 추가 ~/.bashrc한 다음 로그 아웃했다가 다시 적용하십시오.

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

재부팅 할 때마다 처음 로그인 할 때만 암호를 묻는 메시지가 표시됩니다. ssh-agent계속 실행되는 한 계속 재사용 됩니다.


1
매우 깔끔하고이 방법으로 하나의 ssh-agent 만 실행합니다 (: @thomasNyman의 두 번째 솔루션에서와 같이 여러 에이전트가 보안 상 위험 할 것 같습니다 ...
drevicko

1
다양한 사이트에서 연구하고 다양한 솔루션을 읽은 후 여기에서 가장 명확하게 보입니다. 아주 좋아요 +1
Dr Beco

1
`alias ssh = ssh-check-agent '를 선택하고 check-agent 버전이 위와 같이하도록하십시오 : a) 하나의 에이전트 만 받고 b) 필요한 경우에만 에이전트를 얻습니다
Erik Aronesty

2
나는 -s가 기본값이라고 생각하므로 이미 그렇게하고 있습니다.
Collin Anderson

1
ssh-add -l에이전트가 ID를 가질 때 종료 코드 0을 리턴하고 그렇지 않은 경우 1을 리턴하여 마지막 명령에서 grep을 잘라내어 사용할 수 있습니다.ssh-add -l > '/dev/null' || ssh-add
Grant Humphries

16

OP의 질문과 밀접한 관련은 없지만 다른 사람들에게는 유용 할 수 있습니다. 7.2.0부터 ssh (1)에는 첫 번째 인증시 ssh-agent에 키를 추가 할 수있는 옵션이 있습니다. 옵션은 AddKeysToAgent설정할 수 있습니다에 yes, no, ask, 또는 confirm, 시스템 전체 또는 개인에 .ssh/config파일.

참조 : https://www.openssh.com/txt/release-7.2


2
.ssh/config파일을 처음 접하는 사람들에게 적용됩니다.이 내용 은 파일 뒤에 ssh사용 되는 모든 항목에 적용되며 호스트별로 수행 할 수 있습니다. sshscp
SEoF

예를 들어 로그인 할 때마다 여전히 암호를 묻고 git pull을 시도합니다.
trainoasis

@trainosis 문제는 나중에 사용하기 위해 암호 해독 된 키를 메모리에 보관하기 위해 ssh-agent 인스턴스가 실행되고 있지 않다는 것입니다. ssh-agent를 사용할 때 로그인 세션 당 한 번만 주어진 키의 비밀번호를 입력해야합니다.
eestrada

7

ssh-agent 잠금 해제 된 다양한 ssh 키를 캐시하므로 암호로 ssh 키를 보호 할 수 있지만 매번 입력하지 않아도됩니다.

잠금 해제 된 키를 캐시하려면 해당 키를 잠금 해제해야합니다. 암호로 잠겨있는 잠금 해제 키의 경우 이러한 암호를 알아야합니다.

사람의 승인이 필요없는 방법 (예 : "비밀번호 입력")은 시스템을 안전하지 않게 만들지 않습니다. 또한 ssh-agent의 전체 목적을 무의미하게 만듭니다.

이 모든 것을 말하면 암호로 보호되지 않은 ssh 키를 사용할 수 있습니다 ( Enter키 생성 중에 암호를 물을 때 누르십시오). 비밀번호 ssh-agent가 없으므로 캐시하지 않기 위해 비밀번호 를 요구할 필요가 없습니다.


귀하의 키가 올바르게 사용자 전용으로 허용되는 한, 권한이없는 키보다 ssh-agent보다 이점이 거의 없습니다. 나는 로그인 서버에 ssh하고 싶고, 그 서버에는 여러 개의 permsionless 키가 있으며, 각 키는 다른 서버를 잠금 해제하는 데만 사용할 수 있습니다. 로그인 서버는 다른 작업을 수행하지 않기 때문에 해킹 / 스푸핑 등이 훨씬 어렵습니다. 다른 서버는 암호 액세스 권한이 없으며 키 전용입니다.
Erik Aronesty

5

SSH 암호를 자동화하는 해결 방법은 다음과 같습니다.

  1. 암호를 표준 출력으로 인쇄하는 단일 라이너 스크립트를 작성하십시오 (예 :

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

    중요 사항 : 비밀번호를 히스토리에 저장하지 않도록 선행 공백을 복사하십시오 .

그리고 아래 방법 중 하나를 사용하십시오.

  • 표준 입력 방식 사용 :

    cat ~/.ssh/id_rsa | SSH_ASKPASS=~/.print_ssh_password ssh-add -
    
  • 또는 명명 된 파이프 접근 방식 :

    1. 명명 된 파이프를 만듭니다 ( 프로세스 대체를 시도 할 수도 있음 ).

      mkfifo --mode 0600 ~/.ssh_fifo
      
    2. ssh-add인증에 사용 된 프로그램을 지정하여 실행하십시오 .

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

    에 대한 자세한 내용은 다음 man ssh-add을 참조하십시오 SSH_ASKPASS.


2
echo my_passphrase큰 보안 구멍이다. 암호를 입력 한 후에는 사용중인 쉘의 내역 파일에 비밀번호가 일반 텍스트로 표시됩니다. 그리고 두 번째 명령 줄 인수는 유닉스 ( ps -ef) 에서 읽을 수 있습니다. 명령 행 인수에 비밀번호를 입력하지 마십시오!
9

1
@ceving 선행 공백을 추가하면 히스토리 파일의 문제점이 해결됩니다. 추가 정보가 추가되었습니다.
kenorb

@ kenorb : ps출력 에서 보이는 암호의 더 큰 문제를 해결하지 못합니다 . 히스토리 파일은 일반적으로 소유하는 사용자 만 읽을 수 있지만 명령 행은 시스템의 모든 사용자가 읽을 수 있습니다.
Thomas Nyman

4

로그인 할 때 ssh-add (ssh-agent를 열어야 함)를 권장하지 않습니다. ssh-agent 섹션이 종료되는시기를 제어 할 수없고 한 로그인 섹션에서 키 파일을 사용할 필요가 없을 때 보안 위험이 발생할 수 있기 때문입니다.

오히려 모든 키 파일이 자동으로 추가 된 ssh-agent의 섹션 하위 셸을 여는 스크립트를 작성하고 ssh를 사용해야 할 때 호출하는 것이 좋습니다. 그렇게 할 수 있다면 계속 읽으십시오.

두 가지 선택이 있습니다.

  1. 키 파일을 도난당한 경우 보안취약한 키의 모든 암호를 제거하십시오 . (따라서 권장하지 않음 )

  2. 키에 동일한 암호를 사용하십시오. 그런 다음 ssh-add keyfile1 keyfile2 ...섹션마다 비밀번호 문구를 한 번만 입력하면됩니다.

두 경우 모두 아래와 같이 "ssh_keys_section.sh"스크립트 파일을 작성할 수 있습니다.

#!/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"

비고 :

  • 비밀번호 문구를 변경하거나 삭제하는 명령 : ssh-keygen -p -f keyfile
  • 하위 셸 내에서 /path/to/yourterminal &(OS에 따라 다름) 같은 명령을 사용하여 동일한 잠금 해제 키를 공유하는 더 많은 터미널을 포크 할 수도 있습니다.

예 : Cygwin의 Windows에서 /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

나는 steampowered가 언급 한 스크립트를 사용했지만 파일을 남기지 않기 때문에 지금 아래를 만들었습니다.

zsh쉘에서만 작동 합니다.

#!/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

크레딧 제공 : https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html

이 솔루션은 여기에서도 승인됩니다. http://mah.everybody.org/docs/ssh


1

SSH를위한 싱글 사인온 솔루션으로 나를 이끌 수 있습니다 pam_ssh.

이 기사 에 따르면 개념은 다음과 같습니다.

ssh를 통해 여러 * nix 기반 시스템에서 작업하는 경우 다른 상자에 액세스 할 때마다 암호를 지속적으로 입력해야하는 데 지쳤을 수 있습니다. 다른 비밀번호 (원래 로그인 한 비밀번호 이외)를 입력하지 않아도 ssh 액세스 권한이있는 모든 머신에 액세스 할 수있는 안전한 방법이 있습니다.


이것은 실제로 매우 간단합니다. 기본적으로 공개 / 개인 키 쌍을 만들어 다른 컴퓨터에 자신을 인증 한 다음 PAM이 로그온 한 후 키를로드하는 에이전트를 생성하여 모든 원격 액세스에 단일 로그온 솔루션을 제공합니다 기계. 이 안내서는이를 설정하는 과정을 안내합니다.

이것이 실제로 작동하는지 확인하지 않았습니다.


0

이것을 ~/.bashrc파일에 추가 하십시오 :

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

이것이 후속 질문에서 암호를 묻는 메시지가 표시되지 않는 질문과 어떻게 관련이 있는지 알 수 없습니다.
Chris Down

0

(암호 ssh-add가없는 ) 키를 추가하고 X에서 실행할 때에도 암호를 묻는 메시지가 표시되지 않도록하려면 :

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

종료 상태는 성공 또는 실패를 나타냅니다.


0

비밀번호 관리자로 해마를 실행중인 경우 ... 어쩌면; D

당신이 찾고있는 목표를 달성하는 또 다른 솔루션은 ssh 키를 해마에 추가하여 로그인시 자동 잠금 해제를 수행하는 것입니다. 이것의 가장 큰 장점은 gdm을 통해 로그인 한 후 또는 키에 비밀번호가 있어도 로그인 한 모든 키에 비밀번호를 입력 할 필요가 없다는 것입니다. 개인 키와 공개 키가 모두 필요합니다. 또한 해마의 명명 규칙을 따라야합니다. 기본값은 허용됩니다 (개인 키의 경우 id_rsa, 공개 키의 경우 id_rsa.pub ... 실제로는 privatekeynameprivatekeyname.pub 인 것 ).

로그인시 자동 잠금 해제를 위해 ssh 키를 해마에 추가하려면 (Fedora25에서는 경로가 다른 배포판의 위치가 확실하지 않지만 확실하지는 않습니다)

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

나를 위해, 그것은

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

(해마는 자동으로 내 경우 공개 키가 id_rsa.pub라고 가정합니다)

명령을 실행하면 seahorse는 귀여운 gtk 비밀번호 필드를 열어 개인 키의 비밀번호를 입력합니다. 비밀번호없이 키를 생성 한 경우 비워 두십시오.

해마는 모든 것이 제대로되었는지 묻지 않습니다. 대상 시스템으로 ssh를 시도해야합니다. 그런 다음 해마는 암호로 그래픽으로 키를 잠금 해제하라는 메시지를 다시 표시하지만 (이번에는 한 번만 발생합니다) 이번에는 조금 다르게 보일 것입니다 .P )를 입력하고 로그인시 키 잠금을 해제 하는 옵션 을 제공하십시오 . 목표를 달성하려면이 옵션을 확인해야합니다.

모든 답변을 읽지 못했기 때문에이 답변을 시도하기 전에 모든 사람이 ssh-add로 수행 한 내용을 취소하는 것이 좋습니다. 그렇지 않으면 키에 문제가 생길 수 있습니다 (idk).


0

결정적인 스크립트는 다음과 같습니다.

$ PASSW를 업데이트 한 다음 터미널에 복사하여 붙여 넣기

# <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

내가 아는 가장 좋은 방법은이 질문에서 만족스러운 답변을 찾을 수 없기 때문에 이전 작업에서 수정 한 PAM 로그인 스크립트를 사용하는 것입니다.

암호는 시스템 암호와 강력한 파생 기능으로 암호화되어 저장됩니다. 로그인시 시스템 암호는 암호를 해독하여 에이전트에 추가하는 데 사용됩니다.

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

제시된 다른 모든 솔루션에 비해 장점은 부팅시 ssh-add를 수동으로 실행하는 것과 동등한 보안을 노력없이 결합한다는 것입니다. 추가 도구가 필요하지 않으며 대부분의 시스템 (OpenSSL)에 기본적으로 이미 설치되어있는 추가 종속성이 있습니다.


0

macOS에서의 설정은 다음과 같습니다 ( .zshrc또는 .bash_profilebash 사람들).

# 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

|| [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]기본값이기 때문에 일부는 맥 OS에 필요하다 /private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners. 그렇지 않으면 @Thomas Nyman의 포괄적 인 답변 $SSH_AUTH_SOCK이 항상 설정되어 있기 때문에 실패합니다 .

그런 다음 .zlogout(또는 .bash_logoutbash 사람들을 위해) :

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

macOS Mojave 10.14.5에서 테스트

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.