Chia sẻ cùng một `ssh-agent` giữa nhiều phiên đăng nhập


61

Có cách nào thuận tiện để đảm bảo rằng tất cả thông tin đăng nhập từ một người dùng nhất định (ví dụ như tôi) sử dụng cùng một ssh-agent không? Tôi đã hack một kịch bản để làm cho công việc này hầu hết thời gian, nhưng tôi nghi ngờ rằng có một số cách để làm nó mà tôi vừa bỏ lỡ. Ngoài ra, kể từ thời điểm đó, đã có những tiến bộ đáng kinh ngạc trong công nghệ điện toán, ví dụ như trang web này.

Vì vậy, mục tiêu ở đây là

  • Bất cứ khi nào tôi đăng nhập vào hộp, bất kể là thông qua SSH hay trong phiên đồ họa bắt đầu từ gdm / kdm / etc hoặc tại bảng điều khiển:
    • nếu tên người dùng của tôi hiện không ssh-agentchạy, một tên được khởi động, các biến môi trường được xuất và ssh-addđược gọi.
    • mặt khác, tọa độ của tác nhân hiện có được xuất trong các biến môi trường của phiên đăng nhập.

Cơ sở này đặc biệt có giá trị khi hộp trong câu hỏi được sử dụng làm điểm chuyển tiếp khi sshđưa vào hộp thứ ba. Trong trường hợp này, nó tránh phải nhập cụm mật khẩu của khóa riêng mỗi khi bạn ssh vào và sau đó muốn, ví dụ, làm git pushhoặc làm gì đó.

Kịch bản được đưa ra dưới đây thực hiện điều này một cách đáng tin cậy, mặc dù nó đã bị hỏng gần đây khi X bị sập và sau đó tôi bắt đầu một phiên đồ họa khác. Có thể đã có sự sai lầm khác xảy ra trong trường hợp đó.

Đây là kịch bản xấu của tôi là tốt. Tôi nguồn này từ của tôi .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;

Xin vui lòng cho tôi biết có một cách tốt hơn để làm điều này. Ngoài ra, vui lòng không cắt xén những mâu thuẫn / gaffes (ví dụ: bỏ varđồ vào etc); Tôi đã viết điều này một thời gian trước đây và từ đó đã học được nhiều điều.


1
KeyError: 'Không tìm thấy DWTFYWT'; ý bạn là WTFPLv2 ?
grawity

@grawity: cảm ơn vì liên kết đó, Câu hỏi thường gặp của họ đã tạo nên ngày của tôi: Nhân tiện , với WTFPL, tôi cũng có thể ném Oh nhưng vâng, tất nhiên là bạn có thể. Nhưng tôi có thể vâng Có bạn có thể. Có thể có ! hahahahahaha
quixote quixote

@grawity: Không, đó chỉ là những gì tôi muốn bạn nghĩ, mwahahaha.
trực giác

Câu trả lời:


25

Tôi cũng có thể ném biến thể của riêng mình vào hỗn hợp:

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"

Và sau đó mỗi lần tôi đăng nhập, nếu tôi muốn có một đại lý kèm theo (mà tôi không luôn luôn như vậy), tôi chỉ cần gõ sagent.


