如何检查一个shell命令是否来自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'); } 

有没有解决办法?

在Linux / Mac OS上试试这个:

 function command_exist($cmd) { $return = shell_exec(sprintf("which %s", escapeshellarg($cmd))); return !empty($return); } 

然后在代码中使用它:

 if (!command_exist('makemiracle')) { print 'no miracles'; } else { shell_exec('makemiracle'); } 

更新:正如@ camilo-martin所建议的,你可以简单地使用:

 if (`which makemiracle`) { shell_exec('makemiracle'); } 

Windows使用where UNIX系统来允许本地化一个命令。 如果找不到命令,两者都会在STDOUT中返回一个空字符串。

PHP_OS目前每个受支持的Windows版本都是WINNT。

所以这里有一个便携的解决

 /** * Determines if a command exists on the current environment * * @param string $command The command to check * @return bool True if the command has been found ; otherwise, false. */ function command_exists ($command) { $whereIsCommand = (PHP_OS == 'WINNT') ? 'where' : 'which'; $process = proc_open( "$whereIsCommand $command", array( 0 => array("pipe", "r"), //STDIN 1 => array("pipe", "w"), //STDOUT 2 => array("pipe", "w"), //STDERR ), $pipes ); if ($process !== false) { $stdout = stream_get_contents($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); return $stdout != ''; } return false; } 

您可以使用is_executable来检查它是否可执行,但是您需要知道命令的路径,您可以使用which命令来获取它。

平台独立解决方案

 function cmd_exists($command) { if (\strtolower(\substr(PHP_OS, 0, 3)) === 'win') { $fp = \popen("where $command", "r"); $result = \fgets($fp, 255); $exists = ! \preg_match('#Could not find files#', $result); \pclose($fp); } else # non-Windows { $fp = \popen("which $command", "r"); $result = \fgets($fp, 255); $exists = ! empty($result); \pclose($fp); } return $exists; } 
 function checkIfCommandExists($cmd){ $prefix = strpos(strtolower(PHP_OS),'win') > -1 ? 'where' : 'which'; exec("{$prefix} {$cmd}", $output, $returnVal); $returnVal !== 0 } 

这是一个使用“where”和“which”的返回值的跨平台解决方案:)

不是,没有。

即使直接访问shell,也不知道是否存在命令。 有一些像wheris这样的wherisfind / -name yourcommand但不是100%保证你可以执行命令。