Executando a saída de 'ssh-agent' em fish; o que 'setenv' faz?

1

Quando eu quero começar (ou reiniciar) ssh-agent , isso me dá alguns comandos que eu deveria executar fazendo eval $(ssh-agent) . Claro que isso falha para os peixes, já que fornece a sintaxe para bash ou csh.

Os comandos parecem:

SSH_AUTH_SOCK=/var/folders/v4/c116f_790t7g58lh3jbr7_vm0000gq/T//ssh-L95xhmGl9FZo/agent.36846; export SSH_AUTH_SOCK;
SSH_AGENT_PID=36847; export SSH_AGENT_PID;
echo Agent pid 36847;

ou para csh:

setenv SSH_AUTH_SOCK /var/folders/v4/c116f_790t7g58lh3jbr7_vm0000gq/T//ssh-Tf8etHZfP9k3/agent.36873;
setenv SSH_AGENT_PID 36874;
echo Agent pid 36874;

A versão csh é executada sem reclamação quando eu faço eval (ssh-agent -c) e, em seguida, echo $SSH_AGENT_PID $SSH_AUTH_SOCK fornece a saída esperada. No entanto, novos shells não mantêm essas variáveis. O que setenv faz? claramente as variáveis set s de alguma forma, mas não está na documentação. Se eu iniciar um novo terminal, as variáveis serão perdidas, então não tenho certeza se elas são exportadas?

Acabei de descobrir que setenv é uma função de peixe, com a definição set -gx , por isso suponho que defina a variável como global e a exporte. Eu não tenho um bom entendimento do escopo da variável, então é a coisa apropriada para as variáveis ssh-agent ?

Para o contexto, estou fazendo isso com base nas instruções no github . Eu tenho usado uma chave ssh para o github há anos e nunca fiz a coisa ssh-agent ou ssh-add , mas eu notei isso durante a configuração em um novo computador. Também parece que o os x está rodando o ssh-agent sozinho (ou algo mais que configurei no passado), porque existe $SSH_AUTH_SOCK já. Então talvez correr isso não é importante? ssh-add é executado sem reclamação mesmo sem executar ssh-agent .

    
por askewchan 03.09.2015 / 15:57

2 respostas

2

Eu escrevi isso há um tempo atrás:

function ssh_agent --description 'launch the ssh-agent and add the id_rsa identity'
    if begin
            set -q SSH_AGENT_PID
            and kill -0 $SSH_AGENT_PID
            and grep -q '^ssh-agent' /proc/$SSH_AGENT_PID/cmdline
    end
        echo "ssh-agent running on pid $SSH_AGENT_PID"
    else
        eval (command ssh-agent -c | sed 's/^setenv/set -Ux/')
    end
    set -l identity $HOME/.ssh/id_rsa
    set -l fingerprint (ssh-keygen -lf $identity | awk '{print $2}')
    ssh-add -l | grep -q $fingerprint
        or ssh-add $identity
end

Para enfatizar, uso variáveis universais da saída ssh-agent, e setenv cria variáveis globais

    
por 03.09.2015 / 19:14
1

Isso funciona para mim no FreeBSD 10.2. Adicione o seguinte a ~ / .config / fish / config.fish:

if begin; test -z (command pgrep ssh-agent); and not test -S $SSH_AUTH_SOCK; end
    eval (command ssh-agent -c | sed -E 's/^setenv (.+);$/set ; set -Ux ;/')
end

O primeiro conjunto, sem o -Ux, define as variáveis de ambiente para o primeiro terminal que inicia o ssh-agent. O segundo conjunto, com -Ux, define as variáveis de ambiente para todos os outros terminais.

    
por 04.11.2015 / 22:32