私は、ssh-agentを起動してエージェントに秘密鍵を追加するシェルスクリプトを作成しようとしています。例:
#!/bin/bash
# ...
ssh-agent $Shell
ssh-add /path/to/key
# ...
これの問題は、ssh-agentが$ Shellの別のインスタンス(私の場合はbash)を開始することであり、スクリプトの観点からは、すべてが実行され、ssh-addとその下にあるものは実行されません。
シェルスクリプトからssh-agentを実行して、コマンドのリストを下に移動する方法を教えてください。
ssh-agentはセッションを開始することになっており、それが終了するとユーザーセッションは終了します。したがって、ssh-agentの後のコマンドは、おそらくログオフ後に実行されます。
必要なのは、次のようなセッションコマンドを含むsession-script
です。
#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter
次にssh-agent session-script
を起動します。
スクリプトの先頭に次のように記述します。
eval `ssh-agent`
スクリプトは次のようになります。
#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...
説明
ssh-agent
の前後のバッククォートは、その出力を収集します。 eval
はその出力を収集し、単一のコマンドに連結してから、コマンドを実行します。次に、ssh-add
を使用してキー認証情報を提供できます。
エージェントを必要とするスクリプトでは、このようなことをする傾向があります。
#!/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
)。
私はこれが私のために働くことを発見しました。
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プロセスを作成し、キーを追加し、必要な操作を実行してから、強制終了します。後で実行されているかどうかを確認する必要はありません。
この場合はkeychainを使用することをお勧めします
Debian/Ubuntu:
apt-get install keychain
RHEL/Fedora/CentOS
yum install keychain
.bashrcに以下を追加します。
eval `keychain --eval id_rsa`
Zoredacheのソリューションで見つけた、キーは、スクリプトを呼び出したシェルと同じssh-agentをたまたま共有しているすべてのシェルで使用できます。明らかなセキュリティ上の理由から、リモートマシンへのrootアクセスを必要とするスクリプトでは、これを避けたかったのです。
次のシバンをスクリプトの一番上に置くとわかりました。
#!/usr/bin/ssh-agent bash
ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"