2016-11-11 15 views
6

Tôi có một kịch bản mẫu sh trên môi trường Linux của tôi, mà về cơ bản chạy là ssh-agent cho vỏ hiện nay, thêm một chìa khóa để nó và chạy hai lệnh git:Làm thế nào để kiểm tra xem ssh-agent đã chạy trong bash chưa?

#!/bin/bash 
eval "$(ssh-agent -s)" 
ssh-add /home/duvdevan/.ssh/id_rsa 

git -C /var/www/duvdevan/ reset --hard origin/master 
git -C /var/www/duvdevan/ pull origin master 

Script thực sự hoạt động tốt, nhưng mỗi khi tôi chạy nó tôi nhận được một quá trình mới vì vậy tôi nghĩ rằng nó có thể trở thành một vấn đề hiệu suất và tôi có thể kết thúc có quá trình vô dụng ra khỏi đó.

Một ví dụ về kết quả:

Agent pid 12109 
Identity added: /home/duvdevan/.ssh/custom_rsa (rsa w/o comment) 

Ngoài ra, cùng với tất cả điều này, là nó có thể tìm thấy một ssh-agent quá trình hiện hành và thêm chìa khóa của tôi vào nó?

+3

Hãy thử '$ SSH_AGENT_PID'. – choroba

+0

Nếu bạn muốn giết một quá trình sau khi sinh ra nó, bạn có thể lưu PID của nó vào một biến và gọi nó như vậy: 'kill -9 $ PID_SSH_AGENT' – alok

+0

Tôi nghĩ rằng làm cho kịch bản có trách nhiệm bắt đầu một tác nhân là cách tiếp cận sai. Chỉ cần giả định rằng một tác nhân * đang chạy và yêu cầu bất kỳ người dùng nào để đảm bảo rằng họ đã có một đại lý (thường được bắt đầu bằng shell đăng nhập ban đầu của bạn.) – chepner

Trả lời

3

Ngoài ra, cùng với tất cả điều này, nó có thể tìm thấy một quá trình ssh-agent hiện có và thêm các khóa của tôi vào nó?

Có. Chúng tôi có thể lưu trữ các thông tin kết nối trong một tập tin:

# Ensure agent is running 
ssh-add -l &>/dev/null 
if [ "$?" == 2 ]; then 
    # Could not open a connection to your authentication agent. 

    # Load stored agent connection info. 
    test -r ~/.ssh-agent && \ 
     eval "$(<~/.ssh-agent)" >/dev/null 

    ssh-add -l &>/dev/null 
    if [ "$?" == 2 ]; then 
     # Start agent and store agent connection info. 
     (umask 066; ssh-agent > ~/.ssh-agent) 
     eval "$(<~/.ssh-agent)" >/dev/null 
    fi 
fi 

# Load identities 
ssh-add -l &>/dev/null 
if [ "$?" == 1 ]; then 
    # The agent has no identities. 
    # Time to add one. 
    ssh-add -t 4h 
fi 

Mã này là từ pitfalls of ssh agents trong đó mô tả cả những cạm bẫy của những gì bạn đang làm, của phương pháp này, và làm thế nào bạn nên sử dụng ssh-ident để làm điều này cho bạn .


Nếu bạn chỉ muốn chạy ssh-agent nếu nó không hoạt động và không làm gì khác:

if [ $(ps ax | grep [s]sh-agent | wc -l) -gt 0 ] ; then 
    echo "ssh-agent is already running" 
else 
    eval $(ssh-agent -s) 
    if [ "$(ssh-add -l)" == "The agent has no identities." ] ; then 
     ssh-add ~/.ssh/id_rsa 
    fi 

    # Don't leave extra agents around: kill it on exit. You may not want this part. 
    trap "ssh-agent -k" exit 
fi 

Tuy nhiên, điều này không đảm bảo ssh-agent sẽ có thể truy cập (chỉ vì nó đang chạy không có nghĩa là chúng ta có $ SSH_AGENT_PID cho ssh-add để kết nối).

0

Bạn có thể sửa đổi dòng # 1 tới:

PID_SSH_AGENT=`eval ssh-agent -s | grep -Po "(?<=pid\).*(?=\;)"` 

Và sau đó ở phần cuối của kịch bản mà bạn có thể làm:

kill -9 $PID_SSH_AGENT 
+2

Thứ nhất, $ varname tham chiếu một biến, nó không thể được thiết lập theo cách đó. Thứ hai, tại sao bạn muốn làm điều đó nếu 'eval ssh-agent' đã đặt $ SSH_AGENT_PID? – Friek

+0

Xin lỗi, không biết rằng nó đặt biến đó. Và có, $ không nên ở đó. Cảm ơn. – alok

6

Nếu bạn muốn nó bị giết ngay sau khi thoát khỏi kịch bản , bạn chỉ có thể thêm này sau khi dòng eval:

trap "kill $SSH_AGENT_PID" exit 

Hoặc:

trap "ssh-agent -k" exit 

$SSH_AGENT_PID được đặt trong giá trị của ssh-agent -s.

Bạn sẽ có thể tìm các đại lý chạy ssh bằng cách quét qua /tmp/ssh-* và tạo lại các biến số SSH_AGENT từ nó (SSH_AUTH_SOCKSSH_AGENT_PID).

+0

Tại sao tôi không nên thêm 'kill -9 $ SSH_AGENT_PID' vào cuối tập lệnh của tôi, như @alok đã nói trong nhận xét của anh ấy về câu hỏi? – omerowitz

+0

Nếu bản thân tập lệnh bị giết (với tín hiệu ngắt) trong khi đang chạy, lệnh đó sẽ không được chạy. Với cái bẫy nó sẽ. – Friek

+0

Ngoài ra, 'kill -9' sẽ không bao giờ cần thiết trừ việc giết một chương trình gây lỗi trong quá trình phát triển. 'kill' của chính nó nên là đủ trong hầu như mọi trường hợp. – chepner

7

Không, thực sự, làm cách nào để kiểm tra xem ssh-agent có đang chạy trong bash không?

Answers cho đến nay dường như không trả lời câu hỏi ban đầu ...

Đây là những gì làm việc cho tôi:

if ps -p $SSH_AGENT_PID > /dev/null 
then 
    echo "ssh-agent is already running" 
    # Do something knowing the pid exists, i.e. the process with $PID is running 
else 
eval `ssh-agent -s` 
fi 

này được lấy từ:https://stackoverflow.com/a/15774758

Các vấn đề liên quan