通过 php 将标准输入通过管道传输到 shell 脚本中
Pipe stdin into a shell script through php
我们有一个维护特殊权限的命令行 php 应用程序,并希望使用它将管道数据中继到 shell 脚本。
我知道我们可以通过以下方式读取 STDIN:
while(!feof(STDIN)){
$line = fgets(STDIN);
}
但是我怎样才能将该 STDIN 重定向到 shell 脚本中呢?
STDIN 太大,无法加载到内存中,因此我无法执行类似操作:
shell_exec("echo ".STDIN." | script.sh");
正如@Devon 所说,popen
/pclose
在这里非常有用。
$scriptHandle = popen("./script.sh","w");
while(($line = fgets(STDIN)) !== false){
fputs($scriptHandle,$line);
}
pclose($scriptHandle);
或者,对于较小的文件,fputs($scriptHandle, file_get_contents("php://stdin"));
中的某些内容可能会代替逐行方法。
将 xenon 的答案与 popen 一起使用似乎可以解决问题。
// Open the process handle
$ph = popen("./script.sh","w");
// This puts it into the file line by line.
while(($line = fgets(STDIN)) !== false){
// Put in line from STDIN. (Note that you may have to use `$line . '\n'`. I don't know
fputs($ph,$line);
}
pclose($ph);
我们有一个维护特殊权限的命令行 php 应用程序,并希望使用它将管道数据中继到 shell 脚本。
我知道我们可以通过以下方式读取 STDIN:
while(!feof(STDIN)){
$line = fgets(STDIN);
}
但是我怎样才能将该 STDIN 重定向到 shell 脚本中呢?
STDIN 太大,无法加载到内存中,因此我无法执行类似操作:
shell_exec("echo ".STDIN." | script.sh");
正如@Devon 所说,popen
/pclose
在这里非常有用。
$scriptHandle = popen("./script.sh","w");
while(($line = fgets(STDIN)) !== false){
fputs($scriptHandle,$line);
}
pclose($scriptHandle);
或者,对于较小的文件,fputs($scriptHandle, file_get_contents("php://stdin"));
中的某些内容可能会代替逐行方法。
将 xenon 的答案与 popen 一起使用似乎可以解决问题。
// Open the process handle
$ph = popen("./script.sh","w");
// This puts it into the file line by line.
while(($line = fgets(STDIN)) !== false){
// Put in line from STDIN. (Note that you may have to use `$line . '\n'`. I don't know
fputs($ph,$line);
}
pclose($ph);