シェルスクリプトからssh-agentを実行する


19

とりわけ、ssh-agentを起動し、秘密鍵をエージェントに追加するシェルスクリプトを作成しようとしています。例:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

これに伴う問題は、ssh-agentが$ SHELLの別のインスタンス(私の場合はbash)をキックオフすることであり、スクリプトの観点からはすべて実行され、ssh-addの下にあるものは実行されません。

シェルスクリプトからssh-agentを実行し、コマンドのリストの下を移動するにはどうすればよいですか?

回答:


8

ssh-agentはセッションを開始し、終了するとユーザーセッションが終了することになっています。したがって、ssh-agentの後のコマンドは、おそらくログオフ後に実行されます。

あなたが望むのは、次のsession-scriptようなセッションコマンドを含むものです:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

次に開始しssh-agent session-scriptます。


ありがとう!別のスクリプトを作成し、スクリプトを終了するexitことでトリックを行いました。
ダン

2
セッションスクリプトとは何ですか?
アレクサンダーミルズ

15

スクリプトの先頭に次を追加します。

eval `ssh-agent`

スクリプトは次のようになります。

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

説明

周辺のバックティックはssh-agent出力を収集します。evalその出力を収集し、単一のコマンドに連結してから、コマンドを実行します。次にssh-add、キー資格情報を提供するために使用できます。


9
これはまさに私が必要としたものです、感謝しますが、バックティックが出て行くことを指摘する価値があります。新しいbashフォームでは、次のようになりますeval $(ssh-agent)
sibaz

この解決策はbash -i、スクリプトの最後に置くまで機能しませんでした。
アドルフォコレア

6

私はエージェントを必要とするスクリプトでこのようなことをする傾向があります。

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

基本的に、スクリプトが最初に行うことは、エージェントが実行されているかどうかを確認することです。そうでない場合は、execを使用して、スクリプトの代わりに新しいプロセスを開始します。エージェントが開始され、キーが追加され、最後にスクリプトが再度呼び出されます(を参照$0)。


ただし、スクリプトパラメーターは保持されません。また、いずれかのパラメーターに空白がある場合、それらを渡すのは簡単ではありません。
デニルソンサマイア

3
.. "ssh-add ; $0 $*"または、.. "ssh-add ; $0 $@"代わりに使用できます。これは完全ではありませんが、多くの場合に確実に機能します。最善の解決策は、とにかく他の何かの前にエージェントを実行することです。これは、あいまいな場合に役立つかもしれません。
ゾレダチェ14

6

私はこれが私のために働くことを発見しました。

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

ssh-agentプロセスを作成し、キーを追加し、必要なことを行ってから、強制終了します。後で実行されているかどうかを確認する必要はありません。


4

この場合、キーチェーンを使用することをお勧めします

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

.bashrcに次を追加します。

eval `keychain --eval id_rsa`

いい?なぜそれが良いのですか?
JFlo

その点で@JFloは「より良い」、env変数を$ HOME / .keychain / <file>に保存します。そのコマンドを再度実行すると、既存のssh-agentがまだ実行されている場合はそれを取得します。その後、シェル/スクリプト間で再利用できます。一部のシナリオでは、これは非常に安全ではないため、その呼び出しを行う必要があります。私にとって、それは私が同じタスクを達成するために書いたいくつかのスクリプトの改良である
スコットカールソン

2

Zoredacheのソリューションを使用すると、このキーは、スクリプトを呼び出したシェルと同じssh-agentを共有するすべてのシェルで使用可能になります。セキュリティ上の理由から、リモートマシンへのルートアクセスを必要とするスクリプトでは、これを回避したかったのです。

スクリプトの先頭に次のシェバンを置くことがわかりました。

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"

-2

私はたくさん試してみましたが、最終的に機能した解決策は、パスフレーズを空の文字列に置き換えることでした。

ssh-keygen -p

これは非常に安全な方法です。なぜsshを使用するのが面倒なのでしょうか?秘密鍵を保護しない場合、平文で話している可能性もあります。
JFlo

@JFlo:クライアントシステムが十分に安全な場合はそうではありません。特に、ACL、SELinux、または同様のものを追加することができます(静的ファイルでは簡単ですが、ssh-agentのランダム化ソケットではそうではありません)。つまり、私は通常、最初の選択肢としてそれをお勧めしません。
dave_thompson_085

それはあなたが提供する非常に有用なプロセスですが、私はそれがOPの質問について何も答えるとは思わない。
アレクサンダーバード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.