ssh-agentの出力を評価する理由


67

実行するssh-agentには、使用する必要があります

eval $(ssh-agent)

なぜeval出力する必要があるのssh-agentですか?

なぜ実行できるように設計されていないのですか?


注:推奨されていないため、バックティック( `)は削除されました。たとえば、ここで詳細読むことができます


evalを使用する必要があると言うのは誰ですか?これは何を決定するのですか?もう少しコンテキストが役立ちます。
0xSheepdog


9
@ 0xSheepdogのmanページ、はじめに...
jasonwryan

ユースケースはマニュアルページに文書化されているようです。「なぜそれが特定の方法で設計されている」 ... 肩をすくめるを
-0xSheepdog

5
繰り返しますが、シェルの子プロセスで実行されるssh-agentため、「このように設計されている」のではなく、unix / linux ssh-agentです。子プロセスは親プロセスを変更できません。ただし、関数は次のことができます。現在のプロセスで実行されるためです。したがって、関数do_set_ssh_agent() { eval ssh-agent ; }を書くことができ、それは単純に:として実行できます$ 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では、プロセスは自身の環境変数のみを変更し、それらを子に渡すことができます。それはできませんシステムがそれを許可しないので、親プロセスの環境を変更します。これは非常に基本的なセキュリティ設計です。

ログインシェル、ウィンドウマネージャなど、SSH環境変数を設定するために必要な他の場所evalを使用して回避することができます。これはマニュアルにも記載されています。ssh-agent utilityutility


ありがとう、それは何が起こっているのかを明確に説明し、私はそれを得ますが、なぜそれが実行されると自動的に変数が環境に追加されるように設計されているのではなく、そのように設計されているのですか?何らかの柔軟性が追加されますか?
jx12345

4
@ jx12345 ログインシェル、ウィンドウマネージャー、またはSSH環境変数を設定するために必要な他の場所evalを使用することで回避できます。これはマニュアルにも記載されています。外部ユーティリティは、呼び出し環境で変数を設定できません。ssh-agent utilityutility
クサラナナンダ

@kusalananda正しい; 編集として自由に追加してください。今はベッドに行くか、自分でやる。
シャドゥール

5
@ jx12345独自の環境に変数を追加できますが、シェルではないため、シェルの環境に変数を追加できないためです。
user253751

3
@ jx12345明確にするために:env変数を親プロセスに追加または変更できる場合、おそらく親の親などにPID 1まで影響を与える可能性があります。これは「特権エスカレーション」と呼ばれ、セキュリティ上非常に悪いことです。立場。
シャドゥール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.