Po co ewaluować wyjście ssh-agent?

66

Aby uruchomić, ssh-agentmuszę użyć

eval $(ssh-agent)

Dlaczego mam do evalwyjścia ssh-agent?

Dlaczego nie jest tak zaprojektowany, że mogę go po prostu uruchomić?


Uwaga: Backticks (`) są usuwane, ponieważ są przestarzałe. Możesz na przykład przeczytać więcej na ten temat tutaj .

jx12345
źródło
Kto mówi, że musisz użyć eval? Co to dyktuje? Pomógłby trochę więcej kontekstu.
0x Owczarek
9
@ 0x Owczarek manstrona, na początek ...
jasonwryan
Wygląda na to, że przypadki użycia są udokumentowane na stronie podręcznika. Co do „dlaczego jest zaprojektowany w pewien sposób” ... wzruszyć .
0x Owczarek
5
Powtarzając, nie jest tak, ssh-agentże jest „zaprojektowany w ten sposób”, jest to unix / linux, ponieważ ssh-agentdziała w potomnym procesie powłoki. Procesy potomne nie mogą modyfikować procesów macierzystych. Ale funkcja może: ponieważ działa w bieżącym procesie. Więc można napisać funkcję: do_set_ssh_agent() { eval ssh-agent ; }i które mogą być uruchamiane po prostu jako: $ do_set_ssh_agent. Ale „programy” nie są (zazwyczaj) instalowane jako „funkcje” w systemie Linux / UNIX; zamiast tego programy są instalowane jako pliki, które, jak wspomniano, działają w procesie potomnym. (Skrypty zaopatrzenia są wyjątkiem, ale ssh-agent jest binarny.)
Michael

Odpowiedzi:

79

ssh-agent wypisuje zmienne środowiskowe, które musisz połączyć:

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:~$ 

Dzwoniąc evalnatychmiast ładujesz te zmienne do swojego środowiska.

Jeśli ssh-agentnie możesz tego zrobić sam ... Zwróć uwagę na wybór słowa. Nie „nie”, „ nie ”. W Uniksie proces może modyfikować tylko własne zmienne środowiskowe i przekazywać je dzieciom. Nie może modyfikować środowiska procesu nadrzędnego, ponieważ system na to nie zezwala. To dość podstawowy projekt bezpieczeństwa.

Można obejść evalstosując ssh-agent utilitygdzie utilityjest twoja powłoka logowania, Twój menedżer okien lub cokolwiek innego, co musi mieć zmienne środowiskowe SSH set. Jest to również wspomniane w instrukcji.

Shadur
źródło
Dzięki, to jasno wyjaśnia, co się dzieje i rozumiem, ale dlaczego jest tak zaprojektowany, a nie tak zaprojektowany, że automatycznie dodaje zmienne do środowiska? Czy to dodaje jakiejkolwiek elastyczności?
jx12345
4
@ jx12345 Możesz się obejść eval, używając ssh-agent utilitygdzie utilityjest twoja powłoka logowania, menedżer okien lub cokolwiek innego, co wymaga ustawienia zmiennych środowiskowych SSH. Jest to również wspomniane w instrukcji. Żadne narzędzie zewnętrzne nie może nigdy ustawiać zmiennych w środowisku wywołującym.
Kusalananda
@kusalananda Prawidłowy; dodaj to jako edycję. Teraz idę spać lub sam bym to zrobił.
Shadur
5
@ jx12345 Ponieważ może dodawać zmienne do własnego środowiska, ale nie może dodawać zmiennych do środowiska twojej powłoki, ponieważ nie jest to twoja powłoka.
immibis
3
@ jx12345 Aby wyjaśnić: jeśli mogę dodać lub zmienić zmienne env do mojego procesu nadrzędnego, mogę wywierać wpływ na rodzica rodzica i tak dalej aż do PID 1. Jest to nazywane „eskalacją przywilejów” i jest to bardzo złe z punktu widzenia bezpieczeństwa punkt widzenia.
Shadur