Зачем оценивать вывод ssh-agent?

67

Для того, чтобы бежать, ssh-agentя должен использовать

eval $(ssh-agent)

Почему я должен evalна выходе ssh-agent?

Почему он не предназначен для того, чтобы я мог его запустить?


Примечание: обратные галочки (`) удалены, поскольку они устарели. Вы можете прочитать об этом здесь, например .

jx12345
источник
Кто сказал, что вы должны использовать Eval? Что диктует это? Немного больше контекста поможет.
0xSheepdog
9
@ 0xSheepdog manстраницу, для начала ...
jasonwryan
Похоже, случаи использования описаны на странице руководства. Что касается того, «почему оно разработано определенным образом» ... пожимает плечами .
0xSheepdog
5
Повторюсь, это не ssh-agentто, что «спроектировано таким образом», это unix / linux, потому что ssh-agentзапускается в дочернем процессе оболочки. Дочерние процессы не могут изменять родительские процессы. Но функция может: потому что она выполняется в текущем процессе. Таким образом , вы могли бы написать функцию: do_set_ssh_agent() { eval SSH-агент , ; }и что можно было бы работать просто как: $ do_set_ssh_agent. Но «программы» (как правило) не устанавливаются как «функции» в linux / unix; вместо этого программы устанавливаются в виде файлов, которые, как уже упоминалось, выполняются в дочернем процессе. (Сценарии поиска являются исключением, но ssh-agent является двоичным.)
Майкл

Ответы:

79

ssh-agent выводит переменные окружения, которые вам нужно подключить к нему:

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

Позвонив, evalвы немедленно загрузите эти переменные в свою среду.

Что касается того, почему ssh-agentне может сделать это сам ... Обратите внимание на выбор слова. Не «не буду», « не могу ». В Unix процесс может изменять только свои собственные переменные окружения и передавать их дочерним элементам. Он не может изменить среду своего родительского процесса, потому что система этого не допустит. Это довольно простой дизайн безопасности.

Вы можете обойти это eval, используя, ssh-agent utilityгде utilityнаходится ваша оболочка входа в систему, ваш оконный менеджер или все, что нужно для установки переменных среды SSH. Это также упоминается в руководстве.

Shadur
источник
Спасибо, это ясно объясняет, что происходит, и я понимаю, но почему он спроектирован именно так, а не спроектирован так, что он автоматически добавляет переменные в среду? Это добавляет какую-то гибкость ???
jx12345
4
@ jx12345 Вы можете обойти это eval, используя, ssh-agent utilityгде utilityваша оболочка входа в систему, ваш оконный менеджер или что-то еще, для чего нужно установить переменные окружения SSH. Это также упоминается в руководстве. Никакая внешняя утилита не может устанавливать переменные в вызывающей среде.
Кусалананда
@kusalananda Правильно; не стесняйтесь добавлять это как редактирование. Я сейчас иду спать, или я бы сделал это сам.
Шадур
5
@ jx12345 Потому что он может добавлять переменные в свою среду, но не может добавлять переменные в среду вашей оболочки, потому что это не ваша оболочка.
user253751
3
@ jx12345 Чтобы уточнить: если я смогу добавить или изменить переменные env в свой родительский процесс, я мог бы повлиять на родительский процесс родителя и т. д. до PID 1. Это называется «повышение привилегий», и это очень плохо для безопасности точка зрения.
Шадур