Por que avaliar a saída do ssh-agent?

67

Para rodar ssh-agenteu tenho que usar

eval $(ssh-agent)

Por que eu tenho que evala saída de ssh-agent?

Por que não foi projetado para que eu possa executá-lo?


Nota: Backticks (`) removidos porque estão sendo descontinuados. Você pode ler mais sobre isso aqui, por exemplo .

jx12345
fonte
Quem disse que você tem que usar eval? O que está ditando isso? Um pouco mais de contexto ajudaria.
0xSheepdog
11
help.github.com/articles/…
jx12345 15/17
9
@ 0xSheepdog da manpágina, para começar ...
jasonwryan
Parece que os casos de uso estão documentados na página de manual. Quanto a "por que é projetado de uma certa maneira" ... encolher os ombros .
0xSheepdog
5
Reiterando, não ssh-agenté que seja "projetado dessa maneira", é unix / linux, porque ssh-agenté executado em um processo filho do shell. Os processos filho não podem modificar os processos pai. Mas uma função pode: porque é executada no processo atual. Então, você poderia escrever uma função: do_set_ssh_agent() { eval ssh-agent ; }e que poderia ser executado simplesmente como: $ do_set_ssh_agent. Mas "programas" não são (normalmente) instalados como "funções" no linux / unix; em vez disso, os programas são instalados como arquivos que, como mencionado, são executados em um processo filho. (Fonte de scripts é uma excepção, mas ssh-agente é binária.)
Michael

Respostas:

79

ssh-agent gera as variáveis ​​de ambiente que você precisa para se conectar a ele:

shadur@proteus:~$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-492P67qzMeGA/agent.7948; export SSH_AUTH_SOCK;
SSH_AGENT_PID=7949; export SSH_AGENT_PID;
echo Agent pid 7949;
shadur@proteus:~$ 

Ao ligar, evalvocê carrega imediatamente essas variáveis ​​em seu ambiente.

Quanto ao porquê ssh-agentnão pode fazer isso sozinho ... Observe a palavra escolha. Não "não", " não posso ". No Unix, um processo pode modificar apenas suas próprias variáveis ​​de ambiente e transmiti-las aos filhos. Ele não pode modificar o ambiente do processo pai porque o sistema não permite. Este é um design de segurança bastante básico.

Você pode contornar o problema evalusando ssh-agent utilitywhere utilityé seu shell de login, seu gerenciador de janelas ou qualquer outra coisa que precise ter as variáveis ​​de ambiente SSH definidas. Isso também é mencionado no manual.

Shadur
fonte
Obrigado, isso explica claramente o que está acontecendo e eu entendo isso, mas por que é projetado dessa maneira e não projetado para que a execução adicione automaticamente as variáveis ​​ao ambiente? Acrescenta algum tipo de flexibilidade ???
jx12345
4
@ jx12345 Você pode contornar o problema evalusando ssh-agent utilitywhere utilityis your shell de login, seu gerenciador de janelas ou qualquer outra coisa que precise para ter as variáveis ​​de ambiente SSH definidas. Isso também é mencionado no manual. Nenhum utilitário externo pode definir variáveis ​​no ambiente de chamada.
Kusalananda
@kusalananda Correct; fique à vontade para adicionar isso como uma edição. Estou indo para a cama agora ou eu mesmo faria isso.
Shadur 15/03/19
5
@ jx12345 Porque pode adicionar variáveis ​​ao seu próprio ambiente, mas não pode adicionar variáveis ​​ao ambiente do seu shell porque não é o seu shell.
user253751
3
@ jx12345 Para esclarecer: Se eu puder adicionar ou alterar variáveis ​​env no meu processo pai, é possível que eu possa afetar o pai do pai, e assim por diante, até o PID 1. Isso é chamado de "escalonamento de privilégios" e é uma coisa muito ruim de uma segurança ponto de vista.
Shadur