Perché valutare l'output di ssh-agent?


67

Per correre ssh-agentdevo usare

eval $(ssh-agent)

Perché devo evall'output di ssh-agent?

Perché non è progettato in modo da poterlo semplicemente eseguire?


Nota: i backtick (`) rimossi mentre vengono deprecati. Puoi leggere di più qui ad esempio qui .


Chi dice che devi usare eval? Cosa sta dettando questo? Un po 'più di contesto sarebbe di aiuto.
0xSheepdog


9
@ 0xSheepdog la manpagina, per cominciare ...
jasonwryan

Sembra che i casi d'uso siano documentati nella pagina man. Quanto al "perché è progettato in un certo modo" ... scrollata di spalle .
0xSheepdog

5
Ribadendo, non ssh-agentè "progettato in questo modo", è unix / linux, perché ssh-agentviene eseguito in un processo figlio della shell. I processi figlio non possono modificare i processi padre. Ma una funzione può: perché viene eseguita nel processo corrente. Così si potrebbe scrivere una funzione: do_set_ssh_agent() { eval ssh-agent ; }e che potrebbe essere gestito semplicemente come: $ do_set_ssh_agent. Ma i "programmi" non sono (tipicamente) installati come "funzioni" in linux / unix; invece, i programmi vengono installati come file che, come detto, vengono eseguiti in un processo figlio. (Gli script di sourcing sono un'eccezione, ma ssh-agent è binario.)
michael

Risposte:


79

ssh-agent genera le variabili d'ambiente che devi connetterti ad esso:

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

Chiamandoti evalcarichi immediatamente quelle variabili nel tuo ambiente.

Quanto al perché ssh-agentnon può farlo da solo ... Nota la parola scelta. Non "non", " impossibile ". In Unix, un processo può solo modificare le proprie variabili d'ambiente e trasmetterle ai figli. Non può modificare l'ambiente del suo processo genitore perché il sistema non lo consente. Questo è un progetto di sicurezza piuttosto semplice.

Puoi aggirare evalutilizzando ssh-agent utilitydov'è la utilitytua shell di accesso, il tuo gestore di finestre o qualsiasi altra cosa abbia bisogno di impostare le variabili di ambiente SSH. Questo è anche menzionato nel manuale.


Grazie, questo spiega chiaramente cosa sta succedendo e lo capisco, ma perché è progettato in questo modo piuttosto che progettato in modo che eseguendo automaticamente aggiunge le variabili all'ambiente? Aggiunge qualche tipo di flessibilità ???
jx12345,

4
@ jx12345 È possibile aggirare evalutilizzando ssh-agent utilitydov'è utilityla shell di accesso, il gestore delle finestre o qualsiasi altra cosa abbia bisogno di impostare le variabili di ambiente SSH. Questo è anche menzionato nel manuale. Nessuna utility esterna può mai impostare variabili nell'ambiente chiamante.
Kusalananda

@kusalananda Correct; sentiti libero di aggiungerlo come modifica. Ora vado a letto o lo farei da solo.
Shadur,

5
@ jx12345 Perché può aggiungere variabili al proprio ambiente ma non può aggiungere variabili all'ambiente della shell perché non è la shell.
user253751

3
@ jx12345 Per chiarire: se posso aggiungere o modificare variabili env al mio processo genitore, potrei concepibilmente influenzare il genitore genitore, e così via fino al PID 1. Questo si chiama "escalation di privilegi" ed è davvero una brutta cosa da una sicurezza punto di vista.
Shadur,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.