2
if [ ! -x "$(which ssh-add)" ];nên được thay thế bằng if ! which ssh-add;hoặc if ! command -v ssh-add. (Hãy nhớ, [chỉ là một lệnh)
grawity

Chà, bạn có thể làm điều đó, nhưng thực sự cần phải if ! which ssh-add > /dev/nullngăn chặn đường dẫn được in, tại thời điểm đó tôi không thực sự chắc chắn rằng nó rõ ràng hơn, mặc dù tôi cho rằng nó sẽ giúp bạn tiết kiệm thêm một lệnh gọi.
Zed

Vì vậy, về cơ bản câu trả lời là không, sau đó. tào lao Vâng, điều này có vẻ được phát triển hơn so với hack của tôi, vì vậy có lẽ nó sẽ hữu ích. Điều kỳ lạ là không có cách nào có cấu trúc hơn để làm điều này, có vẻ như một cái gì đó sẽ khá hữu ích.
trực giác

Tôi rất phù hợp với việc tái hiện mọi thứ trong những ngày này, vì vậy tôi đã thiết lập một repo github cho kịch bản của bạn. Cảm ơn một lần nữa. Tôi hy vọng tôi đã đủ chính thức với việc cấp phép: ~ /
trực giác vào

Tôi không phiền Vui lòng bình luận ở đây nếu ai đó gửi cải tiến cho nó, mặc dù.
Zed

36

ssh -A [user@]remotehost

Tôi nghĩ rằng đây có thể là những gì bạn đang tìm kiếm. Sử dụng công tắc -A khi chạy ssh về phía trước ssh-agent của bạn. Đây là một usecase:

Tôi có một máy chủ từ xa có một số repo git trên đó với một điều khiển từ xa trỏ đến github. Nếu không có tác nhân ssh chạy trong phiên màn hình, tôi phải nhập cụm mật khẩu cho khóa của mình để thực hiện "git pull origin master". Booo! Ngoài ra, tôi phải cài đặt khóa riêng trên máy chủ từ xa - thêm Boooo!

Thay vào đó, chỉ cần sử dụng các ssh -A [user@]remotehostđường chuyền dọc theo ssh-agent đang chạy cục bộ của tôi. Bây giờ, tôi không còn cần khóa riêng của mình để tồn tại trên máy chủ từ xa. Tôi không tin rằng bạn cần phải thực hiện bất kỳ kịch bản nào với ssh-agent.


4
Không biết về điều này, nhưng hóa ra đó chính xác là những gì tôi đang tìm kiếm khi tôi tìm đường đến câu hỏi này.
Will McCutchen

1
Điều này thậm chí còn tốt hơn những gì tôi đang tìm kiếm! Câu trả lời chính xác!
WhyNotHugo

1
Xem thêm man 5 ssh_configđể ForwardAgentcài đặt cấu hình. Nó cho phép chuyển tiếp tác nhân theo mặc định, loại bỏ sự cần thiết cho -Ađối số. Trước khi sử dụng chuyển tiếp đại lý, hãy lưu ý rằng có một rủi ro bảo mật nơi người dùng đặc quyền khác trên máy từ xa có thể truy cập vào ổ cắm đại lý được chuyển tiếp. Điều này cũng được đề cập trên trang người đàn ông. Điều này được giải thích tốt ở đây .
starfry

Tuy nhiên, tôi nghĩ rằng tùy chọn AllowAgentForwarding phải được đặt thành có trên máy chủ
Ziofil

20

Đây là một cái khá hay cũng hoạt động trong 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

Thêm nó vào .bash_profile hoặc .bashrc của bạn

Nguồn: http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html


Cũng hoạt động tốt với Git Bash (mingw64) cho các cửa sổ
Cá heo

1
${SSH_ENV}cần phải có "${SSH_ENV}"nếu tên người dùng windows của bạn có một khoảng trống trong đó
rgvcorley

Câu trả lời này dường như đang nảy trên internet. Đây là một chủ đề stackoverflow lớn hơn nhiều . Cách tiếp cận tốt nhất / đơn giản nhất IMHO.
Luke Davis


6

Gần đây tôi đã bắt đầu sử dụng:

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

Tất cả tôi phải làm là thêm:

  alias ssh=/path/to/ssh-ident

Trong tệp .bashrc của tôi. Kịch bản chăm sóc:

  • tạo một tác nhân khi cần thiết
  • tải các phím cần thiết theo yêu cầu
  • chia sẻ đại lý qua nhiều phiên đăng nhập
  • quản lý nhiều tác nhân, một cho mỗi 'danh tính' mà tôi sử dụng trực tuyến và sử dụng đúng tác nhân dựa trên máy chủ tôi đang kết nối hoặc thư mục làm việc hiện tại.

ssh-nhận dạng là tuyệt vời! Nó mở khóa và tải tác nhân khi tôi cố gắng ssh thay vì phải mở khóa trước. Điều này làm cho thời gian chờ chính hữu ích. Quan trọng hơn, nó giữ cho các đại lý của tôi tách biệt cho các mục đích sử dụng khác nhau (rủi ro bảo mật lớn; root trên một máy có cấp độ truy cập của tôi với tất cả các máy khác mà đại lý hiện tại có khóa!)
00prometheus

5

Tôi thích giữ mọi thứ đơn giản nhất có thể: (đoạn trích từ ~/.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
}

Tôi đã không nghĩ đến việc sử dụng -atrước đây, nhưng nó có thể dễ dàng hơn:

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

Đẹp. Tôi đã đơn giản hóa nó phần nào trong câu trả lời của tôi (bên dưới).
Ether

2

Trong trường hợp của tôi, tôi đã thiết lập posh-git trong PowerShell và muốn cygwin sử dụng cùng một ssh-agent. Tôi đã phải thực hiện một số thao tác đường dẫn vì chúng sử dụng các thư mục tmp khác nhau và tệp .env được tạo là UTF16 với BOM và CR \ LF vì vậy thật thú vị khi xử lý. Thêm phần sau vào .bashrc được sử dụng bởi cygwin sẽ hoạt động:

# 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

Lại một ví dụ để đặt .bash_profile của bạn ngay lập tức và yêu cầu thêm khóa mặc định của bạn khi đăng nhập. Chuyển tiếp không phải là một lựa chọn trong trường hợp của tôi.

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

Đây là giải pháp của tôi, được điều chỉnh từ https://superuser.com/a/141233/5255 (trong chủ đề này):

# 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

tạo tập tin ~ / 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

bao gồm tệp trong .bashrc

. ~/ssh-agent.sh

0

Đây là một cái gì đó tôi đã thêm mà làm việc cho tôi. Đầu tiên, nó kiểm tra xem bạn có một tác nhân đang chạy hay không, nếu có, nó sẽ đặt các môi trường thích hợp cho nó, nếu không nó sẽ tạo ra nó. Cũng loại bỏ việc tạo thêm tác nhân:

Chỉ cần đặt nó trong của bạn .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

Tôi cũng có một biến thể về vấn đề này, được lấy thẳng từ .bashrc của tôi:

# 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

Giải pháp này lưu trữ một bản sao thông tin đại lý SSH trong thư mục nhà của bạn. Trong trường hợp bạn có một thư mục nhà được tự động hóa NFS có thể được chia sẻ giữa nhiều máy chủ, tên máy chủ được sử dụng như một phần của tên tệp để phân biệt giữa chúng, vì vậy đăng nhập từ một máy sẽ không ghi lại tệp tác nhân được sử dụng trên máy khác.

Hành vi:

1) Phiên người dùng lần đầu tiên được nhắc nhập cụm mật khẩu chính.

