Eu trabalho principalmente em um mac e ssh / tmux anexado a uma máquina Linux para fazer o meu trabalho. Eu tenho o ssh-agent em execução na máquina Linux. eu tenho
set -g update-environment "SSH_AUTH_SOCK SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"
no meu .tmux.conf
. No entanto, sempre que me reconecto a esta sessão, tenho que executar
tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
para que as novas janelas tmux sejam $SSH_AUTH_SOCK
definidas corretamente. Eu preferiria não ter que fazer isso. Alguma ideia?
Atualizar
Eu acho que não estou explicando isso bem. Aqui está a minha função de shell para abrir um shell em uma máquina remota:
sshh () {
tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}
Quando o tmux executa esse comando ssh, ele não$SSH_AUTH_SOCK
está definido, mesmo que esteja definido no meu ambiente local. Se eu colocar isso no ambiente do tmux com o comando acima, tudo funcionará bem. Minha pergunta é: por que eu tenho que executar o comando setenv?setenv
Atualização 2
Mais Informações:
Quando eu me conecto a uma sessão existente, $SSH_AUTH_SOCK
não está definido no ambiente tmux (ou ambiente global).
% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK
Se eu configurá-lo manualmente, as coisas funcionam:
% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
Se eu desconectar e reconectá-lo, $SSH_AUTH_SOCK
voltará a não ser definido.
fonte
env
?Respostas:
Como recebi o Bounty, repassarei meu comentário-chave por uma questão de integridade - e para evitar colocar os visitantes com o mesmo problema na trilha errada:
O Tmux removerá variáveis de ambiente
A página de manual do Tmux afirma que o update-environment removerá variáveis "que não existem no ambiente de origem [...] como se -r fosse fornecido ao comando set-environment".
Aparentemente, o que causou o problema. Veja a resposta de Chris abaixo . No entanto, ainda não consigo imaginar como a variável poderia estar ausente no "ambiente de origem" e ainda ser válida na recém-criada janela do tmux ...
Resposta anterior:
Como o encaminhamento SSH funciona
Na máquina remota, dê uma olhada no ambiente do seu shell depois de estabelecer a conexão SSH:
O importante aqui é SSH_AUTH_SOCK, que está atualmente definido para algum arquivo em / tmp. Se você examinar esse arquivo, verá que é um soquete de domínio Unix - e está conectado à instância específica do ssh na qual você se conectou. Importante, isso muda toda vez que você se conecta.
Assim que você efetua logout, esse arquivo de soquete específico desaparece. Agora, se você reconectar sua sessão tmux, verá o problema. Ele tem o ambiente a partir do momento em que o tmux foi lançado originalmente - o que poderia ter acontecido semanas atrás. Esse soquete em particular já está morto há muito tempo.
Solução
Como sabemos que o problema tem a ver com saber onde está o soquete de autenticação SSH atualmente ativo, vamos colocá-lo em um local previsível!
No arquivo .bashrc ou .zshrc na máquina remota, adicione o seguinte:
Eu acho que você nem precisa colocar um 'comando update-environment' no seu tmux.conf. De acordo com a página do manual, SSH_AUTH_SOCK já está coberto por padrão.
Crédito
Minha resposta é um trecho desta postagem de blog de Mark 'xb95' Smith, que explica o mesmo problema de tela .
fonte
$SSH_AUTH_SOCK
novos shells, é sobre como definir$SSH_AUTH_SOCK
em novas janelas tmux antes que o .bashrc / .zshrc seja originado.tmux neww ssh somehost
).SSH_AUTH_SOCK
. Essa abordagem funciona apenas enquanto a sessão do tmux está aberta através da conexão SSH mais recente.Eu descobri isso. Resposta curta, eu precisava para remover
SSH_AUTH_SOCK
a partirupdate-environment
. Como estava nessa lista, o valor estava sendo descartado toda vez que eu recolocava. Obrigado a @djf pela pista. O bit saliente da página do manual tmux (1) naupdate-environment
seção:fonte
.tmux.conf
para que isso funcionasse:set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"
Você está vendo problemasssh
ou variáveis de ambiente em geral?Em vez de usar o tmux para lidar com meu ssh-agent, eu tenho o bash para lidar com isso:
Eu tenho isso no meu ~ / bashrc , e funciona muito bem.
fonte
$SSH_AUTH_SOCK
está definido corretamente em minhas conchas, mas quando eu fizer algo assimtmux neww ssh somehost
, minha senha será solicitada para desbloquear minha chave privada, a menos que eu corratmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
.Respondi a uma pergunta semelhante no StackOverflow https://stackoverflow.com/a/49395839/241025 . Como essa página apareceu primeiro nas minhas pesquisas no Google, eu queria postar uma versão resumida dela aqui.
Para que cada sessão do tmux tenha um conjunto de variáveis de ambiente customizadas, você deve adicionar os valores às variáveis de ambiente por sessão do tmux. Aqui está um exemplo de como fazê-lo.
A última etapa da exportação explícita do FOO é necessária para que o painel atual escolha a variável de ambiente. Quaisquer painéis ou janelas subsequentes criados para esta sessão do tmux herdarão o FOO, mas não serão exibidos em outras sessões.
fonte
A explicação de djf traz outra solução possível para minha mente:
Antes
tmux
/screen
está em execução:ssh-agent
.tmux
/screen
com as variáveis de ambiente para issossh-agent
.Isso não pôde usar o encaminhamento SSH para o cliente, mas isso não foi solicitado.
fonte
ssh-agent
não liga ao TTY, por que deveria ser eliminado no logout (?) - por que usarnohup
?