web-dev-qa-db-ja.com

シェルスクリプトからのssh-agentの実行

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

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

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

シェルスクリプトからssh-agentを実行して、コマンドのリストを下に移動する方法を教えてください。

19
Dan

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

必要なのは、次のようなセッションコマンドを含むsession-scriptです。

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

次にssh-agent session-scriptを起動します。

10

スクリプトの先頭に次のように記述します。

eval `ssh-agent`

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

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

説明

ssh-agentの前後のバッククォートは、その出力を収集します。 evalはその出力を収集し、単一のコマンドに連結してから、コマンドを実行します。次に、ssh-addを使用してキー認証情報を提供できます。

16
scottyseus

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

#!/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)。

6
Zoredache

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

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プロセスを作成し、キーを追加し、必要な操作を実行してから、強制終了します。後で実行されているかどうかを確認する必要はありません。

6
steampowered

この場合はkeychainを使用することをお勧めします

Debian/Ubuntu:

apt-get install keychain

RHEL/Fedora/CentOS

yum install keychain

.bashrcに以下を追加します。

eval `keychain --eval id_rsa`
4

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

次のシバンをスクリプトの一番上に置くとわかりました。

#!/usr/bin/ssh-agent bash

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