Я пытаюсь управлять системами ssh-agent, добавляя к нему новые ключи, используя ssh-add. Для этого я использую компонент Symfony Process.Управление интерактивным процессом с помощью PHP с использованием Symfony Process
Когда я запускаю этот код с веб-сайта он отлично работает нормально, но когда я запускаю тот же код в оболочке/утешать процесс SSH-добавить висит на 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
, устанавливает SSH_AUTH_SOCK
в среде так ssh-add
может говорить с агентом, а затем отправляет пароль в поле ввода. Как я уже говорил ранее, когда я запускаю это в веб-контексте, он работает, но он зависает в контексте оболочки/консоли.
Я сделал strace
о том, когда работает в консоли, и соответствующие части выглядит следующим образом
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
начинает блокировать ожидание ввода.
ARE YOU гнездования команды? этот вопрос ожидает ввода от пользователя, но он заблокирован за вашим процессом упаковки. Вам нужно будет найти способ выполнить базовую команду не интерактивно. – Flosculus
Я не думаю, что процесс ssh_add заблокирован, так как я могу ввести пароль вручную. Более того, скрипт PHP не может вводить пароль для пользователя, так как ssh_add переместился на передний план, и скрипт PHP просто сидит, ожидая завершения процесса. – codeaken
Что такое fd's 5 и 7 для этого процесса? Где открывается fd 4? Выполняет ли запуск скрипта из оболочки с помощью ' dev/null' (и, возможно,' 2 dev/null') работать? –