3

想象一下,我的服务器上有一个 script.sh 询问您的姓名。你运行脚本,它说:

what is your name?

然后你输入你的名字,它会打印:

hello name! 

是否可以使用 php exec 运行这样的脚本?那就是执行脚本并以某种方式回答它可能遇到的不同问题?

希望我清楚。我真正想做的是从我们的开发服务器自动执行“git pull”命令,但它一直在询问用户名/密码。我知道我可以使用 ssh 证书登录来避免这种情况,但我的问题仍然存在。我可以使用 exec() 并回答脚本中未来的问题吗?

4

3 回答 3

4

值得注意的是,在您的情况下,更好的解决方案是使用 SSH 密钥进行身份验证。但是,您也许可以使用PHP Expect来实现这一点。

ini_set("expect.timeout", -1);
ini_set("expect.loguser", "Off");

$stream = expect_popen("git pull");

while (true) {
    switch (expect_expectl ($stream, array (
            array ("username:", USERNAME),
            array ("password:", PASSWORD),
    ))) {
        case USERNAME:
            fwrite ($stream, "usename\n");
            break;
        case PASSWORD:
            fwrite ($stream, "secret\n");
            break;

        case EXP_TIMEOUT:
        case EXP_EOF:
            break 2;

        default:
            die ("Error has occurred!\n");
    }
}

fclose ($stream);
于 2012-11-29T18:53:24.833 回答
1

对于您的问题:您可以做的一件事是,如果您完全知道要求使用管道 exec("echo 'hello world' | some_command") 如果您需要更复杂的交互,请查看 popen()。popen 为您提供对进程的流式访问,因此您可以使用 fread/fwrite 等但这些不适用于您的情况,因为大多数 ssh 实现使用特殊 API 检查交互式输入。您可以在那里做的是使用密钥或查看 ssh-agent。

于 2012-11-29T18:56:12.957 回答
1

当您使用 php 执行命令时,该命令要求您回答单个问题以完成该过程。

回声'答案' | 命令

如果您需要回答多个问题,您可以访问此链接:PHP 执行命令和回答命令问题

于 2018-05-16T12:08:57.277 回答