programing

로그인 시 ssh-agent 시작

showcode 2023. 5. 25. 22:12
반응형

로그인 시 ssh-agent 시작

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

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

eval ssh-agent $SHELL

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

ssh-add ~/.ssh/bitbucket_id

그러면 제가 할 때 나타납니다.

ssh-add -l

저는 가도 좋습니다.로그인할 때마다 하지 않아도 되도록 이 과정을 자동화할 수 있는 방법이 있습니까?서버에서 RedHat 6.2(산티아고)를 실행 중입니다.

이 기사를 검토해 주십시오.이 기능은 매우 유용합니다.

https://web.archive.org/web/20210506080335/https ://mah.everybody.org/docs/ssh

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

Joseph M. Reagle이 Daniel Starin을 통해 작성한 이 솔루션:

다음을 추가합니다.

SSH_ENV="$HOME/.ssh/agent-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-에이전트를 이미 시작했는지 확인하고 찾을 수 없는 경우 시작하여 설정을 저장하므로 특히 유용합니다. 다음에 시작할 때 사용할 수 있도록 하기 때문에 특히 좋습니다.

Arch Linux에서 다음은 정말 잘 작동합니다(모든 systemd 기반 디스트리뷰터에서 작동해야 함).

systemd 사용자 서비스는 을 systemd에 서비스를 합니다.~/.config/systemd/user/ssh-agent.service:

[Unit]
Description=SSH key agent

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

[Install]
WantedBy=default.target

(socket 환경변수)를 셸 (Setup ).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 7SSH 7.2 버전):

AddKeysToAgent  yes

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

오래된 질문이지만, 저는 비슷한 상황을 마주쳤습니다.위의 답변이 필요한 것을 완전히 달성한다고 생각하지 마십시오.은 진빠작품은입니다.keychain설치할 수 있습니다.

sudo apt-get install keychain

나서 을 여러분의 런다음다추행다니에 하세요.~/.bashrc

eval $(keychain --eval id_rsa)

시합니다가 됩니다.ssh-agent 연결하고,하고, 합니다.ssh-agent환경 변수를 셸에 넣고 SSH 키를 로드합니다.

id_rsa 키인로는로에 있는 합니다.~/.ssh로드할 수 있습니다.

키 체인을 위한 유용한 옵션:

  • -q 모드
  • --noask시작할 때 암호를 묻지 말고 실제로 ssh 키가 사용될 때 온디맨드로 입력합니다.

언급

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

을 당신의 니추합다에 추가하세요.~/.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_profile very end(필요에 따라 키 목록 편집):

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에 영향을 미치지 않음)이 됩니다.

로 여러 개의 고로몇 가지참▁notessh-agent프로세스는 더 많은 메모리나 CPU 시간을 소요하지 않기 때문에 단점이 아닙니다.

여러 소스에서 몇 가지 솔루션을 시도했지만 모두 문제가 너무 많은 것 같았습니다.마침내 저는 가장 쉬운 것을 찾았습니다 :)

아직 zsh와 oh-my-zsh에 익숙하지 않으면 설치합니다.당신은 그것을 좋아할 것입니다 :)

그런 다음 편집.zshrc

vim ~/.zshrc

찾아내다plugins사하도 섹및업트이데를 사용하도록 합니다.ssh-agent 예:

plugins=(ssh-agent git)

그게 다야!당신은 갖게 될 것입니다.ssh-agent됩니다.

또 다른 해결책을 추가하자면, 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 yesSSH 구성에 있으므로 키는 사용 시 자동으로 추가됩니다.
  • 로그인 시 암호를 입력하라는 메시지가 표시되지 않음(다시 말하지만, 처음 사용할 때 한 번만 입력하는 암호가 발생함)
  • SSH-에이전트가 아직 시작되지 않은 경우 자동으로 SSH-에이전트 시작

댓글 환영합니다 :)

그래서 저는 위에서 설명한 접근법을 사용하곤 했지만, 저는 마지막 배시 세션이 끝나면 에이전트가 죽는 것을 선호합니다.이는 다른 솔루션보다 약간 길지만 제가 선호하는 접근 방식입니다.기본적으로 첫 번째 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              

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

# 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

이것을 /etc/profile - system wide(또는 user local.profile 또는 .bash_profile)에 추가하여 해결했습니다.

# SSH-AGENT 
#!/usr/bin/env bash
SERVICE='ssh-agent'
WHOAMI=`whoami |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 매개 변수를 재설정합니다.

저는 이것을 위해 ssh-ident 도구를 사용합니다.

맨 페이지에서:

ssh-ident - ssh-agent를 시작하고 필요에 따라 ID를 로드합니다.

저는 당신의 답변이 매우 마음에 듭니다.그것은 일을 만들었습니다.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

반응형