5

Предыстория - я использую Git на этом компьютере (Windows XP) около 8 месяцев без проблем. Внезапно, на прошлой неделе, я больше не спрашиваю у меня имя пользователя и пароль, когда я запускаю Git up.

Каждый раз, когда я пытаюсь дотронуться до своих удаленных веток, он спрашивает, и, учитывая, что у меня есть пароль, а не пароль, это действительно раздражает.

Я использую код из GitHub в моем файле .profile :

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 -ef | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
    if [ $? -eq 0 ]; then
  test_identities
    fi
# if $SSH_AGENT_PID is not properly set, we might be able to load one from
# $SSH_ENV
else
    if [ -f "$SSH_ENV" ]; then
  . "$SSH_ENV" > /dev/null
    fi
    ps -ef | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
    if [ $? -eq 0 ]; then
        test_identities
    else
        start_agent
    fi
fi

Линия, которая ловит это:

if [ -n "$SSH_AGENT_PID" ]; then

Он считает, что это действительная запись. Само собой разумеется, я перезагружал и перезагружал на свой компьютер многими различными способами, всегда то же самое. Я echo идентификатор процесса, и он не запущен на моем компьютере (для диспетчера задач).

Я обновил свой Git (надеюсь, что это решит проблему), и сейчас я работаю с версией 1.7.11-preview20120620

Любая помощь будет принята с благодарностью.

3 ответа3

7

Как насчет упрощения?

agent_running() {
    [ "$SSH_AUTH_SOCK" ] && { ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]; }
}

env=~/.ssh/agent.env

if ! agent_running && [ -s "$env" ]; then
    . "$env" >/dev/null
fi

if ! agent_running; then
    ssh-agent >"$env"
    . "$env" >/dev/null
    ssh-add
fi

unset env
2

В последних версиях Git для Windows 2.x есть start-ssh-agent.cmd который можно запустить в git bash и cmd .

Смотрите также здесь: https://github.com/git-for-windows/git/wiki/Auto-launching-ssh-agent-when-git-starts

0

Python версия скрипта. Протестировано на инструментах Windows Vista + Git SSH. Отсюда

#!/usr/bin/env python
"""\
ssh agent wrapper to detect or run agent, set environment
and either show it or execute specified command in this
environment.

usage: ssh-agent.py
       ssh-agent.py <command>

examples:
    ssh-agent.py ssh-add
    ssh-agent.py ssh -A user@host
"""

"""
[x] no agent is running
  [x] run agent

[x] agent is running
  [x] set environment
  [x] show how to set environment manually

  [x] if there is command, run it
"""

__version__ = '1.0'
__author__  = 'anatoly techtonik <techtonik@gmail.com>'
__license__ = 'Public Domain'

import os
import sys

#--[inline shellrun 2.0 import run, run_capture]
import subprocess

class Result(object):
    def __init__(self, command=None, retcode=None, output=None):
        self.command = command or ''
        self.retcode = retcode
        self.output = output
        self.success = False
        if retcode == 0:
            self.success = True

def run(command):
    process = subprocess.Popen(command, shell=True)
    process.communicate()
    return Result(command=command, retcode=process.returncode)

def run_capture(command):
    outpipe = subprocess.PIPE
    process = subprocess.Popen(command, shell=True, stdout=outpipe,
                                                    stderr=outpipe)
    output, _ = process.communicate()
    return Result(command=command, retcode=process.returncode, output=output)
#--[/inline]


SSH_ENV = os.path.expanduser("~/.ssh/agent.env")


def detected():
    if 'SSH_AUTH_SOCK' not in os.environ:
        if os.path.exists(SSH_ENV):
            agentenv = parse()
            os.environ.update(agentenv)
        if 'SSH_AUTH_SOCK' not in os.environ:
            return False
    r = run_capture('ssh-add -L')
    if r.retcode == 0:    # has keys
        return True 
    elif r.retcode == 1:  # no keys
        return True
    elif r.retcode == 2:  # not running
        return False
    else:
        print(r.output)
        return False

def start():
    run('ssh-agent > "%s"' % SSH_ENV)

def parse():
    params = open(SSH_ENV, 'r').read()
    # SSH_AUTH_SOCK=/tmp/ssh-owYJTz7968/agent.7968; export SSH_AUTH_SOCK;
    # SSH_AGENT_PID=6284; export SSH_AGENT_PID;
    # echo Agent pid 6284;
    params = params.replace('; ', '\n')
    params = params.replace(';', '')
    result = dict()
    for line in params.splitlines():
        if '=' not in line:
            continue
        key, value = line.split('=')
        result[key] = value
    return result


def main():
    if '-h' in sys.argv or '--help' in sys.argv:
        sys.exit(__doc__)

    if not detected():
        print('..agent not detected, starting..')
        start()

    if not detected:
        sys.exit('error starting ssh-agent')
    else:
        if os.name == 'nt':
            print('@rem ..agent is running, set environment as:')
            for k,v in parse().items():
                print('set %s=%s' % (k,v))
        else:
            print('# ..agent is running, set environment as:')
            run('cat "%s"' % SSH_ENV)

        if sys.argv[1:]:
            run(sys.argv[1:])


if __name__ == '__main__':
    main()

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .