Programing

로그인시 ssh-agent 시작

lottogame 2020. 4. 21. 08:17
반응형

로그인시 ssh-agent 시작


SSH 별칭을 사용하여 Bitbucket.com에서 원격 Git 저장소로 사이트를 가져 왔습니다. 서버에서 ssh-agent를 수동으로 시작할 수 있지만 SSH를 통해 로그인 할 때마다이 작업을 수행해야합니다.

ssh-agent를 수동으로 시작합니다.

eval ssh-agent $SHELL

그런 다음 에이전트를 추가합니다.

ssh-add ~/.ssh/bitbucket_id

그런 다음 내가 할 때 나타납니다.

ssh-add -l

그리고 나는 잘 지냅니다. 로그인 할 때마다이 프로세스를 자동화 할 수있는 방법이 있습니까? 서버가 RedHat 6.2 (Santiago)를 실행 중입니다.


이 기사를 살펴보십시오. 이것이 매우 유용하다는 것을 알 수 있습니다.

http://mah.everybody.org/docs/ssh

위의 링크가 언젠가 사라지는 경우를 대비하여 아래 솔루션의 주요 부분을 캡처하고 있습니다.

Daniel Starin을 통해 Joseph M. Reagle의 솔루션 :

이 다음을 귀하의 .bash_profile

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

이 버전은 이미 ssh-agent를 시작했는지 확인하고 찾을 수없는 경우 시작하여 다음에 시작할 때 사용할 수 있도록 설정을 저장하기 때문에 특히 좋습니다. 껍질.


Arch Linux에서 다음은 실제로 훌륭하게 작동합니다 (모든 시스템 기반 배포판에서 작동해야 함).

다음을 넣어 시스템 사용자 서비스를 작성하십시오 ~/.config/systemd/user/ssh-agent.service.

[Unit]
Description=SSH key agent

[Service]
Type=forking
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

소켓 ( .bash_profile, .zshrc, ...)에 대한 환경 변수를 갖도록 설정 쉘 :

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

서비스를 활성화하면 로그인시 자동으로 시작되고 시작됩니다.

systemctl --user enable ssh-agent
systemctl --user start ssh-agent

ssh 구성 파일에 다음 구성 설정을 추가하십시오 ~/.ssh/config(SSH 7.2부터 작동 함).

AddKeysToAgent  yes

이렇게하면 ssh 클라이언트가 항상 실행중인 에이전트에 키를 추가하도록 지시하므로 미리 ssh-add 할 필요가 없습니다.


오래된 질문이지만 비슷한 상황을 겪었습니다. 위의 답변이 필요한 것을 완전히 달성했다고 생각하지 마십시오. 빠진 조각은 keychain; 아직 설치하지 않은 경우 설치하십시오.

sudo apt-get install keychain

그런 다음 다음 줄을 ~/.bashrc

eval $(keychain --eval id_rsa)

이것은 ssh-agent실행 중이 아닌 경우 시작하고 , 실행 중이면 연결하고, ssh-agent환경 변수를 쉘에로드하고 ssh 키를로드합니다.

로드하려는 id_rsa개인 키로 변경하십시오 ~/.ssh.

참고

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt


허용되는 솔루션에는 다음과 같은 단점이 있습니다.

  • 유지하기가 복잡합니다.
  • 오류 또는 보안 위반으로 이어질 수있는 저장 파일을 평가합니다.
  • 에이전트를 시작하지만 키를 점화 상태로 두는 것과 거의 비슷한 에이전트를 중지하지 않습니다.

키에 암호를 입력하지 않아도되는 경우 다음 해결 방법을 제안합니다. .bash_profile 맨 끝에 다음을 추가 하십시오 (필요에 따라 키 목록 편집).

exec ssh-agent $BASH -s 10<&0 << EOF
    ssh-add ~/.ssh/your_key1.rsa \
            ~/.ssh/your_key2.rsa &> /dev/null
    exec $BASH <&10-
EOF

다음과 같은 장점이 있습니다.

  • 훨씬 간단한 해결책;
  • bash 세션이 종료되면 에이전트 세션이 종료됩니다.

가능한 단점이 있습니다.

  • 대화식 ssh-add명령은 하나의 세션에만 영향을 미치며 실제로는 매우 비정형적인 상황에서만 문제가됩니다.
  • 암호를 입력해야하는 경우 사용할 수 없습니다.
  • 시작된 셸은 비 로그인이됩니다 (AFAIK에 영향을 미치지 않음).

ssh-agent메모리 나 CPU 시간이 더 걸리지 않기 때문에 여러 프로세스가 단점이 아닙니다.


이것을에 추가 ~/.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계속 실행되는 한 계속 재사용 됩니다.


그래서 위에서 설명한 접근 방식을 사용했지만 마지막 bash 세션이 끝나면 에이전트가 죽는 것을 선호합니다. 이것은 다른 솔루션보다 약간 길지만 선호하는 방법입니다. 기본 아이디어는 첫 번째 bash 세션이 ssh-agent를 시작한다는 것입니다. 그런 다음 각 추가 bash 세션은 구성 파일 ( ~/.ssh/.agent_env)을 확인합니다. 그것이 있고 세션이 실행 중이면 환경을 소싱하고 소켓 파일에 대한 하드 링크를 만듭니다 /tmp(원래 소켓 파일과 동일한 파일 시스템에 있어야 함). bash 세션이 종료되면 각각 자체 하드 링크가 삭제됩니다. 마지막 세션을 종료하면 하드 링크에 2 개의 링크 (하드 링크 및 원본)가 있고 프로세스 자체 소켓이 제거되고 프로세스가 종료되면 0이 발생하여 마지막 bash 세션이 종료 된 후 깨끗한 환경이 유지됩니다.

