PHP: system - Manual

downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

PS shell_exec

Last updated: Sat, 27 Jan 2007

view this page in

# system

(PHP 3, PHP 4, PHP 5)

system -- Execute an external program and display the output

## Описание

string system ( string command [, int &return_var] )

system() is just like the C version of the function in that it executes the given `command` and outputs the result.

The system() call also tries to automatically flush the web server's output buffer after each line of output if PHP is running as a server module.

If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.

## Список параметров

`command`

  The command that will be executed.

`return_var`

  If the `return_var` argument is present, then the return status of the executed command will be written to this variable.

## Возвращаемые значения

Returns the last line of the command output on success, and `FALSE` on failure.

## Примеры

Пример 1. system() example

`<?php
echo '<pre>';
// Outputs all the result of shellcommand "ls", and returns
// the last output line into $last_line. Stores the return value
// of the shell command in $retval.
$last_line = system('ls', $retval);
// Printing additional info
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>`

## Примечания

Внимание
Если вы собираетесь передавать функции данные, отправленные пользователем, вы должны использовать функции escapeshellarg() или escapeshellcmd() для того, чтобы обезопасить исполнение команд.

> Замечание: Если вы собираетесь использовать эту функцию в программе, работающей в качестве демона, убедитесь, что стандартный вывод функции направлен в файл или другой поток, в противном случае PHP зависнет вплоть до конца выполнения программы.

> Замечание: В случае работы в безопасном режиме, вы можете запускать что-либо только в пределах safe_mode_exec_dir. В настоящее время, использование `..` в пути запрещено

Внимание
В случае работы в безопасном режиме, все слова, следующие за начальной командой, рассматриваются как единый аргумент. То есть `echo y | echo x` будет работать как `echo "y | echo x"`.

## Смотрите также

exec()
passthru()
popen()
escapeshellcmd()
pcntl_exec()
backtick operator