2) Các phiên thứ hai, thứ ba và thứ tư- (et cetera) kế thừa tác nhân SSH và (các) khóa được thêm vào trong lần đầu tiên.

3) Nếu tác nhân bị giết hoặc gặp sự cố, phiên tiếp theo đầu tiên sẽ tạo một tác nhân mới, ghi đè lên tệp tác nhân bằng tệp mới - và nhắc lại cụm mật khẩu chính. Các phiên được tạo sau đó sẽ hoạt động giống như kịch bản 2), miễn là tác nhân SSH mới vẫn chạy.


0

(điều này đề cập đến bài 2 cao hơn, tôi không thể thêm bình luận)

@raghavan: Ví dụ của bạn rất hữu ích, nhưng sẽ đề nghị thay đổi hai dòng có

đại lý pgrep

đến

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

để chỉ các tác nhân chạy dưới người dùng hiện tại được tìm thấy và pid không được lặp lại trên màn hình (sạch hơn).

Cũng sẽ thay đổi $ HOME / ssh-agent.out thành $ HOME / .ssh-agent.out

Trân trọng


0

Tôi đọc giải pháp ban đầu của bạn và một số giải pháp được đề xuất, nhưng quyết định đơn giản hóa quy trình sử dụng của riêng tôi. Đây là những gì tôi đã thêm vào .bashrc của riêng mình:

    # 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