# Start ssh-agent to keep you logged in with keys, use `ssh-add` to log in
agent=`pgrep ssh-agent -u $USER` # get only your agents           
if [[ "$agent" == "" || ! -e ~/.ssh/.agent_env ]]; then
    # if no agents or environment file is missing create a new one
    # remove old agents / environment variable files
    kill $agent running
    rm ~/.ssh/.agent_env 

    # restart
    eval `ssh-agent` 
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ~/.ssh/.agent_env             
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ~/.ssh/.agent_env             
fi

# create our own hardlink to the socket (with random name)           
source ~/.ssh/.agent_env                                                    
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock                                        
ln -T $SSH_AUTH_SOCK $MYSOCK                                                
export SSH_AUTH_SOCK=$MYSOCK                                                

end_agent()                                                                     
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`                             
    if [[ "$nhard" -eq 2 ]]; then                                               
        rm ~/.ssh/.agent_env                                                    
        ssh-agent -k                                                            
    fi                                                                          
    rm $SSH_AUTH_SOCK                                                           
}                                                                               
trap end_agent EXIT                                                             
set +x              

또 다른 솔루션을 추가하기 위해 : P, @spheenik과 @ collin-anderson의 솔루션을 함께 사용했습니다.

 # Ensure that we have an ssh config with AddKeysToAgent set to true
 if [ ! -f ~/.ssh/config ] || ! cat ~/.ssh/config | grep AddKeysToAgent | grep yes > /dev/null; then
     echo "AddKeysToAgent  yes" >> ~/.ssh/config
 fi
 # Ensure a ssh-agent is running so you only have to enter keys once
 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

좀 더 우아하지만 간단하고 읽기 쉬울 수 있습니다. 이 솔루션 :

  • 보장하지만은 AddKeysToAgent yes키가 자동으로 사용에 추가됩니다 귀하의 ssh 설정에
  • 로그인시 비밀번호 문구를 입력하라는 메시지가 표시되지 않습니다 (다시 한번 비밀번호 문구 입력은 처음 사용할 때 발생 함)
  • ssh 에이전트가 아직 시작되지 않은 경우 자동으로 시작합니다.

댓글 환영합니다 :)


이것을 / etc / profile-시스템 전체 (또는 사용자 로컬 .profile 또는 .bash_profile)에 추가하여 해결했습니다.

# SSH-AGENT 
#!/usr/bin/env bash
SERVICE='ssh-agent'
WHOAMI=`who am i |awk '{print $1}'`

if pgrep -u $WHOAMI $SERVICE >/dev/null
then
echo $SERVICE running.
else
echo $SERVICE not running.
echo starting
ssh-agent > ~/.ssh/agent_env
fi
. ~/.ssh/agent_env

사용자를 위해 실행되지 않으면 새 ssh-agent를 시작하거나 실행중인 경우 ssh-agent env 매개 변수를 재설정합니다.


너무 늦어서 죄송합니다.

피쉬 쉘 사용자는 스크립트사용 하여 동일한 작업을 수행 할 수 있습니다 .

# content has to be in .config/fish/config.fish
# if it does not exist, create the file
setenv SSH_ENV $HOME/.ssh/environment

function start_agent                                                                                                                                                                    
    echo "Initializing new SSH agent ..."
    ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
    echo "succeeded"
    chmod 600 $SSH_ENV 
    . $SSH_ENV > /dev/null
    ssh-add
end

function test_identities                                                                                                                                                                
    ssh-add -l | grep "The agent has no identities" > /dev/null
    if [ $status -eq 0 ]
        ssh-add
        if [ $status -eq 2 ]
            start_agent
        end
    end
end

if [ -n "$SSH_AGENT_PID" ] 
    ps -ef | grep $SSH_AGENT_PID | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    end  
else
    if [ -f $SSH_ENV ]
        . $SSH_ENV > /dev/null
    end  
    ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    else 
        start_agent
    end  
end

당신의 대답처럼 많이. cygwin / linux호스트 작업 이 훨씬 쉬워졌습니다. 시작 기능과 끝 기능을 결합하여 안전하게 만들었습니다.

SSH_ENV="$HOME/.ssh/.agent_env"

function start_agent {
    echo "Initialising new SSH agent..."

    eval `/usr/bin/ssh-agent`
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ${SSH_ENV}
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ${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

# create our own hardlink to the socket (with random name)
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln -T $SSH_AUTH_SOCK $MYSOCK
export SSH_AUTH_SOCK=$MYSOCK

end_agent()
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`
    if [[ "$nhard" -eq 2 ]]; then
        rm ${SSH_ENV}
        /usr/bin/ssh-agent -k
    fi
    rm $SSH_AUTH_SOCK
}
trap end_agent EXIT
set +x

다시 감사합니다

참고 URL : https://stackoverflow.com/questions/18880024/start-ssh-agent-on-login

반응형