web-dev-qa-db-ja.com

リモートシェルスクリプトのパスフレーズを入力してください

パスフレーズを入力せずに、スクリプトを実行してリモートサーバーにログインし、リモートsshコマンドを実行するにはどうすればよいですか?

例:

リモートサーバーにログオンしてgit pullコマンドを実行すると、sshが表示されます。パスフレーズの入力を求められます。

$ git pull Origin master
Enter passphrase for /home/v3ed2/.ssh/id_rsa:

パスフレーズを入力したら、コマンドを続行します。

リモートサーバーにログインしてコマンドを実行するスクリプトを実行したいと思います。私はすでにこのスクリプトを試しました:

ssh ve "cd clients/ ; git pull"

ただし、スクリプトを実行しても、パスフレーズの入力を求められません。パスフレーズを待っている間、スクリプトがハングするだけですが、パスフレーズを入力しようとすると、次のエラーが発生します。

bash: line 1: [REDACTED]: command not found    
5
luk3thomas

コマンドなしでsshを実行すると、サーバー側に疑似端末がセットアップされ、その端末で対話型シェルが実行されます。コマンドを渡すと、コマンドはSSHチャネルに直接接続された入力と出力で実行され、リモート端末はありません。 _-t_オプションを渡すと、リモート側に端末が作成され、パスワードを入力できるパスワードプロンプトが表示されます。

_ssh -t ve "cd clients/ ; git pull"
_

ただし、これは便利な方法ではありません。便利な方法は、ローカルマシンでSSHエージェントを実行し、そのエージェントの接続を転送することです。

まず、(gitサーバーへの)2番目の接続で、パスワード認証ではなく公開鍵認証を使用する必要があります。あなたはすでにこれを行っているので、これ以上詳しくは説明しません。

2番目のサーバーの秘密鍵(中間マシンでは_/home/v3ed2/.ssh/id_rsa_)をローカルマシンにコピーします。または、gitサーバーで、ローカルマシンに秘密鍵がある公開鍵を承認します。または、最初に_ssh -t ve ssh-add .ssh/id_rsa_を実行して、中間マシンのキーをローカルエージェントに登録します。

一部のディストリビューションおよびデスクトップ環境では、SSHエージェントがすでにセットアップされています。 _ssh-add -l_で実行されているものがあるかどうかを確認します。これにより、実行中のエージェントがないことがわかった場合は、セッションからエージェントを開始する必要があります。 _ssh-agent your-session-manager_を直接呼び出す代わりに_your-session-manager_を実行するか、セッション起動スクリプトでeval $(ssh-agent)を実行するか、GUI構成の[SSHエージェントの実行]チェックボックスをオンにします。 _ssh-agent_プログラムを起動することと、セッションの環境に設定または出力する_SSH_AUTH_SOCK_変数を取得することの2つを行う必要があります。これを行う方法の詳細は、ディストリビューションおよびデスクトップ環境に非常に固有です。

SSHエージェントをローカルで実行したら、転送されていることを確認してください。デフォルトで転送される場合とされない場合があります。 _ssh ev ssh-add -l_を実行して、エージェントが転送されているかどうかを確認します。そうでない場合は、行_ForwardAgent yes_をローカルの_~/.ssh/config_に追加します。

ローカルでPuTTYを使用してWindowsを実行している場合は、キーエージェントであるPageantも付属しています。手順については、 PuTTYマニュアル を参照してください。

SSHエージェントを設定したら、コマンド_ssh-add ~/.ssh/id_rsa_(または秘密鍵へのパス)を使用して、セッションごとに1回鍵をエージェントに登録します。この後、セッションの残りの部分をプロンプトなしでキーを使用できます。

質問が広すぎるため、これを修正するには複数のバリエーションがあります。

1つ目は、パスフレーズなしでキーを使用することです。技術的には、パスフレーズは、ローカル秘密鍵を暗号化する対称暗号化アルゴリズムの鍵です。空のパスフレーズは、キーが暗号化されておらず、アクセス権を持つすべてのユーザーが使用できることを意味します。 ssh-keygenに、生成時に-N ''で空のパスフレーズを使用するように指示するか、後で-pを使用して変更することができます(ここでのすべてのオプションはOpenSSHフレーバー用です)。これは、リモートシステムへの署名付き自動アクセスを提供するための最も一般的な方法です。多くの場合、キーに対するサーバー側の制限(IP、強制コマンド、制限されたシェルなどによる制限)と組み合わされます。

必要に応じて、暗号化されたディスク上の暗号化されていない秘密鍵を保護できます。

次に、ssh-agentを使用できます。ユーザーがシステムにログオンする必要があり、実行中にパスフレーズをメモリにキャッシュするため、X端末セッション(またはアナログ)中にパスフレーズを1回だけ入力すると、パスフレーズを繰り返さずにリモートサーバーに自動的にログオンできます。

次に、クライアントホストとサーバーホストの両方が同じレルムに属している場合、リモートログイン用の独自のセッション時間チケットを提供するKerberosを使用できます。

次に、expectまたは同様のツールを使用して、コマンドが実行される端末との対話を自動化できます。そのスクリプトは、パスフレーズプロンプトをリッスンして入力する必要があります。しかし、これはここで説明する他のすべてのアプローチよりもはるかに複雑で面倒であり、他の人が失敗した場合の最後の手段として扱う必要があります。

このリストは、よりエキゾチックなアプローチで続けることができます:)

3
Netch

あなたが探しているのはSSHキーの使用だと思います。一連の鍵(1つは秘密、もう1つは公開)を生成し、リモートシステムのアカウントに公開鍵を追加する必要があります。キーを配置すると、パスワードの入力を求められることなく、他のシステムにリモートでログインできるようになります。

詳細については、次のハウツーを確認してください。

1
slm