add a note User Contributed Notes
system
norman_ss at hotmail dot com
08-Mar-2007 03:43
`thanks to tr4nc3,
I'm trying to, from the explorer, run an access's macro and this example give me the solution:
You can execute a .bat file with the especifications that give us tr4nc3.
After, in this .bat file, you can execute msacces.exe and pass /x parameter with the name of the macro. like this:
"c:\windows\system32\cmd.exe /c <path or the msaccess.exe>" <path of the .mdb file> /x <name of the macro>"
At the end of the .bat file you have to put "exit" and the thread will end.
Thanks to tr4nc3!`
dotmg at wikkàwiki dot ORG
09-Aug-2006 11:43
`In system($command), $command cannot contain no more than two doublequotes. (At least with 4.3.3, on Windows). IF the path+executable name contains any space (and thus enclosed in double quotes).
<?php
/**
* This example works fine, there is only 2 double quotes
*/
system ("\"c:\\program files\\myapp\\myapp.exe\" params_for_myapp");
/**
* This one will fail, php will complain sthg like c:\\program is not an executable
*/
system ("\"c:\\program files\\myapp\\myapp.exe\" \"One param for myapp that contains space\"");
//
/**
* If you want your script to be able to run with older version of PHP (like 4.3.3), this is a trick:
* Save the command in a temporary file and call that file
*/
$tmpnam = tempname($writable_dir, "temp").".bat";
$fp = fopen ($tmpnam, "w");
fwrite($fp, $command);
fclose ($fp);
system($tmpnam, $status);
unlink($tmpnam);
?>
Note: In my preview, backslashes were gone!`
dan at thecsl dot org
29-May-2006 08:45
`You probably want to check your system calls for errors. The convention is to return 0 for "no error" which is the same as FALSE which can be confusing. You need to do something like:
<?php
$cmd = "/usr/bin/pngtopnm $png_file > $pnm_file";
system($cmd,$return_value);
($return_value == 0) or die("returned an error: $cmd");
?>`
matt-php at cdsportland dot com
17-Jan-2006 09:15
`If using Windows with IIS and you're having problems with the system() and related commands, I found the easiest way to solve it was to modify the Authentication Method for the file (or directory) that uses the call and change the anonymous access user from the default (IUSR_IMAGE) to a user with enough permissions to execute the commands in the system call. This way, there is no need to give execute permissions to IUSR_IMAGE on cmd.exe (which opens up a security risk system-wide) or copy cmd.exe into your php directory (per the suggestions of others). Hope this helps someone!`
151408626 dot unique at servux dot org
19-Dec-2005 02:56
`The documentation notes that for making a program running in the background: ... you have to make sure that the output of that program is redirected to a file or some other output stream ...
But simply redirecting the command's output to a fifo will also cause PHP to wait for the command to terminate, even if it is started in background.
After quite a bit of trial & error, however I figured out that the trick (mentioned in some other note) using parenthesis to regain control over an already redirected STDOUT does work here, too:
<?
// this will not execute the echo in background while continuing the PHP-script,
// as one might expect
system("echo 'something' >$someFIFO &");
// however that will do the trick - the echo is run in background, waiting until the data is read
// from the FIFO, while your PHP-script continues execution, e.g. being able to open that
// FIFO for read without being blocked until some data will arrive!!
system("(echo 'something' >$someFIFO) >/dev/null &");
?>`
cho at stunt growth dot com
03-Nov-2005 01:20
`Note to the persons who suggested using backticks for gathering a return value from scripts via system().
Using Backticks is generally frowned upon for security sake. They can be exploited more easily.
Instead, why not use the exec() function with a return parameter specified as an array type. This will allow you to take the full string returned from your script (for example rsync) and return each line in an array.
like so:
$result = array();
exec( $cmd, &$result);
foreach ( $result as $v )
{
// parse, or do cool stuff
}
Hope this alternative brings you merriment.`
vdweij at hotmail dot com
09-Aug-2005 02:41
`It is possible to only capture the error stream (STERR). Here it goes...
(some_command par1 par2 > /dev/null) 3>&1 1>&2 2>&3
-First STDOUT is redirected to /dev/null.
-By using parenthesis it is possible to gain control over STERR and STOUT again.
-Then switch STERR with STOUT.
The switch is using the standard variable switch method -- 3 variables (buckets) are required to swap 2 variables with each other. (you have 2 variables and you need to switch the contents - you must bring in a 3rd temporary variable to hold the contents of one value so you can properly swap them).
This link gave me this information:
http://www.cpqlinux.com/redirect.html`
Stuart Prescott
11-May-2005 10:14
`Note that for stderr redirection, you have to use double quotes (") not single quotes (') for the 2>&1 part at least.
<?
//e.g. the this will NOT do what you expect:
exec('mysqldump -h localhost ...... 2>&1', $output);
//but this will:
exec("mysqldump -h localhost ...... 2>&1", $output);
?>
*sigh*
(Sounds like a PHP bug to me..., or at least buggy docs!)`
phil at pjhayward.net
26-Apr-2005 01:37
`On Windows XP, (possibly others)
If you are getting the unable to fork error, make sure the internet guest user has permission to read and execute the \Windows\System32\cmd.exe file.`
admin at nabeelakhtar dot net
23-Apr-2005 07:13
`Windows XP (IIS) users: (Unable to fork Problem)
If you receive something like:
Warning: passthru() [function.passthru]: Unable to fork [dir] in c:\Inetpub\wwwroot\ping.php on line X
1. Copy CMD.EXE file from the Windows\System32\ folder to your PHP directory (c:\PHP\).
This should fix the problem.`
cabel at panic dot com
14-Dec-2004 04:20
`We were using system() to call a Cocoa command-line binary from PHP using Mac OS X. The Cocoa binary was simply not working -- no error message, no logging, nothing, it would just die within moments of launching from the system() function and we'd get no results.
The answer now seems obvious -- we were hitting PHP's memory limit. We did not consider that PHP's memory limit would also extend to programs launched via system().
So, if your system() call is failing mysteriously and giving no results, after trying the obvious (permissions, executable, etc.) considering upping:
memory_limit
in your php.ini from 8M to something larger.`
Shai Coleman
08-Dec-2004 04:11
`The easiest way to run a process in the background under Windows, is to use system() with the bgrun.exe utility, available from http://www.jukkis.net/bgrun/`
roga at yoopee dot de
24-Sep-2004 09:58
`In combination with Zend Optimizer and Windows 2K/XP some programs may not run with system(), exec(), etc.
I tried to use a small tool for ejecting the cd tray and it did just nothing. Disabling Zend Optimizer solved it.`
srawlinNOSPAM at magma dot ca
04-Sep-2004 01:29
`If you are running PHP in a chroot environment then the system (and passthru) function needs /bin/sh to be located in the chroot as well.`
eric_REMOVE at movementmovement_REMOVE dot com
21-May-2004 12:56
`It's important to note that if you are running a series of system() commands in a loop, you need to include the second argument in order for them to run synchonously.
ie)
// this will execute process.php asynchronously; not waiting for completion before executing the next one.
$array = array('apple', 'banana', 'pear');
foreach($array as $i)
{
system("php process.php \"fruit=$i\"");
}
// this will execute process.php 3 times, waiting for the prior command to complete before starting a new one
$array = array('apple', 'banana', 'pear');
foreach($array as $i)
{
system("php process.php \"fruit=$i\"", $status);
}`
beetung at yahoo dot com
08-Mar-2004 01:34
`Under Linux
exec() doesnt follow symbolic link when interpret by httpd...
I have my /home/www/cgi-bin --> soft linked to a samba mounted directory under /mnt/Downloads/www.site.com/cgi-bin
exec("/home/www/cgi-bin/runProg $a $b");
works ok when I execute the script using > php myscript.php but fails to show the output when run via the web browser.
When I give it the exact full path without the symbolic link
exec("/mnt/Downloads/www.site.com/cgi-bin/runProg $a $b");
everything works perfectly.`
mortoray at ecircle-ag dot com
04-Mar-2004 03:55
`Do not use "system" if you use the "php.ini" option:
zlib.output_compression = On
Doing so will result in the browser receiving garbage (I'm guessing the headers/buffers get confused).
Use passthru in this case, it appears to work as intended.`
tr4nc3 at msn dot com
22-Feb-2004 02:42
`I almost gave up trying to get Windows XP w/ Apache 2 to use either system(), or exec() to run a batch file.
If the batch file was this...
echo test > test.txt
it would work fine, creating test.txt...
but if the batch file was..
iexplore.exe "http://www.ibm.com"
I would get nothing. After hours and hours of messing around with this I figured it must be some type of permission problem. (dugh!)
Long story a little shorter.. You have to give Apache permission to "interact with the desktop".
Here's how...
Start>Run>services.msc
Right click "Apache...", select properties.
Click on the "LOG ON" tab
Check the box "Allow this service to interact with desktop"
Click OK
Restart Apache
Works great!
:D
HOPE THIS HELPS SOMEONE!
Too bad I didn't find a post like this before I figured it out myself. (I could have been working on something.)`
djem at shadrinsk dot net
17-Feb-2004 05:04
`BUGFIX for the mysystem() function, posted by n-jones.
<?php
function syscall($command){
if ($proc = popen("($command)2>&1","r")){
while (!feof($proc)) $result .= fgets($proc, 1000);
pclose($proc);
return $result;
}
}
?>
Hello from Russia! :)
djem.`
diogaogv at icqmail dot com
28-Nov-2003 04:57
`a really useful use for import(); while running the server at ur own machine is taking a screenshot of you desktop and showing it to the guest !!!
<?
echo system("/usr/X11R6/bin/import -window root -display localhost:0 /mnt/d/Desenvolvimento/Desenvolvimento\ WWW/import/cache/imagem.jpg -quality 30" ." 2>&1");
?>
<img src="cache/imagem.jpg">
remember to set chmod 777 to your directory (called "cache" on my code). also do "xhost +" or you r gonna get a xlib error saying that it could not connect to x server at localhost...
the code is still too simple. i've just done it. e.g. you can improve a real cache system avoying more than one screenshot in a minute while...
that is it! hope u enjoy it ( rofl... =DDD ) ...
diogo86`
tomlubbock at hotmail dot com
02-Nov-2003 06:07
`If you need to run root-level commands, such as to reboot a service, the utility 'sudo' will let you handle linux permissions. In our example we use 'sudo' to allow apache temporary root access to restart a service. We can then use:
system("sudo service dhcpd restart")
You also need to examine the /etc/sudoers file to specify what permissions to grant. Hope this helps someone!`
morris_hirsch at hotmail dot com
16-Sep-2003 02:49
`another reason to use shell_exec instead of system is when the result is multiple lines such as grep or ls
<?php
// this correctly sets answer string to all lines found
//$answer = shell_exec ("grep 'set of color names' *.php ");
//echo "answer = $answer";
// this passes all lines to output (they show on page)
// and sets answer string to the final line
$sys = system ("grep 'set of color names' *.php ");
echo "sys =(($sys))";
?>
here is view/source resulting from system call
setprefs.php:// The standard set of color names is:
setprefs.php:// Most browsers accept a wider set of color names
silly.php: //$answer = shell_exec ("grep 'set of color names' *.php ");
silly.php: $sys = system ("grep 'set of color names' *.php ");
sys =((silly.php: $sys = system ("grep 'set of color names' *.php ");))
and here is view source from using shell_exec instead
answer = setprefs.php:// The standard set of color names is:
setprefs.php:// Most browsers accept a wider set of color names
silly.php: $answer = shell_exec ("grep 'set of color names' *.php ");
silly.php:// $sys = system ("grep 'set of color names' *.php ");`
lc at _REMOVE__THIS_lc dot yi dot org
09-Sep-2003 05:24
`Re: cpmorris at hotmail dot com and WINNT.
I just spent some time learning to use the php system function. I managed to get long file names to work for me. It seems you need to take the same approach that batch files, WSH, and most other programming languages do under WinNT/2K/XP. Putting double quotes around the Path+Filename seems to work. So, something like this should have worked for you:
"c:\program files\apache group\apache2\bin\htpasswd"
Note that if you have parameters, they go OUTSIDE of the last quote. Oh, and don't forget to escape the slashes and quotes!
I don't know what htpasswd's params are, but let us pretend:
$cmd="\"c:\\program files\\apache group\\apache2\\bin\\htpasswd\" username password";
$str=system($cmd);
Hope this helps someone!
Leonard
http:\\www.lc.yi.org`
Jim Belton
26-Aug-2003 01:58
`To run a full screen program from a PHP CLI script, redirect input from and output to /dev/tty. For example:
system("timeconfig > /dev/tty < /dev/tty");
System will wait for the program to finish before continuing.`
chris at karakas-online dot de
01-Jul-2003 06:52
`If your PHP installation permits execution of commands through system() (e.g. you are not running in safe mode, or, if you are, safe_mode_exec_dir contains all the commands you need), you can trigger a backup of your MySQL database, just by pointing your browser to the following script:
<?php
// Enter your MySQL access data
$host= 'dbhost';
$user= 'dbuser';
$pass= 'dbpassword';
$db= 'db';
$backupdir = 'backups';
// Compute day, month, year, hour and min.
$today = getdate();
$day = $today[mday];
if ($day < 10) {
$day = "0$day";
}
$month = $today[mon];
if ($month < 10) {
$month = "0$month";
}
$year = $today[year];
$hour = $today[hours];
$min = $today[minutes];
$sec = "00";
// Execute mysqldump command.
// It will produce a file named $db-$year$month$day-$hour$min.gz
// under $DOCUMENT_ROOT/$backupdir
system(sprintf(
'mysqldump --opt -h %s -u %s -p%s %s | gzip > %s/%s/%s-%s%s%s-%s%s.gz',
$host,
$user,
$pass,
$db,
getenv('DOCUMENT_ROOT'),
$backupdir,
$db,
$year,
$month,
$day,
$hour,
$min
));
echo '+DONE';
?>
If you are not allowed cron access on the web server, you can set up your own cron job to periodically call the above script. If you don't have cron, or a similar functionality on your system, you can still modify the above script to inform the browser to reget the file every xxx hours. A poor man's cron, so to say ;-)
Of course, the $backupdir should at least be protected with a .htaccess file.
And of course, you are not going to backup a really large database this way, if your PHP has some timeout set (as is usually the case with web hosters).`
d dot kraft at szo dot de
10-Mar-2003 02:18
`For PHP running inside a Webserver:
When calling a process via
system("your_process &");
to make it running in background, note that this process is killed when the webserver is restarted.`
cnoelker at softpearls dot de
05-Mar-2003 06:13
`Hi,
some tips for using a system()-call for batch files on a windows computer:
* Write the path to the executable with double back-slashes, like so:
C:\\path\\to\\prog.exe
* If you are refering to other pathes, e.g. as a parameter, one back-slash works fine.
* Do not use SET for declaring parameters - this does not work! Example:
SET PATH="C:\path\to\lib"
echo path is %PATH%
This works fine when started from the comand line, but when called from PHP, the variable is just empty.`
user at unknown dot com
15-Jan-2003 02:07
`a simple way to include a beep on the server-side whenever a page in viewed.
**contents of 'beeping' page**
require ("beep.php")
**contents of beep.php**
<?php
system ("/home/site/exe/beep.executable");
// on windows system ("c:\beep.exe");
?>`
n-jones at fredesign dot net
04-Aug-2002 03:08
`To have system output from both the STDERR and STDOUT, I've modified the function posted above by lowery@craiglowery.com
function mysystem($command) {
if (!($p=popen("($command)2>&1","r"))) {
return 126;
}
while (!feof($p)) {
$line=fgets($p,1000);
$out .= $line;
}
pclose($p);
return $out;
}
Now you can use mysystem() like;
$var = "cat ".$file;
echo mysystem($var);
$catfile = mysystem($var);
if (ereg("text", $catfile)) {
//stuff here;
}
N.Jones`
a dot paul at bernardlabs dot com
21-Jul-2002 04:42
`Well system is a pretty interesting and useful function.
This might have been already pointed out by predessors but anyways, for anyone looking to execute command line queries from php or scripts in general, this function does the trick.
However while using the command, you have to always think in terms of the command you are using as the function and the parameters as the arguments.
So say I want to do a 'ls -ls' on /home/sites/sitexyz/www/$username
I could do a
system("ls -la \"/home/sites/sitexyz/www/$username\" ");
Its important to think of this as passing /home/sites/sitexyz/www/$username as an argument to the function ls -la .
Similarly, you could do a
system("cp -r \"/home/sites/sitexyz/www/$username\" \"/home/sites/sitexyz/www/$username2\" ");
But you then need to use 'chmod -R 777 to the directory you want to copy it to, which can be done by a
system("chmod -R 777 \"/home/sites/sitexyz/www/$username2\" ");
Now you can execute all the terminal commans via the php, however do realise the security concerns of using the same, especially when the operation is going to preceeded by some user input, so, you need to make sure you filter the inputs, or better not allow user intervention.`
17-Jun-2002 08:29
`The system() function does not consistently write to the int return_var. I highly recommend using the code from the post above it worked well for me.
---------------------------------------------
$a = `/bin/ls -a`;
note: the ` is a backtick, not a single quote
---------------------------------------------
This also works well in Perl so it is rather useful to know.`
ed at lexingrad dot net
12-Jun-2002 06:11
`best use I have found for this function so far:
<?php
$fortune = `/usr/games/fortune -aeo`;
$var = eregi_replace("\n", "<br>", $fortune);
echo $var;
?>
that's with all the fortune's installed, including the dirty ones. the reg expression replace formats them correctly`
roger at proproject dot com
12-May-2002 10:35
`For your in-house pages, I recommend redirecting stderr to stdout so you'll know if something goes wrong. Here's a real-life example:
system("/mysql_reboot 2>&1");`
james at jsrobertson dot net
26-Mar-2002 11:48
`I've found a very useful technique for the system function. Say if you want to create a page of quotes and you have /usr/games/fortune available. Instead of spending time creating a database and populating it with thousands of quotes, you can just use:
<?php
system('/usr/games/fortune');
?>
likewise if you want to list the files in your directory, say for example, Mp3's?
<?php
system('ls /home/mp3 -l');
?>
basically
<?php
system('any_command');
?>`
z1a7n8g at / at a<o<l dot c<o<m
20-Mar-2002 08:22
`I am currently using a form driven administration
page to start an ftp server remotely from a web page in FreeBSD 4.5 using PHP 4.1.2 & apache 1.3.23. (Sorry guys, no CVS!!)
This code will emulate a CLI command from your browser (anywhere!!) and execute it if your PHP module/binary has the correct permissions...
<code><pre>
//your front end
<form ..your form stuff here...>
<input type="text" name=command>
<your additional form stuff>
///the gutz
<?
$arg=explode( " ", $command, 4 )
if ($arg[0] = "system")
{
system($arg[1] . " " . $arg[2] . " " . $arg[3]..etc);
}?>
</code></pre>
This works, however it is simple and lacks any error output.
try:
<pre><code>
<?system(command > /path/to/yourfile.php);
$fPtr=@fopen("yourfile.php",r);
$line=fgets($fPtr,filesize("yourfile.php");
while ($line)
{
$formatted_line=ereg_replace("your favorite newline semantic","<BR>",$line);
print $formatted_line;
}
?>
</pre></code>
Keep in mind the SECURITY implications with the use of this and like scripts. You've been warned.`
tk at taponet dot de
20-Feb-2002 07:17
`Beware:
if (! system($cmd)) {
print "error";
}
does not work!
Use
if (system($cmd) === false) {
...}
instead!`
nospam at 1111-internet dot com
06-Feb-2002 10:47
`Here's a neat trick that exploits an inherent php anomaly... if you want to run a shell command but not have it take up two processes for the entire life of the command (a child for the shell and a grandchild for the command), add a "&" at the end of the command to kill the shell and leave the grandchild command running... Though it's a bit counterintuitive, php will continue to listen for the orphanized grandchild command's STDOUT as long as it continues to run, provided STDOUT hasn't been been redirected with a ">/some/file"...
Very helpful if you're in a low-process-quota situation - I might even go so far as to say that this benefit might warrant ALWAYS using a "&" in php Unix system command situations - though the jury's still out on that one...`
ryan at seattleone dot com
29-Aug-2001 05:36
`I was trying to use the system command, and I couldnt get it to work, then it occured to me, send the stderr to a file to see what is really happening.
system( $command . " &> /tmp/error " );`
nospam at php dot net
24-Jul-2000 05:57
`If you are trying to parse a CGI script to your webserver which needs arguments, take a look to the virtual() function .. it took me long before i found out it existed...
It's used like this:
<?php
virtual("/cgi-bin/lastuser.cgi?argument");
?>
And that works excellent now for me`
digitalturbulence at softhome dot net
09-Jul-2000 12:04
`If the command printf("%s",system($cmd)); doesn't work, check the httpd.error_log file in your /var/log directory. At my home, the system command can just load binary files in the directory /usr/lib/apache/bin
Stephan.`
ccurtis at aet-usa dot com
14-Jun-1999 11:07
`If no headers have been printed, calling the system() function will flush the headers to the client and insert a newline; no further headers or cookies will be transferred to the browser. In version 3.0.7, you will not be warned that the Header() function failed, but will be warned if trying to set a cookie. If you want to continue to send headers after the function call, use exec() instead.`
add a note
PS shell_exec

Last updated: Sat, 27 Jan 2007
show source | credits | stats | sitemap | contact | advertising | mirror sites
Copyright © 2001-2007 The PHP Group
All rights reserved.
This mirror generously provided by: Yahoo! Inc.
Last updated: Sat Mar 10 09:32:46 2007 PST