Tôi đã đưa ra một vài giả định ở đây:

  • Rằng thư mục ~ / .ssh tồn tại.
  • Rằng bạn chỉ muốn một ổ cắm ssh-agent cho mỗi người dùng trên hệ thống.
  • Biến môi trường HOME được đặt (vì tại sao không, phải không?).
  • Rằng bạn sẽ xử lý thủ công một tình huống trong đó có một quá trình đang chạy, nhưng vì một số lý do không sử dụng tệp ổ cắm được chỉ định.

Tất cả trong tất cả tôi nghĩ rằng nó cảm thấy như một giải pháp đơn giản.


0

Tôi thấy rằng tôi thường có nhiều ssh-agenttiến trình đang chạy và rằng PID bên trong tên tệp của socket không thực sự khớp với PID đang chạy ssh-agent, vì vậy tôi đã hack một cái gì đó để cố gắng phục hồi từ các điều kiện này, dựa trên nhiều ví dụ ở trên.

Đó là một chức năng duy nhất, nó sử dụng biến Zsh cho ID người dùng nếu có và cố gắng dành ít thời gian hơn để phân tích các /tmpthư mục lớn có thể bằng cách hạn chế find(1)thêm một chút.

Nó có thể vẫn dễ bị lỗi và bị lỗi, nhưng một số thử nghiệm khó hiểu cho thấy nó chủ yếu hoạt động cho các trường hợp sử dụng của tôi, vì vậy, đây là:

