我有一个 php 脚本,它通过传递参数来运行另一个期望脚本。
$output = shell_exec("expect login_script.tcl '$user' '$host' '$port' '$password'");
使用 shell_exec 不起作用,因为脚本在后台运行或在 php 脚本中运行。我需要它在前台运行,允许用户交互。有没有一种优雅的方式来做到这一点。由于不得不使用不同的脚本语言,它已经变得一团糟。我尝试用一个调用 php 脚本的 shell 脚本来包装这两个脚本,将结果分配为一个变量(这是一个命令),然后在其上运行 sh。但是,当脚本在后台运行并且任何用户交互都会导致暂停/冻结时,我又遇到了同样的问题。如果 php 在调用 shell exec 时“退出”,在这种情况下就可以了。IE。php 停止并期望像您调用它一样运行。(就像我刚刚复制输出的命令并将其粘贴到终端一样)。
更新我对 php 中的以下命令有更多的运气:
shell_exec("gnome-terminal -e 'bash -c \"expect ~/commands/login_script.tcl; exec bash\"' &");
但是,为了在辅助脚本 (login_script) 完成后不立即关闭 shell,是否可以对此进行改进?
进一步更新
通过阅读答案,我认为我需要澄清一些事情,因为看起来人们正在假设一个“更复杂”的问题。
这两个进程不需要相互通信,我可能不应该将其
$output = shell_exec
放在示例中,而是单独放置,shell_exec
因为我相信这会导致混乱。php 脚本只需要使用一些cli 参数来启动expect 脚本,例如my-script 'param1' 'param2' 并且可以被认为是完全“异步”的。这很像“launchy”或“synapse”等启动程序的行为,它们可以启动其他程序但不需要影响它们。他们也不会等待辅助程序退出/完成。
我犯了一个错误,说“shell_exec”对我不起作用。我应该说的是'到目前为止我还没有成功使用 shell_exec',但是
shell_exec("gnome-terminal -e 'bash -c \"expect ~/commands/login_script.tcl; exec bash\"' &");
'工作'但仍在尝试找到正确的引号组合以允许将参数传递给期望脚本。