【发布时间】:2015-01-17 07:20:39
【问题描述】:
我正在尝试通过使用ssh-add 添加新密钥来控制系统ssh-agent。为此,我使用了Symfony Process 组件。
当我从网站运行此代码时,它工作得非常好,但是当我在 shell/控制台中运行相同的代码时,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,在环境中设置SSH_AUTH_SOCK,以便ssh-add 可以与代理对话,然后在输入中发送密码。正如我之前所说,当我在 Web 上下文中运行它时,它可以工作,但它会挂在 shell/控制台上下文中。
我在控制台中运行时做了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 程序开始阻塞等待输入。
【问题讨论】:
-
你在嵌套命令吗?该问题期待用户的输入,但它在您的包装过程中被阻止。您需要找到一种非交互方式执行底层命令的方法。
-
我不认为 ssh_add 进程被阻止,因为我可以手动输入密码。更重要的是 PHP 脚本无法为用户输入密码,因为 ssh_add 已移至前台,而 PHP 脚本只是等待进程完成。
-
fd 的 5 和 7 是什么? fd 4在哪里打开?使用
< /dev/null(可能还有2</dev/null)从shell 运行脚本是否有助于它工作?
标签: php shell symfony process symfony-process