여러 로그인 세션에서 동일한`ssh-agent` 공유


61

주어진 사용자 (예 : 나)의 모든 로그인이 동일한 ssh-agent를 사용하도록하는 편리한 방법이 있습니까? 이 작업을 대부분 수행하기 위해 스크립트를 해킹했지만 방금 놓친 방법이 있다고 생각했습니다. 또한 그 이후로이 웹 사이트와 같은 컴퓨팅 기술의 놀라운 발전이있었습니다.

여기 목표는

  • SSH를 통해 또는 gdm / kdm / etc에서 시작된 그래픽 세션 또는 콘솔에서 관계없이 박스에 로그인 할 때마다 :
    • 내 사용자 이름에 현재 ssh-agent실행중인 것이 없으면 시작되고 환경 변수가 내보내지고 ssh-add호출됩니다.
    • 그렇지 않으면 기존 에이전트의 좌표가 로그인 세션의 환경 변수로 내보내집니다.

이 기능은 문제의 상자 ssh가 세 번째 상자에 들어갈 때 중계 점으로 사용될 때 특히 유용 합니다. 이 경우 ssh를 입력 한 후 수행 할 때마다 개인 키의 암호를 입력하지 않아도됩니다 git push.

아래의 스크립트는 X가 충돌했을 때 최근에 멈췄다가 다른 그래픽 세션을 시작했지만 최근에 안정적으로 수행합니다. 해당 인스턴스에서 다른 문제가 발생했을 수 있습니다.

여기 내 나쁜 대본이 있습니다. 나는 이것을 내 출처에서 얻습니다 .bashrc.

# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.

mkdir -p "$HOME/etc/ssh";

function ssh-procure-launch-agent {
    eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
    ssh-add;
}

