ssh-addを使用して新しいキーを追加することにより、システムssh-agentを制御しようとしています。このために、私はSymfony Processコンポーネントを使用しています。
このコードを Web サイトから実行すると問題なく動作しますが、同じコードをシェル/コンソールで実行すると ssh-add プロセスがハングアップします。Enter passphrase for <path to key>:
コードの簡略化されたバージョンは次のようになります
use Symfony\Component\Process\Process;
$keyPath = '<path to key>';
$keyPassword = '<password for unlocking the key>';
$socketPath = '<path to ssh-agent socket>';
$sshAdd = new Process(
"ssh-add {$keyPath}",
null,
[
'SSH_AUTH_SOCK' => $socketPath
],
$keyPassword
);
$sshAdd->run();
上記のコードでわかるように、 を呼び出し、環境ssh-add
で を設定して、エージェントと通信できるようにし、入力でパスワードを送信します。前に言ったように、これを Web コンテキストで実行すると動作しますが、シェル/コンソール コンテキストではハングします。SSH_AUTH_SOCK
ssh-add
コンソールで実行するときにstrace
of を実行しました。関連する部分は次のようになります
open("<path to key>", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
write(4, "<key password>", <length of password>) = 20
close(4) = 0
wait4(9650, 0x7fff00ab3554, WNOHANG|WSTOPPED, NULL) = 0
select(8, [5 7], [], [], {0, 0}) = 0 (Timeout)
wait4(9650, 0x7fff00ab3554, WNOHANG|WSTOPPED, NULL) = 0
select(8, [5 7], [], [], {0, 0}) = 0 (Timeout)
select(8, [5 7], [], [], {0, 200000}Enter passphrase for <path to key>:) = 0 (Timeout)
select(8, [5 7], [], [], {0, 200000}) = 0 (Timeout)
select(8, [5 7], [], [], {0, 200000}) = 0 (Timeout)
select(8, [5 7], [], [], {0, 200000}) = 0 (Timeout)
select(8, [5 7], [], [], {0, 200000}) = 0 (Timeout)
...
ご覧のとおり、書き込みは無視されているようで、ssh-add
プログラムは入力待ちのブロックを開始します。