Mengapa eval output dari ssh-agent?

67

Untuk menjalankan ssh-agentsaya harus menggunakan

eval $(ssh-agent)

Kenapa saya harus evaloutput ssh-agent?

Mengapa tidak dirancang agar saya bisa menjalankannya?


Catatan: Backticks (`) dihapus karena sudah tidak digunakan lagi. Anda dapat membaca lebih lanjut tentang hal ini di sini .

jx12345
sumber
Siapa bilang Anda harus menggunakan eval? Apa yang mendikte ini? Konteks yang lebih sedikit akan membantu.
0xSheepdog
9
@ 0xSepatu manhalaman, untuk permulaan ...
jasonwryan
Sepertinya kasus penggunaan didokumentasikan di halaman manual. Adapun "mengapa itu dirancang dengan cara tertentu" ... mengangkat bahu .
0xSheepdog
5
Mengulangi, itu bukan ssh-agentyang "dirancang dengan cara ini", itu unix / linux, karena ssh-agentberjalan dalam proses anak dari shell. Proses anak tidak dapat mengubah proses induk. Tetapi fungsi dapat: karena berjalan dalam proses saat ini. Jadi Anda bisa menulis fungsi: do_set_ssh_agent() { eval ssh-agent ; }dan yang bisa dijalankan hanya sebagai: $ do_set_ssh_agent. Tetapi "program" tidak (biasanya) diinstal sebagai "fungsi" di linux / unix; sebaliknya, program diinstal sebagai file, yang, sebagaimana disebutkan, dijalankan dalam proses anak. (Sumber skrip adalah pengecualian, tetapi ssh-agent adalah biner.)
michael

Jawaban:

79

ssh-agent menampilkan variabel lingkungan yang harus Anda hubungkan ke sana:

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

Dengan menelepon evalAnda segera memuat variabel-variabel itu ke lingkungan Anda.

Kenapa ssh-agenttidak bisa melakukan itu sendiri ... Catat pilihan kata. Bukan "tidak akan", " tidak bisa ". Di Unix, suatu proses hanya dapat memodifikasi variabel lingkungannya sendiri, dan meneruskannya ke anak-anak. Itu tidak dapat mengubah lingkungan proses induknya karena sistem tidak akan mengizinkannya. Ini adalah desain keamanan yang cukup mendasar.

Anda bisa menyiasatinya evaldengan menggunakan di ssh-agent utilitymana utilityshell login Anda, window manager Anda atau apa pun hal lain yang perlu ditetapkan variabel lingkungan SSH. Ini juga disebutkan dalam manual.

Shadur
sumber
Terima kasih, itu dengan jelas menjelaskan apa yang terjadi dan saya mengerti, tetapi mengapa itu dirancang seperti itu daripada dirancang sehingga menjalankannya secara otomatis menambahkan variabel ke lingkungan? Apakah ini menambah fleksibilitas?
jx12345
4
@ jx12345 Anda bisa menyiasatinya evaldengan menggunakan di ssh-agent utilitymana utilityshell login Anda, manajer jendela Anda atau hal lain apa pun yang diperlukan agar variabel lingkungan SSH diatur. Ini juga disebutkan dalam manual. Tidak ada utilitas eksternal yang dapat mengatur variabel di lingkungan panggilan.
Kusalananda
@ Kusalananda Benar; jangan ragu untuk menambahkannya sebagai suntingan. Saya pergi tidur sekarang atau saya akan melakukannya sendiri.
Shadur
5
@ jx12345 Karena itu dapat menambahkan variabel ke lingkungannya sendiri tetapi tidak dapat menambahkan variabel ke lingkungan shell Anda karena itu bukan shell Anda.
user253751
3
@ jx12345 Untuk memperjelas: Jika saya dapat menambah atau mengubah variabel env ke proses induk saya, saya dapat memengaruhi orangtua orangtua, dan seterusnya hingga PID 1. Ini disebut "hak istimewa eskalasi" dan ini merupakan hal yang sangat buruk dari keamanan sudut.
Shadur