Tại sao eval đầu ra của ssh-agent?


67

Để chạy ssh-agenttôi phải sử dụng

eval $(ssh-agent)

Tại sao tôi phải evalđầu ra ssh-agent?

Tại sao nó không được thiết kế để tôi có thể chạy nó?


Lưu ý: Backticks (`) bị xóa vì chúng không được dùng nữa. Bạn có thể đọc thêm về nó ở đây chẳng hạn .


Ai nói bạn phải sử dụng eval? Điều gì đang ra lệnh này? Một chút bối cảnh sẽ giúp.
0xSheepdog


9
@ 0xSheepdog mantrang, để bắt đầu ...
jasonwryan 15/03/2017

Có vẻ như các trường hợp sử dụng được ghi lại trong trang man. Như "tại sao nó được thiết kế theo một cách nhất định" ... nhún vai .
0xSheepdog

5
Xin nhắc lại, đó không phải ssh-agentlà "được thiết kế theo cách này", đó là unix / linux, vì ssh-agentchạy trong một tiến trình con của trình bao. Các tiến trình con không thể sửa đổi các tiến trình cha. Nhưng một chức năng có thể: bởi vì nó chạy trong quy trình hiện tại. Vì vậy, bạn có thể viết một hàm: do_set_ssh_agent() { eval ssh-agent ; }và có thể được chạy đơn giản là : $ do_set_ssh_agent. Nhưng "chương trình" không (thường) được cài đặt là "hàm" trong linux / unix; thay vào đó, các chương trình được cài đặt dưới dạng tệp, như đã đề cập, chạy trong một tiến trình con. (Nguồn kịch bản là một ngoại lệ, nhưng ssh-agent là nhị phân.)
michael

Câu trả lời:


79

ssh-agent đưa ra các biến môi trường mà bạn cần phải kết nối với nó:

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

Bằng cách gọi evalbạn ngay lập tức tải các biến đó vào môi trường của bạn.

Về lý do tại sao ssh-agentkhông thể làm điều đó ... Lưu ý lựa chọn từ. Không phải "sẽ không", " không thể ". Trong Unix, một quy trình chỉ có thể sửa đổi các biến môi trường của chính nó và truyền chúng cho trẻ em. Nó không thể sửa đổi môi trường của quy trình mẹ vì hệ thống sẽ không cho phép. Đây là thiết kế bảo mật khá cơ bản.

Bạn có thể nhận được xung quanh evalbằng cách sử dụng ssh-agent utilitynơi utilitylà vỏ đăng nhập, quản lý cửa sổ của bạn hoặc bất cứ điều khác cần phải có các biến môi trường SSH thiết lập. Điều này cũng được đề cập trong hướng dẫn.


Cảm ơn, điều đó giải thích rõ ràng những gì đang diễn ra và tôi hiểu điều đó, nhưng tại sao nó được thiết kế theo cách đó chứ không phải được thiết kế để nó tự động thêm các biến vào môi trường? Nó có thêm bất kỳ loại linh hoạt ???
jx12345

4
@ jx12345 Bạn có thể nhận được xung quanh evalbằng cách sử dụng ssh-agent utilitynơi utilitylà vỏ đăng nhập, quản lý cửa sổ của bạn hoặc bất cứ điều khác cần phải có các biến môi trường SSH thiết lập. Điều này cũng được đề cập trong hướng dẫn. Không có tiện ích bên ngoài nào có thể đặt biến trong môi trường gọi.
Kusalananda

@kusalananda Đúng; cảm thấy tự do để thêm nó như là một chỉnh sửa. Bây giờ tôi đi ngủ hoặc tôi sẽ tự làm điều đó.
Shadur

5
@ jx12345 Bởi vì nó có thể thêm biến vào môi trường của chính nó nhưng nó không thể thêm biến vào môi trường shell của bạn vì đó không phải là vỏ của bạn.
user253751

3
@ jx12345 Để làm rõ: Nếu tôi có thể thêm hoặc thay đổi các biến env để quá trình cha mẹ tôi, tôi hình dung có thể ảnh hưởng đến cha mẹ của cha mẹ, và vân vân lên đến PID 1. Đây được gọi là "leo thang đặc quyền" và đó là một điều thực sự tồi tệ từ an ninh quan điểm.
Shadur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.