これは長い間抱えていた問題ですが、何かを見つけようとするたびに迷子になるので、経験豊富な誰かが助けてくれる場所をここで尋ねたほうがいいと思いました。
私のRaspberry PiはRaspbian Jessieを実行しており、SSHを使用してログインし、リモートでコマンドを実行します。最初のSSHセッション中に、ログインするたびにssh-agent
プロセスが生成されたRPiに気づきましたが、exit
ingで強制終了されませんでした。数回ログインおよびログアウトすると、一連のssh-agent
プロセスがちょうど生成されました。何もせずにぶら下がったままにしておきます。マニュアルページとあちこちでいじくり回して、最近ssh-agent
の目的を理解しました。また、ログアウトすると通常は強制終了されることもわかったので、なぜそうでないのかを自問し始めました。さらに、source ~/.bashrc
を発行するとssh-agent
の別のインスタンスが生成されることに気付きました。 SSH_AGENT_PID
プログラムをeval
内で開始してその出力を実行し、そのような変数を定義して、他のSSH関連で使用する必要があるため、環境変数ssh-agent
を定義する必要があることを 相対manページ で読みますssh-agent -k
(現在のセッションに対してエージェントを強制終了するため)を含むコマンドなので、echo $SSH_AGENT_PID
とecho $SSH_AUTH_SOCK
を実行しましたが、どちらも空でした。私は突然気づきました。おそらくssh-agent -k
が設定されていない環境変数からPIDを読み取ろうとするため、ログアウト時にプロセスが強制終了されません。
ログアウト時にssh-agent
が強制終了されないため、必要な環境変数が設定されていないためにこれが発生することは確かですが、これは1つのことを意味するだけです:ログイン時にssh-agent
を呼び出すと、おそらく適切な方法で実行されません(これはeval "$(ssh-agent -s)"
)になります。だから私は思った:まあ、問題は何ですか?エージェントを起動して手動で修正するために実行される構成ファイル、サービス、またはログインスクリプトを見つけます。 いったいどこにあるのでしょうか
ssh-agent
を呼び出すたびにsource ~/.bashrc
が生成されることに気付いたので、これは最初に検査したファイルでしたが、SSHに関連するものをリモートで参照するものはありませんでした。 次のすべてのファイル内でvi
を使用して文字列ssh
を検索し続けましたが、何も見つかりませんでした:
~/.bashrc
~/.profile
/etc/bash.bashrc
/etc/profile
/etc/profile.d/ (every file in this folder)
/etc/environment
source ~/.bashrc
に関係する可能性のあるファイルが他にありますか?よくわかりません。
次に関連するsystemd
サービスを検索しましたが、ssh.service
であるWantedBy=multi-user.target
しか検出されなかったため、ログイン時に実行されません(これはSSHサーバーデーモンであるため、明らかです)。
また、/home/pi
フォルダー内のすべてのファイルを一時フォルダーに移動してみましたからログアウトして再度ログインしましたが、ssh-agent
がまだ生成されています。
最終的に、私は室内で最後に撃ったショットも発射しました。ルートとしてfind / -name 'ssh-agent'
を実行したため、実行可能ファイルである/usr/bin/ssh-agent
のみが表示されたため、基本的には親コマンドのみを記録する偽の実行可能ファイルを作成しました:
#! /bin/bash
ps -o args= $PPID > /home/pi/LOG
cat /proc/$PPID/cmdline >> /home/pi/LOG
実際の/usr/bin/ssh-agent
の名前を変更し、適切な権限/ユーザー/グループを設定する偽の1つに置き換え、source ~/.bashrc
を再度実行して、LOG
ファイルを出力しました。
-bash
-bash
何が起こっているかについての単一の手掛かりではありません。
もう少し詳細を追加します。役立つかどうかはわかりませんが、ご存知のように...申し訳ありませんが安全です。
これが私の .bashrc
です。
useradd -m dummy
を使用してdummy
という名前の新しいユーザーを作成しましたが、そのユーザーにログインしてもssh-agent
は起動しません(これは何かを意味しているように思えます)。 diff /home/pi/.bashrc /home/dummy/.bashrc
は、diff /home/pi/.profile /home/dummy/.profile
と同じように、基本的に何も表示しません(私が作成したコメントのみ)。
SSH_AUTH_SOCK
が設定されていなくても、エージェントソケットは問題なく作成されます。
pi:~$ ls -lAh /tmp/ssh-vQRTAyj7DJry/
total 0
srw------- 1 pi pi 0 Jan 28 03:12 agent.1328
理由は定かではありませんが、ソケットファイル名の番号は常にssh-agent
プロセスのPIDの直前の番号です。
htop
からの抜粋:
PID USER PRI NI VIRT RES SHR S Command
1 root 20 0 5472 3900 2728 S /sbin/init
1329 pi 20 0 3696 224 16 S └─ ssh-agent -s
ssh
に一致するインストール済みパッケージ:
pi:~$ apt list --installed | grep ssh
libpam-chksshpwd/oldstable,now 1.1.8-3.1+deb8u2+rpi3 armhf [installed]
libssh-gcrypt-4/oldstable,now 0.6.3-4+deb8u2 armhf [installed,automatic]
libssh2-1/oldstable,now 1.4.3-4.1+deb8u1 armhf [installed,automatic]
openssh-client/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
openssh-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
openssh-sftp-server/oldstable,now 1:6.7p1-5+deb8u4 armhf [installed,automatic]
ssh/oldstable,now 1:6.7p1-5+deb8u4 all [installed]
sshpass/oldstable,now 1.05-1 armhf [installed]
ssh-agent -s
および/etc
でgrep
を使用して/lib
を再帰的に検索しても、結果はありません。
デスクトップ環境はインストールしていませんが、/etc/X11
フォルダーに構成ファイルがいくつか含まれています。万が一に備えてフォルダの名前を変更して再起動してみましたが、プロセスがまだ起動しているので、どうやらこれはあまり関係ありません。
さて、それをできるだけ簡単にするために、私は2つの質問しか持っていません:
ssh-agent
はどこでどのように生成され、誰がコマンドを発行しますか?考えられる理由がいくつかあります。
_libpam-ssh
_を使用している場合は、セッション起動の一部としてSSHエージェントを自動的に起動できます。また、パスフレーズがないか、パスフレーズがログインと同じ場合は、キーを自動的にロードすることもできます。パスワード。
_gpg-agent
_を使用している場合は、オプションで_ssh-agent
_のタスクも実行できます。そのシャットダウンは異なる方法で処理されるため、_SSH_AUTH_SOCK
_ではなく_SSH_AGENT_PID
_環境変数のみが存在します。
ワークステーションでSSHエージェント(PuTTYのPageantなど)を実行していて、エージェント転送を有効にしてSSH接続を確立すると(リモートsshd
で許可されます)、リモートホストでは_SSH_AUTH_SOCK
_ _SSH_AGENT_PID
_なし...エージェントソケットはsshd
に移動し、ローカルワークステーションのSSHエージェントにトンネルされます。