2010-09-08 26 views
30

Tôi đã cài đặt msysgit, với OpenSSH. Tôi đang kết nối với repo gitosis. Từ bash git, tôi đã tạo ra một tập tin .profile chạy ssh-agent (nếu chưa chạy) mỗi lần git bash được mở ra, using this scriptBắt ssh-agent để làm việc với git run từ cửa sổ lệnh shell

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 

Tôi cũng đang sử dụng phần mở rộng git, chạy lệnh git từ dấu nhắc lệnh của Windows, không phải git bash. Vì vậy, ssh không thấy ssh-agent đang chạy. Có thể sửa lỗi này không?

Trả lời

1

Bạn có thể bọc tập tin thực thi git của mình bằng tập lệnh mã nguồn của bạn .profile, khiến các biến môi trường ssh-agent được tải.

Hoặc đặt tập lệnh có tên git vào thư mục trước đó trong đường dẫn của bạn hơn git thực hoặc định cấu hình tiện ích git để gọi trình bao bọc của bạn thay cho git thực.

22

Mặc dù bạn đã có thể giải quyết nó ... sử dụng lệnh eval để làm cho ssh_agent quá trình thanh:

eval `ssh-agent.exe` 

Sau đó sử dụng ssh-add để thêm các phím mà bạn cần.

+0

này spawns một quá trình top-level mới 'ssh-agent' mỗi khi bạn mở một bash git. –

+0

Ahh bạn thấy, không thực sự ít nhất là không khi tôi kiểm tra nó, nếu tôi nhớ lại chính xác, nó sẽ kiểm tra xem có một chạy khác không nó đẻ trứng quá trình. ngày nay họ đã sửa nó, vì vậy không có lý do gì để sử dụng điều này nữa – Cu7l4ss

+0

@ Cu7l4ss Nếu họ sửa nó thì tại sao tôi lại gặp vấn đề này ??? - Tôi có thể khởi động ssh-agent và thêm khóa vừa rồi ... nhưng sau đó nó ngay lập tức biến mất và 'ssh-add -l' trả về "tác nhân không có danh tính". Cách duy nhất tôi thậm chí có được điều này là do lệnh bạn liệt kê. - Chỉ cần fyi, vẫn là một vấn đề hiện tại. – Zeveso

24

Đối với msysgit bạn có thể phải thay đổi một chút là giải pháp được cung cấp bởi https://help.github.com/articles/working-with-ssh-key-passphrases

declare -x SSH_ENV="$HOME/.ssh/environment" 

# start the ssh-agent 
function start_agent { 
    echo "Initializing new SSH agent..." 
    # spawn ssh-agent 
    ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV" 
    echo succeeded 
    chmod 600 "$SSH_ENV" 
    . "$SSH_ENV" > /dev/null 
    ssh-add 
} 

# test for identities 
function test_identities { 
    # test whether standard identities have been added to the agent already 
    ssh-add -l | grep "The agent has no identities" > /dev/null 
    if [ $? -eq 0 ]; then 
     ssh-add 
     # $SSH_AUTH_SOCK broken so we start a new proper agent 
     if [ $? -eq 2 ];then 
      start_agent 
     fi 
    fi 
} 

# check for running ssh-agent with proper $SSH_AGENT_PID 
if [ -n "$SSH_AGENT_PID" ]; then 
    ps -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null 
    if [ $? -eq 0 ]; then 
    test_identities 
    fi 
else 
    if [ -f "$SSH_ENV" ]; then 
    . "$SSH_ENV" > /dev/null 
    fi 
    ps -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null 
    if [ $? -eq 0 ]; then 
     test_identities 
    else 
     start_agent 
    fi 
fi 

Như bạn có thể nhận thấy sự thay đổi duy nhất tôi làm là trong cuộc gọi ps, vì msysgit không sử dụng -U nhưng - u

+2

Lưu ý rằng [bài viết trên GitHub] (https://help.github.com/articles/working-with-ssh-key-passphrases/#platform-windows) cung cấp một phiên bản đơn giản hơn (có thể là rắn hơn) của tập lệnh này. – Ignitor

+0

Dường như họ đã cập nhật mã của họ. Là phiên bản tùy chỉnh của bạn vẫn còn cần thiết, tôi tự hỏi? Tôi khuyên bạn chỉ nên thử các giải pháp trong bài viết đầu tiên. – Sean

37

tôi đã có vấn đề tương tự như bạn, sau đó tôi thử thêm mã này

#! /bin/bash 
eval `ssh-agent -s` 
ssh-add ~/.ssh/*_rsa 

vào tập tin .bashrc trong thư mục chính của tôi. Và nó hoạt động!

+0

Điều này làm việc cho tôi. Tôi nghĩ rằng vấn đề cụ thể của tôi là tôi cần phải chỉ định tệp _rsa mà tôi cần sử dụng. –

+0

Cảm ơn @bricklore :) –

+0

Lặp lại thoát và mở các phiên bash mới đã gây ra một ssh-agent.exe mới được sinh ra với mọi phiên mới. Giải pháp trong bài viết liên quan đến câu trả lời của @ Braiam ngăn cản điều đó đối với tôi. – Sean

1

Tôi thấy cách trơn tru nhất để đạt được điều này là sử dụng Pageant làm tác nhân SSH và plink.

Bạn cần có phiên putty được định cấu hình cho tên máy chủ được sử dụng trong điều khiển từ xa của bạn.

Bạn cũng sẽ cần plink.exe có thể được tải xuống từ cùng một trang web dưới dạng putty.

Và bạn cần Pageant chạy với khóa được tải. Tôi có một phím tắt để cuộc thi trong thư mục khởi động tải khóa SSH của tôi khi tôi đăng nhập.

Khi bạn cài đặt git-scm, bạn có thể chỉ định nó để sử dụng rùa/plink thay vì OpenSSH.

Hiệu ứng ròng là bạn có thể mở git-bash bất cứ khi nào bạn muốn và đẩy/kéo mà không bị thách thức đối với cụm mật khẩu.

Cùng áp dụng với các phiên putty và WinSCP khi cuộc thi có khóa của bạn được tải. Nó làm cho cuộc sống trở nên dễ dàng hơn nhiều (và an toàn).

9

Trên Windows 10 này làm việc cho tôi

  1. chạy git bash
  2. touch ~/.profile
  3. start ~/.profile để mở .profile
  4. thêm dòng sau vào .profile
#! /bin/bash 
eval `ssh-agent -s` 
ssh-add ~/.ssh/*_rsa 

Điều này được dựa trên this answer. Sự khác biệt duy nhất là .bashrc không hoạt động, thay vào đó, .profile đã hoạt động.

+0

upvote cho 'touch' –

+0

điều này phù hợp với tôi. cảm ơn!! – nonintanon

0

Simple hai chuỗi giải pháp từ this answer:

# ~/.profile 
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi 
. ~/.ssh-agent.sh 
Các vấn đề liên quan