52

Is there a way to check in a php script if exec() is enabled or disabled on a server?

1
  • What do you mean by "enabled or disabled" ? Commented May 1, 2010 at 10:37

10 Answers 10

69

This will check if the function actually works (permissions, rights, etc):

if(@exec('echo EXEC') == 'EXEC'){
    echo 'exec works';
}
Sign up to request clarification or add additional context in comments.

3 Comments

This is actually a better answer :-)
As @Umbrella told, definitely it will throw warnings
@Umbrella @Thamaraiselvam You should use @exec, the @ will suppress warning level errors
42
if(function_exists('exec')) {
    echo "exec is enabled";
}

6 Comments

This is incorrect - it will only detect whether the function is available. Most servers will disable it via INI, which means the function will still be present but throw a warning when run and not do anything. See this answer: stackoverflow.com/questions/3938120/check-if-exec-is-disabled
@pospi That's nonsense; function_exists() also checks whether a function is disabled - proof
@Jack is that a statement you'd be comfortable making across all possible combinations of PHP versions and server APIs? (;
@pospi You mean for versions of PHP that aren't EOL? Sure.
@Jack hah, that's fair. But we don't all have the luxury of maintaining sites developed this side of 2003! I would say it's a gotcha to be aware of if you're working on pre-5.3 code but not something to worry about otherwise.
|
10

ini_get('disable_functions')

What you actually want to do is use ini_get('disable_functions') to find out if it is available to you:

<?php
function exec_enabled() {
    $disabled = explode(',', ini_get('disable_functions'));
    return !in_array('exec', $disabled);
}
?>

Answered on stackoverflow here: Check if "exec" is disabled, Which actually seems to come from the PHP Man page: http://php.net/manual/en/function.exec.php#97187

Path

If the above returns true (you can use exec()), but PHP can still not trigger the script there is a good chance that you have a path issue for that script, test this by doing:

print exec('which bash');

and then try

print exec('which ogr2ogr');

Comments

7

This will check that exec is available and enabled BEFORE trying to run it. If you run exec() and the function does not exist or is disabled a warning will be generated. Depending on the server settings that may render to the browser and will almost-always write a line to a log file = performance hit.

// Exec function exists.
// Exec is not disabled.
// Safe Mode is not on.
$exec_enabled =
   function_exists('exec') &&
   !in_array('exec', array_map('trim', explode(', ', ini_get('disable_functions')))) &&
   strtolower(ini_get('safe_mode')) != 1
;


if($exec_enabled) { exec('blah'); }

1 Comment

please note - ini_get('safe_mode') can return not only "off", but also "" (empty string)
4

It's a bit tricky to find exec function available until unless checking all possibilities

1.function_exist('exec')

2.Scanning through ini_get('disabled_functions)

3.Checking safe_mode enabled

function is_shell_exec_available() {
    if (in_array(strtolower(ini_get('safe_mode')), array('on', '1'), true) || (!function_exists('exec'))) {
        return false;
    }
    $disabled_functions = explode(',', ini_get('disable_functions'));
    $exec_enabled = !in_array('exec', $disabled_functions);
    return ($exec_enabled) ? true : false;
}

This function never throws warnings unless ini_get function not disabled.

Comments

1

I am assuming that you are running this on a linux server.

You could test the exec function by running the following php script:

exec("whoami", $ret);

echo $ret[0];

This will return the command whoami.

If it errors out, it is because the exec function could not run.

Comments

1

Example:

if(strpos(ini_get('disable_functions'),'ini_set')===false) 
    @ini_set('display_errors',0);

Comments

0

This is some ugly code I made to detect if a function is enabled or not.

function is_enabled($f)
{
    if($f=='ini_get')return@ini_get('a')===false;
    return(($l=@ini_get('disable_functions'))===null||!is_callable($f)||!function_exists($f)||!in_array($f,array_map('trim',explode(',',$l)));
}

//Usage example:
print_r(is_enabled('str_split'));//true or null if ini_get() is disabled

Comments

0

(Based on other responses) To check if exec exists and services are running:

function isRunning($serviceName)
{
    return exec('pgrep '.$serviceName);
}

if (@exec('echo EXEC') == 'EXEC') {
    $services = [
        'mysql',
        'nginx',
        'redis',
        'supervisord',
    ];

    foreach ($services as $service) {
        if (isRunning($service)) {
            echo $service.' service is running.<br>';
        } else {
            echo $service.' service is down.<br>';
        }
    }
}

// mysql service is running.
// nginx service is running.
// redis service is running.
// supervisord service is down.

Comments

0

I would use this:

if (in_array('exec', preg_split('/\s*,\s*/', ini_get('disable_functions')) {
  echo "exec is disabled";
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.