if [ ! $SSH_AGENT_PID ]; then
  if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
    SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`; 
    if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
      # in this case the agent has already been launched and we are just attaching to it. 
      ##++  It should check that this pid is actually active & belongs to an ssh instance
      export SSH_AGENT_PID;
      SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
    else
      # in this case there is no agent running, so the socket file is left over from a graceless agent termination.
      rm ~/etc/ssh/ssh-agent-socket;
      ssh-procure-launch-agent;
    fi;
  else
    ssh-procure-launch-agent;
  fi;
fi;

더 좋은 방법이 있다고 말씀 해주세요. 또한 불일치 / Gaffe를 nitpick하지 마십시오 (예 : var물건 넣기 etc). 나는 이것을 얼마 전에 썼고 그 이후 많은 것을 배웠다.


1
KeyError : 'DWTFYWT'를 찾을 수 없습니다. WTFPLv2 을 의미 습니까?
grawity

@ grawity : 그 링크에 감사드립니다. FAQ는 저의 하루를 만들었습니다. 그런데 WTFPL을 사용하면 나도 할 수 있습니다 ... 물론 그렇습니다. 물론 가능합니다. 그러나 나는 할 수 있습니다. 그렇습니다. 가능합니다. 그렇습니다 그렇습니다! 하하하 하하하
돌팔이 키호테

@ grawity : 아니, 내가 당신이 생각하기를 바랐던 것입니다, mwahahaha.
intuited

답변:


25

내 변형을 믹스에 넣을 수도 있습니다.

function sshagent_findsockets {
    find /tmp -uid $(id -u) -type s -name agent.\* 2>/dev/null
}

function sshagent_testsocket {
    if [ ! -x "$(which ssh-add)" ] ; then
        echo "ssh-add is not available; agent testing aborted"
        return 1
    fi

    if [ X"$1" != X ] ; then
        export SSH_AUTH_SOCK=$1
    fi

    if [ X"$SSH_AUTH_SOCK" = X ] ; then
        return 2
    fi

    if [ -S $SSH_AUTH_SOCK ] ; then
        ssh-add -l > /dev/null
        if [ $? = 2 ] ; then
            echo "Socket $SSH_AUTH_SOCK is dead!  Deleting!"
            rm -f $SSH_AUTH_SOCK
            return 4
        else
            echo "Found ssh-agent $SSH_AUTH_SOCK"
            return 0
        fi
    else
        echo "$SSH_AUTH_SOCK is not a socket!"
        return 3
    fi
}

function sshagent_init {
    # ssh agent sockets can be attached to a ssh daemon process or an
    # ssh-agent process.

    AGENTFOUND=0

    # Attempt to find and use the ssh-agent in the current environment
    if sshagent_testsocket ; then AGENTFOUND=1 ; fi

    # If there is no agent in the environment, search /tmp for
    # possible agents to reuse before starting a fresh ssh-agent
    # process.
    if [ $AGENTFOUND = 0 ] ; then
        for agentsocket in $(sshagent_findsockets) ; do
            if [ $AGENTFOUND != 0 ] ; then break ; fi
            if sshagent_testsocket $agentsocket ; then AGENTFOUND=1 ; fi
        done
    fi

    # If at this point we still haven't located an agent, it's time to
    # start a new one
    if [ $AGENTFOUND = 0 ] ; then
        eval `ssh-agent`
    fi

    # Clean up
    unset AGENTFOUND
    unset agentsocket

    # Finally, show what keys are currently in the agent
    ssh-add -l
}

alias sagent="sshagent_init"

그리고 로그인 할 때마다 에이전트를 첨부 하고 싶을 때 (항상 그런 것은 아님) 그냥 입력하면 sagent됩니다.


2
if [ ! -x "$(which ssh-add)" ];if ! which ssh-add;또는 로 교체해야합니다 if ! command -v ssh-add. ( [단지 명령
뿐임

글쎄, 그렇게 할 수는 있지만 실제로 if ! which ssh-add > /dev/null경로가 인쇄되는 것을 방지 해야합니다 .이 시점에서 하나의 추가 명령 호출을 저장한다고 생각하지만 실제로는 확실하지 않습니다.
Zed

따라서 기본적으로 대답은 '아니요'입니다. 쓰레기. 글쎄, 이것은 내 핵보다 진화 된 것으로 보이므로 아마도 유용 할 것입니다. 그래도이 작업을 수행하는보다 체계적인 방법이 없다는 것이 매우 유용합니다.
intuited

요즘 모든 것을 리포지토리에 맞추기 위해 스크립트에 github 리포지토리를 설정했습니다 . 다시 감사합니다. 나는 라이센스 충분히 공식적인했다 희망 : ~ /
직관

상관 없어요 그러나 누군가가 개선 사항을 제출하면 여기에 의견을 말하십시오.
Zed

36

ssh -A [user@]remotehost

나는 이것이 당신이 찾고있는 것이라고 생각합니다. ssh-agent를 ssh forward 실행시 -A 스위치를 사용하십시오. 유스 케이스는 다음과 같습니다.

github를 가리키는 원격 서버와 함께 git repos가있는 원격 서버가 있습니다. 화면 세션에서 ssh-agent를 실행하지 않고 "git pull origin master"를 수행하려면 키의 암호를 입력해야합니다. 멍청 아! 또한 원격 서버에 개인 키가 설치되어 있어야합니다. more Boooo!

대신 ssh -A [user@]remotehost로컬에서 실행되는 ssh-agent를 따라 단순히 패스 를 사용하십시오 . 이제 더 이상 원격 호스트에도 개인 키가 없어도됩니다. ssh-agent로 스크립팅을 할 필요가 없다고 생각합니다.


4
이것에 대해 몰랐지만이 질문에 나아 갔을 때 내가 찾던 것이 었습니다.
Will McCutchen 님이

1
이것은 내가 찾던 것보다 훨씬 좋습니다! 좋은 답변입니다!
WhyNotHugo

1
참조 man 5 ssh_config에 대한 ForwardAgent구성 설정. 기본적으로 에이전트 전달을 활성화하여 -A인수 가 필요 없습니다 . 에이전트 전달을 사용하기 전에 원격 시스템의 다른 권한있는 사용자가 전달 된 에이전트 소켓에 액세스 할 수있는 보안 위험이 있습니다. 매뉴얼 페이지에도 언급되어 있습니다. 여기에 잘 설명되어 있습니다 .
starfry

서버에서 AllowAgentForwarding 옵션을 yes로 설정해야한다고 생각합니다.
Ziofil

20

Cygwin에서도 작동하는 멋진 기능이 있습니다.

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 -efp ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

.bash_profile 또는 .bashrc에 추가하십시오.

출처 : http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html


윈도우 용 Git Bash (mingw64) 와도 잘 작동
Dolphin

1
${SSH_ENV}할 필요가 "${SSH_ENV}"귀하의 Windows 사용자 이름에 공백이있는 경우
rgvcorley

이 답변은 인터넷에서 수신 거부되는 것 같습니다. 여기에 훨씬 더 큰 stackoverflow 스레드가 있습니다. 가장 좋고 간단한 방법 IMHO.
Luke Davis


6

최근에 다음을 사용하기 시작했습니다.

https://github.com/ccontavalli/ssh-ident

내가해야 할 일은 추가하는 것입니다.

  alias ssh=/path/to/ssh-ident

내 .bashrc 파일에서. 스크립트는 다음을 처리합니다.

  • 에이전트가 처음 필요할 때 작성
  • 필요에 따라 필요한 키를로드
  • 여러 로그인 세션에서 에이전트 공유
  • 온라인에서 사용하는 각각의 '신분'에 대해 하나씩 여러 에이전트를 관리하고 내가 연결하는 호스트 또는 현재 작업 디렉토리에 따라 올바른 에이전트를 사용하십시오.

ssh-ident는 환상적입니다! 미리 키를 잠금 해제하지 않고 ssh를 시도하면 키가 잠금 해제되고 에이전트가로드됩니다. 이것은 키 타임 아웃을 유용하게 만듭니다. 더 중요한 것은 에이전트를 다른 용도로 분리하여 유지하는 것입니다 (주요 보안 위험; 한 머신의 루트는 현재 에이전트가 키를 가진 다른 모든 머신에 대한 액세스 수준을 갖습니다!)
00prometheus

5

나는 가능한 한 간단하게 유지하는 것을 선호 : (니펫 ~/.profile)

check-ssh-agent() {
    [ -S "$SSH_AUTH_SOCK" ] && { ssh-add -l >& /dev/null || [ $? -ne 2 ]; }
}

# attempt to connect to a running agent
check-ssh-agent || export SSH_AUTH_SOCK="$(< ~/.tmp/ssh-agent.env)"
# if agent.env data is invalid, start a new one
check-ssh-agent || {
    eval "$(ssh-agent -s)" > /dev/null
    echo "$SSH_AUTH_SOCK" > ~/.tmp/ssh-agent.env
}

-a전에는 사용하지 않았지만 더 쉬울 수 있습니다.

check-ssh-agent || export SSH_AUTH_SOCK=~/.tmp/ssh-agent.sock
check-ssh-agent || eval "$(ssh-agent -s -a ~/.tmp/ssh-agent.sock)" > /dev/null

좋은. 내 대답에서 다소 단순화했습니다 (아래).
Ether

2

필자의 경우 PowerShell에 posh-git 설정이 있고 cygwin이 동일한 ssh-agent를 사용하기를 원했습니다. 다른 tmp 폴더를 사용하기 때문에 경로 조작을해야했고 생성 된 .env 파일은 BOM 및 CR \ LF가있는 UTF16이므로 처리하기가 재미있었습니다. cygwin에서 사용하는 .bashrc에 다음을 추가하면 작동합니다.

# Connect to ssh-agent started by posh-git
SSH_AGENT_ENV=$(cygpath "$LOCALAPPDATA\Temp")
if [ -z $SSH_AUTH_SOCK ] && [ -z $SSH_TTY ]; then  # if no agent & not in ssh
  if [ -f "$SSH_AGENT_ENV/.ssh/SSH_AUTH_SOCK.env" ]; then
    AUTH_SOCK=$(iconv -c -f UTF-16LE -t US-ASCII "$SSH_AGENT_ENV/.ssh/SSH_AUTH_SOCK.env" | tr -d '\r\n')
    export SSH_AUTH_SOCK="${AUTH_SOCK/\/tmp/$SSH_AGENT_ENV}"
    ssh-add -l > /dev/null
    if [ $? = 2 ] ; then
      echo "Failed to setup posh-git ssh-agent using $AUTH_SOCK"
      unset SSH_AUTH_SOCK
    else
      echo "Found posh-git ssh-agent $AUTH_SOCK"
    fi
  else #Start new agent if you want (not shared by posh-git)
    echo "failed to setup posh-git ssh-agent"
    #eval `ssh-agent -s` > /dev/null
  fi
fi

1

다시 한 번 .bash_profile을 입력하고 로그온시 기본 키를 추가하도록 요청하는 예입니다. 필자의 경우 전달은 옵션이 아니었다.

do-ssh-agent() {
  # function to start the ssh-agent and store the agent details for later logon
  ssh-agent -s > ~/.ssh-agent.conf 2> /dev/null
  . ~/.ssh-agent.conf > /dev/null
}

# set time a key should be kept in seconds
keyage=3600

if [ -f ~/.ssh-agent.conf ] ; then
  . ~/.ssh-agent.conf > /dev/null
  ssh-add -l > /dev/null 2>&1
  # $?=0 means the socket is there and it has a key
  # $?=1 means the socket is there but contains no key
  # $?=2 means the socket is not there or broken
  stat=$?
  if [ $stat -eq 1 ] ; then
    ssh-add -t $keyage > /dev/null 2>&1
  elif [ $stat -eq 2 ] ; then
    rm -f $SSH_AUTH_SOCK
    do-ssh-agent
    ssh-add -t $keyage > /dev/null 2>&1
  fi
else
  do-ssh-agent
  ssh-add -t $keyage > /dev/null 2>&1
fi

1

이것은 내 솔루션이며 https://superuser.com/a/141233/5255 (이 스레드에서)에서 수정되었습니다 .

# attempt to connect to a running agent - cache SSH_AUTH_SOCK in ~/.ssh/
sagent()
{
    [ -S "$SSH_AUTH_SOCK" ] || export SSH_AUTH_SOCK="$(< ~/.ssh/ssh-agent.env)"

    # if cached agent socket is invalid, start a new one
    [ -S "$SSH_AUTH_SOCK" ] || {
        eval "$(ssh-agent)"
        ssh-add -t 25920000 -K ~/.ssh/id_rsa
        echo "$SSH_AUTH_SOCK" > ~/.ssh/ssh-agent.env
    }
}

1

~ / ssh-agent.sh 파일 생성

agent_out_file="$HOME/ssh-agent.out"

function initialize {
    pgrep ssh-agent && kill $(pgrep ssh-agent)
    ssh-agent -s > $agent_out_file 
    . $agent_out_file
}

pgrep ssh-agent
if [ $? -eq 0 ]; then # ssh agent running
    ssh-add -l > /dev/null 2>&1
    status=$?
    if [ $status -eq 0 ]; then # can connect to ssh agent and keys available
        echo nothing to do
    elif [ $status -eq 1 ]; then # can connect to ssh agent and no keys available
        echo nothing to do
    elif [ $status -eq 2 ]; then # cannot connect to ssh agent
        . $agent_out_file
    fi
else # ssh agent not running
    initialize   
fi

.bashrc에 파일을 포함

. ~/ssh-agent.sh

0

이것은 내가 추가 한 것입니다. 먼저 에이전트가 실행 중인지 확인합니다. 예인 경우 에이전트를 작성하지 않으면 적절한 환경을 설정합니다. 또한 추가 에이전트 작성을 제거합니다.

그냥 넣어 .bashrc

function start_agent() {
    killall ssh-agent  2> /dev/null
    ssh-agent | sed 's/ Agent pid//' > $SSH_ENV
    . $SSH_ENV > $SSH_PID_FILE
    ssh-add ~/.ssh/bb_readonly_rsa 2> /dev/null
}

mkdir -p "$HOME/.ssh/agent"
SSH_ENV="$HOME/.ssh/agent/env"
SSH_PID_FILE="$HOME/.ssh/agent/pid"

if [[ -e $SSH_PID_FILE ]]; then
    SSH_PID=$(< $SSH_PID_FILE) 
    PROCESS=$(ps -p $SSH_PID -o comm=)

    if [[ $PROCESS == 'ssh-agent' ]]; then
        . $SSH_ENV > $SSH_PID_FILE
    else 
        start_agent
    fi  
else
    start_agent
fi

0

내 .bashrc에서 직접 가져온이 문제에 대한 변형도 있습니다.

# File for storing SSH agent information
OSH=".agent.${HOSTNAME}"

# Test if an agent file exists
if [ -f ${OSH} ];

    # We have one, so let's use it
    then eval `cat ${OSH}` >/dev/null

else

    # No file exists, so we must spawn a new agent
    eval `ssh-agent | tee ${OSH}` >/dev/null

fi

# Try to list agent keys
ssh-add -l &>/dev/null

# Determine the agent status
case $? in

    # Current and SSH keys installed, nothing to do here
    0) ;;

    # Current but no SSH keys installed, so we must add them
    1) ssh-add ;;

    # Stale, so we must redo from scratch with a new agent, then add keys
    *) eval `ssh-agent | tee ${OSH}` >/dev/null && ssh-add ;;

esac

이 솔루션은 SSH 에이전트 정보 사본을 홈 디렉토리에 저장합니다. 여러 호스트간에 공유 될 수있는 NFS 자동 마운트 된 홈 디렉토리가있는 경우, 호스트 이름은 파일 이름의 일부로 사용되어 호스트를 구별하므로 한 시스템에서 로그인하면 다른 시스템에서 사용중인 에이전트 파일을 방해하지 않습니다.

행동:

1) 최초 사용자 세션에 키 암호 문구가 표시됩니다.

2) 두 번째, 세 번째 및 네 번째 (기타) 세션은 첫 번째에 추가 된 SSH 에이전트 및 키를 상속합니다.

3) 에이전트가 종료되거나 충돌하면 첫 번째 후속 세션에서 새 에이전트를 작성하고 새 에이전트 파일로 에이전트 파일을 겹쳐 쓰고 키 비밀번호 문구를 다시 입력하라는 메시지가 표시됩니다. 이후에 생성 된 세션은 새 SSH 에이전트가 계속 실행되는 한 시나리오 2)와 같이 작동합니다.


0

(이것은 게시물 2를 가리킴, 코멘트를 추가 할 수 없었습니다)

@raghavan : 귀하의 예는 유용하지만 다음 두 줄을 변경하는 것이 좋습니다.

pgrep ssh-agent

pgrep -u $ USER ssh-agent> / dev / null

따라서 현재 사용자로 실행중인 에이전트 만 발견되고 pid는 화면 (에코 너)에 에코되지 않습니다.

또한 $ HOME / ssh-agent.out을 $ HOME / .ssh-agent.out으로 변경하는 것을 제안합니다

문안 인사


0

원래 솔루션과 여러 가지 제안 된 솔루션을 읽었지만 자체 사용을 위해 프로세스를 단순화하기로 결정했습니다. 이것은 내 자신의 .bashrc에 추가 한 것입니다.

    # get active ssh-agent, or launch new
    SSH_AGENT_PID=$(ps -fC ssh-agent | grep "ssh-agent -a ${HOME}/.ssh/ssh-agent-socket" | awk '{print $2}')
    if [ -z "${SSH_AGENT_PID}" ]; then
      # If there is no ssh-agent running, we'll make sure one hasn't left a socket file dangling
      rm ${HOME}/.ssh/ssh-agent-socket &> /dev/null
      # And of course start one
      eval $(ssh-agent -a ${HOME}/.ssh/ssh-agent-socket)
    else
      # We found a process matching our requirements, so sticking with that
      export SSH_AGENT_PID
      export SSH_AUTH_SOCK="${HOME}/.ssh/ssh-agent-socket"
    fi

나는 여기에 몇 가지 가정을했다.

  • ~ / .ssh 디렉토리가 존재합니다.
  • 시스템에서 사용자 당 하나의 ssh-agent 소켓 만 필요합니다.
  • HOME 환경 변수가 설정되어 있습니다 (왜 그렇지 않습니까?).
  • 프로세스가 실행되는 상황을 수동으로 처리하지만 어떤 이유로 지정된 소켓 파일을 사용하지 않습니다.

대체로 나는 그것이 단순한 해결책이라고 생각합니다.


0

나는 종종 여러 개의 ssh-agent프로세스를 실행하고 소켓 파일 이름 내의 PID가 실제로 running의 PID와 일치하지 않는다는 것을 ssh-agent알았으므로 위의 많은 예제를 기반으로 이러한 조건에서 복구하려고 시도했습니다.

단일 함수이며 사용자 ID가있는 경우 Zsh 변수를 사용 하고 조금 더 /tmp제한 find(1)하여 거대한 디렉토리를 구문 분석하는 데 더 적은 시간을 소비하려고합니다 .

여전히 오류가 발생하기 쉽고 복잡 할 수 있지만 일부 커서 테스트는 주로 내 사용 사례에서 작동한다는 것을 나타냅니다.

attach_ssh_agent () {
  [-n "$ SSH_AGENT_PID"] 인 경우; 그때
    ssh-add -l> / dev / null
    ret = $?
    만약 [$ ret -ge 2]; 그때
      echo "에이전트 pid $ SSH_AGENT_PID가 유용하지 않습니다 (ret = $ ret)-killing ..."
      $ SSH_AGENT_PID를 죽이십시오
      $ SSH_AGENT_PID 설정 해제
    elif [$ ret = 1]; 그때
      echo "에이전트 pid $ SSH_AGENT_PID가 유용하지 않습니다 (ret = $ ret)-시드 할 것입니다 ..."
    그밖에
      에코 "에이전트 pid $ SSH_AGENT_PID"
      반환
    fi
  fi
  [-S "$ SSH_AUTH_SOCK"] 인 경우; 그때
    ssh-add -l> / dev / null
    ret = $?
    [$ ret = 2]이면; 그때
      echo "소켓 $ SSH_AUTH_SOCK가 종료되었습니다-삭제 중 ..."
      rm -f $ SSH_AUTH_SOCK
      SSH_AUTH_SOCK 설정 해제
    elif [$ ret = 1]; 그때
      echo "Socket $ SSH_AUTH_SOCK는 키가없는 에이전트를 가리 킵니다 ..."
      ssh-add
    그밖에
      echo "ssh-agent $ SSH_AUTH_SOCK 발견 (ret = $ ret)"
      반환
    fi
  fi
  sf의 $ (find / tmp / -mindepth 2 -maxdepth 2 -uid $ {UID :-$ (id -u)} -path '/tmp/ssh-*/agent.*'-type s); 하다
    테스트 -r $ sf || 계속하다
    SSH_AUTH_SOCK = $ sf 내보내기
    SSH_AGENT_PID = $ (기본 이름 $ SSH_AUTH_SOCK | cut -d. -f2)
    # 다른 프로세스 포크와 경쟁
    시도 = 50
    [$ try -gt 0] 동안; 하다
      try = $ (($ try-1))
      내보내기 SSH_AGENT_PID = $ (($$ SSH_AGENT_PID + 1))
      echo "$ SSH_AUTH_SOCK 테스트-> $ SSH_AGENT_PID"
      ssh_agent_running = $ (ps -u $ USER | grep ssh-agent)
      만약 [-z "$ ssh_agent_running"]; 그때
        echo "Socket $ SSH_AUTH_SOCK에 실행중인 에이전트에 대한 링크가 없습니다. 삭제 중 ..."
        rm -f $ SSH_AUTH_SOCK
        계속하다
      fi
      echo "$ ssh_agent_running"| \
           awk '$ 1 =='$ SSH_AGENT_PID '{
                  found = 1;
                  이탈 (0);
              }
              종료 {
                  if (! found) {
                      print "PID '$ SSH_AGENT_PID'실행을 찾지 못했습니다";
                      이탈 (1);
                  }
              } '; 그때
        ssh-add -l> / dev / null
        ret = $?
        만약 [$ ret -ge 2]; 그때
          echo "Socket $ SSH_AUTH_SOCK에 $ SSH_AGENT_PID의 유용한 에이전트에 대한 링크가 없습니다-삭제 중 ..."
          rm -f $ SSH_AUTH_SOCK
          $ SSH_AGENT_PID를 죽이십시오
          SSH_AGENT_PID 설정 해제
          계속 2
        elif [$ ret = 1]; 그때
          echo "Socket $ SSH_AUTH_SOCK에는 $ SSH_AGENT_PID에서 덜 유용한 에이전트에 대한 링크가 포함되어 있습니다-시드 ..."
          ssh-add
          만약 ! ssh-add -l> / dev / null; 그때
            echo "Socket $ SSH_AUTH_SOCK에는 여전히 $ SSH_AGENT_PID의 유용하지 않은 에이전트에 대한 링크가 포함되어 있습니다. 중단 중입니다."
            반환
          그밖에
            단절
          fi
        그밖에
          단절
        fi
      그밖에
# echo "소켓 $ SSH_AUTH_SOCK을 에이전트 PID $ SSH_AGENT_PID와 일치시킬 수 없습니다. 건너 뛰는 중 ..."
        계속하다
      fi
    끝난
    [$ try -gt 0]이면; 그때
      echo "ssh-agent $ SSH_AUTH_SOCK 발견"
      에코 "에이전트 pid $ SSH_AGENT_PID"
      반환
    fi
  끝난
  만약 [-n "$ try"-a -n "$ SSH_AUTH_SOCK"-a -n "$ ssh_agent_running"]; 그때
    echo "우리는 여러 번 시도했지만 $ SSH_AUTH_SOCK를 실행중인 에이전트와 일치시킬 수 없습니다."
    에코 "$ ssh_agent_running"
    echo "남은 음식을 남겨두고 새 요원을 시작하는 중 ..."
  fi
  평가 $ (ssh-agent -t 28800)
  ssh-add
}

0

여기에 내 스핀이 있습니다. 내 .bash_profile 에서 아래 스크립트 를 ' 소스 '합니다 .

MYAGENTS=(`pgrep -U $USER -f ^ssh-agent$|sort -n`)

echo "Found ${#MYAGENTS[@]} ssh-agents."

# Let's try to take over the agents, like we do everynight Pinky!
if [[ "${MYAGENTS[@]}" ]];then
  KEEPER=${MYAGENTS[0]}
  echo KEEPER: $KEEPER
  OUTCAST=${MYAGENTS[@]:1}
  [[ "$OUTCAST" ]] && { echo "Goodbye agent $OUTCAST"; kill $OUTCAST; }
  SSH_AUTH_SOCK=`awk '/tmp\/ssh/ {print $NF}' /proc/$KEEPER/net/unix`
  export SSH_AUTH_SOCK;
  SSH_AGENT_PID=$KEEPER; export SSH_AGENT_PID;
else
  NEWAGENT="`ssh-agent`"
  echo $NEWAGENT;
  eval $NEWAGENT
fi

ssh-add -l | grep "The agent has no identities" && ssh-add

0

다음은 항상 동일한 ssh-agent를 재사용하거나 ssh-agent가 실행되지 않는 경우 시작하는 간단한 스크립트입니다. 핵심은 -a옵션을 사용하여 동일한 소켓 이름을 사용하는 것입니다. 그렇지 않으면 기본적으로 매번 임의의 소켓 이름을 선택합니다. 이 3 줄을 1 줄 별칭으로 쉽게 결합 할 수 있습니다.

# set SSH_AUTH_SOCK env var to a fixed value
export SSH_AUTH_SOCK=~/.ssh/ssh-agent.sock

# test whether $SSH_AUTH_SOCK is valid
ssh-add -l 2>/dev/null >/dev/null

# if not valid, then start ssh-agent using $SSH_AUTH_SOCK
[ $? -ge 2 ] && ssh-agent -a "$SSH_AUTH_SOCK" >/dev/null

출처

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