設定した 2 つのアカウントの ssh-agent の動作に若干の矛盾があるようです。
実行中の VM の可用性を確認するための簡単な監視スクリプトを作成しました。すべてのテストとデバッグはメインのアクセス アカウントで行いました。その過程で、SSH キー ペアを生成し、ssh-agent を起動し、エージェントに ID を追加して、スクリプトがパスワードなしで ssh を実行できるようにしました。
ここで、このスクリプトをサービス アカウント ユーザーとして実行したいと思います。サービス アカウントを作成し、キーを生成するためにログイン シェルを一時的に /bin/bash に設定しました。キーを生成し、パスフレーズを削除し、エージェントに ID を追加しました。
矛盾は、シェルがエージェントに接続する方法にあるようです。私のユーザー アカウントでは、テストを開始してから (約 2 週間) エージェントを再起動する必要はありませんでした。ただし、サービス アカウントでスクリプトを実行しようとすると、毎回エージェントを再起動し、ID を追加してから作業を実行する必要があるようです。
理想的には、エージェントを無期限に実行し、スクリプトが実行されるたびにサービス アカウントが自動的にエージェントに再接続されるようにして、スクリプト内のプロセスを管理する必要がないようにしたいと思います。各アカウントの構成を確認しましたが、違いは見つかりませんでした。ご意見をいただければ幸いです。
**編集: エージェントは継続的に実行されますが、サービス アカウントのシェル プロセスはそれを使用していないようで、新しいものを開始する必要があることを指摘するのを忘れていました。
ovmmon 14043 0.0 0.0 53916 204 ? Ss May17 0:00 ssh-agent
ovmmon 14952 0.0 0.0 53916 204 ? Ss May17 0:00 ssh-agent
答え1
ここでは次の 2 つのうちのいずれかが起こっています。
- ログアウトするとssh-agentは実際に閉じられます
- ssh-agentはまだ実行されていますが、PIDとパイプに関する情報は失われています。
ps -ef を実行して ssh-agent を確認することで、どちらのケースであるかを確認できます。
ssh-agent が機能しなくなった場合は、それを有効にしておく方法が必要です。その方法は 3 つあります。
- サーバーの起動時に、スタートスクリプトから ssh-agent を起動し、出力をファイルにエコーすることができます (不正使用を防ぐために適切なアクセス権が必要です)。キーをパスワードなしで作成する場合は、スクリプトからキーを追加することもできます (もちろん、最後の部分は、接続先のアカウントがリモート サーバーで非常に制限された権限を持っている場合にのみ推奨されます)。次に、スクリプトで、起動時に作成されたファイルから SSH エージェント情報を読み込みます。
- サービス アカウントにログインするときに screen を使用し、エージェントを起動したら screen セッションから切断します。
- エージェントを起動するときは nohup を使用します。
ssh-agent が停止していないのに環境情報が失われている場合は、起動時に環境変数を特定のファイルに書き込むようにしてください。その後、ログイン時にシェルでそのファイルをソースします。
答え2
サブシェル呼び出し方法を使用している場合、シェルのログアウト時に ssh-agent は終了します。eval メソッドを使用する場合、シェルは手動で終了するまで実行され続けます。
見る:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch06_03.htm
具体的には:http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch06_03.htm#ch06-50031.html
また、cron ENV 変数から実行すると問題が発生する可能性があることもわかっています。そのため、これはチェックする必要がある別の領域です。