it-swarm-ko.tech

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

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

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

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

이것을 ~/.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를 계속 재사용합니다.

101
Collin Anderson

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

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

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

이 모든 것을 말하면 암호로 보호되지 않은 ssh 키를 사용할 수 있습니다 (hit Enter 키 생성 중에 비밀번호를 요청하는 경우). 비밀번호가 없으므로 ssh-agent는 (캐시하지 않기 위해) 요청하지 않아도됩니다.

7
umläute

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 -
    
  • 또는 named pipe 접근 방식 :

    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 을 참조하십시오.

5
kenorb

로그인 할 때 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에 따라 다름)
4
Johnny Wong

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

zsh Shell에서만 작동합니다.

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

SSH 용 싱글 사인온 솔루션으로 나를 pam_ssh .

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

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


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

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

1
Michael
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
steampowered

이것을 ~/.bashrc 파일 :

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

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

$ 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="[email protected]"

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

(암호가없는) 키를 추가하고 ssh-add X 에서 실행할 때에도 비밀번호를 묻지 않습니다.

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

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

0
Keith Cascio

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

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

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

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

0
cmc

암호 관리자로 해마를 실행중인 경우 ... 아마도 당신은; D

당신이 찾고있는 목표를 달성하는 또 다른 솔루션은 ssh 키를 해마에 추가하여 로그인시 자동 잠금 해제를 수행하는 것입니다. 이것의 가장 큰 장점은 gdm을 통해 로그인 한 후 또는 키에 비밀번호가 있어도 로그인 한 모든 키에 비밀번호를 입력 할 필요가 없다는 것입니다. 개인 키와 공개 키가 모두 필요합니다. 또한 해마의 명명 규칙을 따라야합니다. 기본값은 허용됩니다 (개인 키의 경우 id_rsa, 공개 키의 경우 id_rsa.pub ... privatekeyname and privatekeyname.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를 시도해야합니다. 그런 다음 해마는 암호로 그래픽으로 키를 잠금 해제하라는 메시지를 다시 표시하지만 (이것은 한 번만 발생합니다) 이번에는 조금 다르게 보일 것입니다. )로 로그인하고 옵션 을 제공하여 로그인시 키를 잠금 해제하려면 목표를 달성하려면이 옵션을 확인해야합니다.

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

0
enconn

MacOS에서의 설정은 다음과 같습니다 (.zshrc 또는 bash 사용자의 경우 .bash_profile).

# 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/"* ]]이므로 macOS에서 /private/tmp/com.Apple.launchd.SOMETHINGHERE/Listeners 부분이 필요합니다. 그렇지 않으면 $SSH_AUTH_SOCK가 항상 무언가로 설정되어 있기 때문에 @Thomas Nyman 종합 답변이 실패합니다.

그런 다음 .zlogout (또는 bash 사람들의 경우 .bash_logout)에서 :

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

MacOS Mojave 10.14.5에서 테스트

0
Samuel Prevost