Đính kèm_ssh_agent () {
  if [-n "$ SSH_AGENT_PID"]; sau đó
    ssh-thêm -l> / dev / null
    ret = $?
    nếu [$ ret -ge 2]; sau đó
      echo "Tác nhân pid $ SSH_AGENT_PID ít hữu ích hơn (ret = $ ret) - giết ..."
      giết $ SSH_AGENT_PID
      bỏ đặt $ SSH_AGENT_PID
    elif [$ ret = 1]; sau đó
      echo "Tác nhân pid $ SSH_AGENT_PID ít hữu ích hơn (ret = $ ret) - sẽ gieo nó ..."
    khác
      tiếng vang "Đại lý pid $ SSH_AGENT_PID"
      trở về
    fi
  fi
  nếu [-S "$ SSH_AUTH_SOCK"]; sau đó
    ssh-thêm -l> / dev / null
    ret = $?
    nếu [$ ret = 2]; sau đó
      echo "Ổ cắm $ SSH_AUTH_SOCK đã chết - đang xóa ..."
      rm -f $ SSH_AUTH_SOCK
      bỏ đặt SSH_AUTH_SOCK
    elif [$ ret = 1]; sau đó
      echo "Ổ cắm $ SSH_AUTH_SOCK trỏ đến một tác nhân không có khóa ..."
      ssh-thêm
    khác
      echo "Đã tìm thấy ssh-agent $ SSH_AUTH_SOCK (ret = $ ret)"
      trở về
    fi
  fi
  cho sf bằng $ (find / tmp / -mindepth 2 -maxdepth 2 -uid $ {UID: - $ (id -u)} -path '/tmp/ssh-*/agent.*' -type s); làm
    kiểm tra -r $ sf | | tiếp tục
    xuất SSH_AUTH_SOCK = $ sf
    SSH_AGENT_PID = $ (tên cơ sở $ SSH_AUTH_SOCK | cut -d. -F2)
    # chủng tộc với các dĩa quá trình khác, argh
    thử = 50
    trong khi [$ thử -gt 0]; làm
      thử = $ (($ thử-1))
      xuất SSH_AGENT_PID = $ (($ SSH_AGENT_PID + 1))
      tiếng vang "Đang kiểm tra $ SSH_AUTH_SOCK -> $ SSH_AGENT_PID"
      ssh_agent_rucky = $ (ps -u $ USER | grep ssh-agent)
      if [-z "$ ssh_agent_rucky"]; sau đó
        echo "Ổ cắm $ SSH_AUTH_SOCK không chứa liên kết đến bất kỳ tác nhân đang chạy nào - xóa ..."
        rm -f $ SSH_AUTH_SOCK
        tiếp tục
      fi
      nếu tiếng vang "$ ssh_agent_rucky" | \
           awk '$ 1 ==' $ SSH_AGENT_PID '{
                  tìm thấy = 1;
                  thoát (0);
              }
              KẾT THÚC {
                  Nếu được tìm thấy) {
                      in "không tìm thấy đang chạy PID '$ SSH_AGENT_PID'";
                      lối ra (1);
                  }
              } '; sau đó
        ssh-thêm -l> / dev / null
        ret = $?
        nếu [$ ret -ge 2]; sau đó
          echo "Ổ cắm $ SSH_AUTH_SOCK không chứa liên kết đến một tác nhân hữu ích tại $ SSH_AGENT_PID - xóa ..."
          rm -f $ SSH_AUTH_SOCK
          giết $ SSH_AGENT_PID
          bỏ đặt SSH_AGENT_PID
          tiếp tục 2
        elif [$ ret = 1]; sau đó
          echo "Ổ cắm $ SSH_AUTH_SOCK chứa liên kết đến một tác nhân ít hữu ích hơn tại $ SSH_AGENT_PID - gieo hạt ..."
          ssh-thêm
          nếu như ! ssh-add -l> / dev / null; sau đó
            echo "Ổ cắm $ SSH_AUTH_SOCK vẫn chứa liên kết đến một tác nhân ít hữu ích hơn tại $ SSH_AGENT_PID - hủy bỏ."
            trở về
          khác
            phá vỡ
          fi
        khác
          phá vỡ
        fi
      khác
# echo "Không thể khớp ổ cắm $ SSH_AUTH_SOCK với tác nhân PID $ SSH_AGENT_PID - bỏ qua ..."
        tiếp tục
      fi
    làm xong
    nếu [$ thử -gt 0]; sau đó
      tiếng vang "Đã tìm thấy ssh-agent $ SSH_AUTH_SOCK"
      tiếng vang "Đại lý pid $ SSH_AGENT_PID"
      trở về
    fi
  làm xong
  if [-n "$ try" -a -n "$ SSH_AUTH_SOCK" -a -n "$ ssh_agent_rucky"]; sau đó
    echo "Chúng tôi đã thử nhiều lần, nhưng không thể khớp $ SSH_AUTH_SOCK với bất kỳ tác nhân nào đang chạy, thở dài"
    tiếng vang "$ ssh_agent_rucky"
    echo "Để lại những thức ăn thừa này phía sau và bắt đầu một tác nhân mới ..."
  fi
  eval $ (ssh-agent -t 28800)
  ssh-thêm
}

0

Đây là spin của tôi về điều này. Tôi ' nguồn ' tập lệnh bên dưới từ .bash_profile của tôi :

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

Đây là một tập lệnh đơn giản sẽ luôn sử dụng lại cùng một ssh-agent hoặc bắt đầu ssh-agent nếu nó không chạy. Điều quan trọng là sử dụng -atùy chọn để sử dụng cùng tên ổ cắm. Nếu không, theo mặc định, nó sẽ chọn một tên ổ cắm ngẫu nhiên mỗi lần. Bạn cũng có thể dễ dàng kết hợp 3 dòng này thành bí danh 1 dòng.

# 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

nguồn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.