Existe uma maneira conveniente de garantir que todos os logins de um determinado usuário (ou seja, eu) usem o mesmo ssh-agent? Eu hackeei um script para fazer este trabalho a maior parte do tempo, mas eu suspeitava o tempo todo que havia alguma maneira de fazer isso que eu tinha acabado de perder. Além disso, desde então, houve avanços surpreendentes em tecnologia de computação, como por exemplo este site.
Então o objetivo aqui é que
- sempre que eu fizer login na caixa, independentemente de ser via SSH ou em uma sessão gráfica iniciada a partir do gdm / kdm / etc, ou em um console:
- se meu nome de usuário não tiver atualmente um
ssh-agent
executando, um é iniciado, as variáveis de ambiente são exportadas essh-add
chamado. - caso contrário, as coordenadas do agente existente serão exportadas nas variáveis de ambiente da sessão de login.
- se meu nome de usuário não tiver atualmente um
Esta facilidade é especialmente valiosa quando a caixa em questão é usada como um ponto de ssh
em uma terceira caixa. Neste caso, evita ter que digitar a frase secreta da chave privada toda vez que você digitar ssh e, por exemplo, desejar fazer git push
ou alguma coisa.
O roteiro dado abaixo faz isso de forma mais confiável, embora tenha fracassado recentemente quando o X travou e eu iniciei outra sessão gráfica. Pode ter havido outro mal-estar acontecendo nesse caso.
Aqui está meu roteiro ruim é bom. Eu obtenho isso do meu .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;
Por favor, me diga que há uma maneira melhor de fazer isso. Também, por favor, não critique as inconsistências / gafes (por exemplo, colocando var
coisas em etc
); Eu escrevi isso há um tempo e desde então aprendi muitas coisas.
Respostas:
Eu poderia jogar minha própria variação na mixagem:
E então toda vez que eu fizer login, se eu quer um agente anexado (o que eu nem sempre), eu apenas digito
sagent
.fonte
if [ ! -x "$(which ssh-add)" ];
deve ser substituído porif ! which ssh-add;
ouif ! command -v ssh-add
. (Lembrar,[
é apenas um comando)if ! which ssh-add > /dev/null
para evitar que o caminho seja impresso, ponto em que não tenho certeza se é mais claro, embora eu suponha que ele economize uma invocação de comando extra.ssh -A [user@]remotehost
Eu acho que isso pode ser o que você está procurando. Use a opção -A ao executar o ssh-forward em seu agente ssh. Aqui está um usecase:
Eu tenho um servidor remoto que tem alguns git repos nele com um apontador remoto para o github. Sem um agente ssh em execução em uma sessão de tela, eu tenho que inserir a frase secreta para a minha chave, a fim de fazer um "mestre de origem git pull". Booo! Além disso, devo ter meu privado chave instalada no servidor remoto - mais Boooo!
Em vez disso, simplesmente usando
ssh -A [user@]remotehost
passa o meu agente ssh a correr localmente. Agora, não preciso mais que minha chave privada exista no host remoto. Eu não acredito que você precise fazer nenhum script com o ssh-agent.fonte
man 5 ssh_config
para oForwardAgent
configuração de configuração. Permite o encaminhamento de agentes por padrão, eliminando a necessidade de-A
argumento. Antes de usar o encaminhamento de agente, saiba que existe um risco de segurança em que outros usuários privilegiados na máquina remota poderiam acessar o soquete do agente encaminhado. Isso também é mencionado na página man. Isso é explicado bem Aqui .Aqui está uma muito legal que também funciona no Cygwin:
Adicione-o ao seu .bash_profile ou .bashrc
Fonte: http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
fonte
${SSH_ENV}
precisa ser"${SSH_ENV}"
se o seu nome de usuário do Windows tiver um espaçoTente usar chaveiro, é feito para isso. http://www.gentoo.org/doc/en/keychain-guide.xml
fonte
Eu comecei recentemente usando:
https://github.com/ccontavalli/ssh-ident
Tudo o que tenho a fazer é adicionar:
No meu arquivo .bashrc. O roteiro cuida de:
fonte
Eu prefiro manter as coisas o mais simples possível: (trecho de
~/.profile
)Eu não pensei em usar
-a
antes, mas pode ser mais fácil:fonte
No meu caso eu tenho posh-git instalação no PowerShell e queria que o cygwin usasse o mesmo ssh-agent. Eu tive que fazer alguma manipulação de caminho desde que eles usam pastas de tmp diferentes eo arquivo de .env criado era UTF16 com BOM e CR \ LF de forma que era divertido de lidar com. Adicionar o seguinte ao .bashrc usado pelo cygwin deve funcionar:
fonte
Novamente, um exemplo para colocar seu .bash_profile imediatamente e pedir para adicionar sua chave padrão no logon. Encaminhamento não era uma opção no meu caso.
fonte
Esta é a minha solução, adaptada de https://superuser.com/a/141233/5255 (neste thread):
fonte
criar arquivo ~ / ssh-agent.sh
inclua o arquivo em .bashrc
fonte
Isso é algo que eu adicionei, que funciona para mim. Primeiro, ele verifica se você tem um agente em execução, se sim, ele irá definir os ambientes apropriados para isso, se não, ele irá criá-lo. Também elimina a criação de agentes extras:
Basta colocar na sua
.bashrc
fonte
Eu tenho uma variação deste problema, também, tirada diretamente do meu .bashrc:
Essa solução armazena uma cópia das informações do agente SSH em seu diretório inicial. Caso você tenha um diretório pessoal montado automaticamente pelo NFS que possa ser compartilhado entre vários hosts, o nome do host é usado como parte do nome do arquivo para diferenciá-los, portanto, o login de uma máquina não afeta o arquivo do agente em uso em outra.
Comportamento:
1) As sessões do usuário pela primeira vez são solicitadas por uma frase secreta chave.
2) As sessões de segundo, terceiro e quarto (et cetera) herdam o agente SSH e as chaves adicionadas no primeiro.
3) Se o agente for eliminado ou travar, a primeira sessão subsequente criará um novo agente, substituirá o arquivo do agente pelo novo - e solicitará uma frase secreta de chave novamente. As sessões criadas subseqüentemente se comportarão como o cenário 2), desde que o novo agente SSH continue sendo executado.
fonte
(isso se refere ao post 2 mais alto, não foi possível adicionar um comentário)
@raghavan: Seu exemplo é útil, mas sugeriria alterar as duas linhas que têm
pgrep ssh-agent
para
pgrep -u $ USER ssh-agent & gt; / dev / null
de modo que somente os agentes em execução no usuário atual sejam encontrados e o pid não seja exibido na tela (limpador).
Também sugeriria mudar $ HOME / ssh-agent.out para $ HOME / .ssh-agent.out
Saudações
fonte
Eu li sua solução original e algumas das sugeridas, mas decidi simplificar o processo para meu próprio uso. Isto é o que eu adicionei no meu próprio .bashrc:
Eu fiz algumas suposições aqui:
Tudo somado, acho que parece uma solução simples.
fonte
Eu descobri que muitas vezes eu tinha múltiplos
ssh-agent
processos em execução e que o PID dentro do nome do arquivo de soquete nunca correspondeu realmente ao PID de um arquivo em execução.ssh-agent
, então eu hackeei algo para tentar recuperar dessas condições, com base em vários exemplos acima.É uma única função, ele usa uma variável Zsh para o ID do usuário, se estiver lá, e tenta gastar menos tempo analisando possivelmente enormes
/tmp
diretórios restringindofind(1)
um pouco mais.É provavelmente ainda propenso a erros, e complicado, mas alguns testes superficiais indicam que funciona principalmente para os meus casos de uso, então aqui vai:
fonte
Aqui está o meu giro sobre isso. EU ' fonte ' o abaixo roteiro do meu .bash_profile :
fonte