PHP有两个密切相关的函数,escapeshellarg()
和escapeshellcmd()
.他们似乎都做类似的事情,就是帮助一个字符串更安全的使用system()
/ exec()
的/ etc.
我应该使用哪一个?我只是希望能够接受一些用户输入并在其上运行命令,而不是让一切都爆炸.如果PHP有一个exec-type-function,它接受了一个绕过shell的字符串数组(比如argv),我会使用它.类似于Python的subprocess.call()
功能.
当我运行以下代码时:
cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Result: " + out.String())
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
退出状态1
但是,这对调试错误的确切原因没有帮助.
如何获得更详细的信息?
从Bash参考手册我得到以下关于exec
bash builtin命令:
如果提供了命令,它将替换shell而不创建新进程.
现在我有以下bash
脚本:
#!/bin/bash
exec ls;
echo 123;
exit 0
Run Code Online (Sandbox Code Playgroud)
执行了,我得到了这个:
cleanup.sh ex1.bash file.bash file.bash~ output.log
(files from the current directory)
Run Code Online (Sandbox Code Playgroud)
现在,如果我有这个脚本:
#!/bin/bash
exec ls | cat
echo 123
exit 0
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
cleanup.sh
ex1.bash
file.bash
file.bash~
output.log
123
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如果在exec
调用它取代了壳,而无需创建一个新的进程,为什么放时| cat
,将echo 123
被打印出来,但是没有它,它不是.所以,如果有人能解释这种行为的逻辑,我会很高兴.
谢谢.
编辑:@torek回复后,我更难解释行为:
1. exec ls>out
命令创建out
文件并输入ls
命令结果;
2. exec ls>out1 ls>out2
只创建文件,但不要放入任何结果.如果命令按照建议工作,我认为命令编号2应该与命令编号1具有相同的结果(更多,我认为它不应该创建out2
文件).
我一直试图让我们知道exec()
php中的命令是否成功执行,所以我可以相应地回复某些消息.我尝试了下面这段代码,但问题是无论是否exec()
成功运行它始终echo "PDF not created"
并且永远不会回显成功创建的pdf.请告诉我如何执行exec()执行检查,以便我可以相应地回复消息谢谢,
<?php
if (exec('C://abc//wkhtmltopdf home.html sample.pdf'))
echo "PDF Created Successfully";
else
echo "PDF not created";
?>
Run Code Online (Sandbox Code Playgroud) 我试图用exec()
它'whoami'
来检查它是否有效,我得到了结果
nt authority\system
Run Code Online (Sandbox Code Playgroud)
现在我需要运行.exe
带有php
via exec()
函数参数的文件.
我在命令提示符下尝试了这个,它实际上运行带有给定参数的程序.这是示例命令.
注意 exe文件获得3个输入(文件夹,file_name,report_file_nmae)
> ..\..\some_file.exe folder="C:\path_to_folder" param=1.xml report=2.xml
Run Code Online (Sandbox Code Playgroud)
但是当我从php
文件中运行此命令时:
exec('..\..\some_file.exe folder="C:\path_to_folder" param=1.xml report=2.xml');
Run Code Online (Sandbox Code Playgroud)
一切都没有发生.这是我第一次使用exec()函数,所以我不熟悉它的细节.怎么了?
我试过用:
\\
代替 \
escapeshellarg()
在目录上""
了目录文件夹名称没运气
附录:
echo exec($command) // echos < .... why?
Run Code Online (Sandbox Code Playgroud)
要么
exec($command, $output);
print_r($output); // Array()
Run Code Online (Sandbox Code Playgroud)
我甚至将文件的权限更改为对所有用户的完全控制权.如果我从中调用该程序command prompt
,我可以看到时钟旁边出现的图标.
但同样的呼叫php
甚至都不会调用该程序.
编辑
即使exec('notepad.exe');
不工作.php
可能需要对配置做些什么?
我在php中需要这样的东西:
If (!command_exists('makemiracle')) {
print 'no miracles';
return FALSE;
}
else {
// safely call the command knowing that it exists in the host system
shell_exec('makemiracle');
}
Run Code Online (Sandbox Code Playgroud)
有什么解决方案吗?
我试图spawn
实现一个rm -rf node_modules
跟随npm install
(在Windows 7; n x命令由透明安装的CygWin提供.所有n x命令在命令行上解析就好了).
我最初使用它exec
,但想要捕获stdout/stderr信息,因此我想我会使用spawn
,并重写代码使用它.然而,这打破了一切.
rm
重写的命令变为:
var spawn = require("child_process").spawn,
child = spawn("rm", ["-rf", "node_modules"]);
child.stdout.on('data', function (data) { console.log(data.toString()); });
child.stderr.on('data', function (data) { console.log(data.toString()); });
child.on('error', function() { console.log(arguments); });
Run Code Online (Sandbox Code Playgroud)
但是,运行它会生成以下错误:
rm: unknown option -- ,
Try `rm --help' for more information.
Run Code Online (Sandbox Code Playgroud)
npm
重写的命令变为:
var spawn = require("child_process").spawn,
child = spawn("npm", ["install"]);
child.stdout.on('data', function (data) { console.log(data.toString()); });
child.stderr.on('data', function (data) { …
Run Code Online (Sandbox Code Playgroud) 我有一个PHP脚本调用exec()来执行命令将PDF转换为JPG.这个命令在bash中工作正常.
要抢占您的初步故障排除猜测,请注意以下事项:
当我从浏览器调用此PHP脚本(访问http://www.example.com/script.php)时,exec()不会执行其参数.
重要提示:我知道我的脚本或构建bash命令的方式没有问题,因为从bash开始,我可以用'php'执行脚本并且它可以工作(例如'php script.php'转换文件)
我也尝试用system()切换exec().
最后,我曾经有过这个问题,但是不记得我是怎么修的.
我知道有一些我缺少的东西,所以我希望其他人像我一样体验过这一点,并记得如何解决它!
提前感谢您提供的任何帮助.
亚历克斯
我知道如何使用cx_freeze将CPython文件编译为exe,但是可以使用PyPy编译一个简单的程序到Exe吗?
我需要从ant执行以下命令,但我无法弄清楚如何转义双引号:
tasklist /FI "IMAGENAME eq java.exe" /FI "MEMUSAGE gt 50000"
Run Code Online (Sandbox Code Playgroud)