nixCraft Poll

Topics

Executing Linux / UNIX commands from web page

Posted by Vivek Gite [Last updated: November 15, 2007]

A Web interfaces is almost used by routers and many other sophisticated programs such as webmin. However, why go for a web interface or execute commands from web page? For automation purpose, you need to use a web interfaces. Another advantage is you can access your web-based interface from any computer, running any operating system, anytime in the world :D

In this first part, you will see how to use simple bash (shell) script from web page. In order to execute commands or shell script from a webpage you need:

  1. CGI support with Apache / lighttpd web server.
  2. I'm assuming that you have a properly configured web server.

You need to store program in cgi-bin directory. If you are using Debian Linux default location for cgi-bin directory is /usr/lib/cgi-bin. Under Red Hat / Fedora it is /var/www/cgi-bin. Use text editor such as vi to create a first.cgi program:

$ cd /usr/lib/cgi-bin
$ vi first.cgi

first.cgi code listing:

#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Bash as CGI"
echo "</title></head><body>"

echo "<h1>Hello world</h1>"
echo "Today is $(date)"

echo "</body></html>"

Save and close the file. Setup execute permission on the script:

$ chmod +x first.cgi

Fire up your web browser and test the script, for example type url http://localhost/cgi-bin/first.cgi or http://your-ip/cgi-bin/first.cgi

You need to send headers, first three lines are almost same for all your script:

Rest is html code. Take a close look at following echo command:

echo "Today is $(date)"

It use shell feature called command substitution. It allows the output of a command to replace the command name:

$(command)

Your bash shell performs the expansion by executing command and replacing the command substitution. So date command get executed by replacing the its output.

Real life example

Here is simple script that collects system information. Create script in cgi-bin directory:

#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Bash as CGI"
echo "</title></head><body>"

echo "<h1>General system information for host $(hostname -s)</h1>"
echo ""

echo "<h1>Memory Info</h1>"
echo "<pre> $(free -m) </pre>"

echo "<h1>Disk Info:</h1>"
echo "<pre> $(df -h) </pre>"

echo "<h1>Logged in user</h1>"
echo "<pre> $(w) </pre>"

echo "<center>Information generated on $(date)</center>"
echo "</body></html>"

Save and close the file. Setup execute permission on script:

$ chmod +x script.cgi

Fire up web browser and test it (http://localhost/cgi-bin/script.cgi):

Next time you will see:

Want to stay up to date with the latest Linux tips, news and announcements? Subscribe to our free e-mail newsletter or RSS feed to get all updates. You can Email this page to a friend.

You may also be interested in other helpful articles:

Discussion on This Article:

  1. Randal L. Schwartz Says:

    You need to HTML-escape (add ampersands) your command output, or you might be accidentally providing a means for cross-site-scripting attacks.

  2. nixcraft Says:

    Randal, thanks, I will cover this later in security issues :) I appreciate your post.

  3. 007ben Says:

    I am struggling with creating a empty file a bash based cgi script. the filename should coome from information passed to the cgi from a forum.
    help?

  4. nixcraft Says:

    007ben, I hope you have write permission to create a empty file.

    If you just want to retrieve value pass to url for example http://mydom.com/cgi-bin/script.cgi?filename

    Then use $1 in script to get filename i.e.
    touch $1

  5. nixcraft Says:

    So if you are using url
    http://mydom.com/cgi-bin/script.cgi?file=/tmp/abc.txt
    then following shell code should find out value of file:

    LINE=`echo $QUERY_STRING | sed ’s/&/ /g’`
    for i in $LINE
    do
    f1=$(echo $i | cut -d= -f1)
    v1=$(echo $i | cut -d= -f2)
    done
    echo “Var is f1 and value is $v1″

  6. 007ben Says:

    that last bit was the trick!

    the forum was not passing the info with variable name.
    and when it did before the script could not pick it up.

    THANK YOU!

  7. Anonymous Says:

    hello sir.,
    I am doing my project in linux.I want to know how to execute useradd and iptables commands in linux from PHP.How can i use the form data as arguments to the program.Please give the solution.
    S.Sujaikumar

  8. nixcraft Says:

    Use system(), exec() commands. For example to execute ls -l command you can write code:


    $out = system(”ls -l”);
    echo $out;

    Suppose you are using url http://localhost/page.php?user=raj

    Then you can use following code to get value of user:
    $u = $_GET['user'];
    $cmd = “adduser “. $u;
    $out = system($cmd);

  9. Anonymous Says:

    I m doing my project in my university network, which means that I m not the root. Hence I dont have any writtin permissions in cgi-bin directory. Is ther any other way out? I wud be greatfull if you can lemme knw the solution.
    thanks a lot
    vasanth

  10. Jadu Says:

    nixcraft is always best :-) Thanks, I am used to BASH, and your helps are always good for me. Is there any doc which tells more about cgi and bash together? like accepting user inputs, database access and all, will be a great help for me.

    Thanks,
    Jadu, India

  11. vivek Says:

    Jadu,

    Although bash is handy, it is recommended that you use python or perl for cgi and sys admin related task.

    HTH

  12. olivier jolly Says:

    Hi,
    I know this topic is a bit old, but I think it could be useful to alter the comment of nixcraft to be like this :

    #!/bin/bash

    echo "Content-type: text/plain"
    echo

    LINE=`echo $QUERY_STRING | sed 's/&/ /g'`
    for i in $LINE
    do
    f1=$(echo $i | cut -d= -f1)
    v1=$(echo $i | cut -d= -f2)
    typeset -r $f1=$v1
    done

    echo "hard coded content of t = '$t'"

    Like this, you are generating shell variables that you can use when you know in advance their name (as shown in the last line). It still lacks post support and decoding of escaped character but for simple script it can useful.
    hth

  13. Ravi Says:

    Hello,

    i want to run a “tail -f ” command using cgi to view unix log files progress in real time from browser.

    any ideas? or cgi script can do it?

  14. Thor Henrik Says:

    Hi

    I have writen a bash script for work that accesses sevral servers and collect key information about them and creates a web page with the info.

    I would like to be able to run the shell script from the web page.
    Just to be able to do ./script.sh $1
    Is this possible

  15. kwissem Says:

    I want to open konsole and exute telnet 10.10.10.1 and the konsole be opened from web page

  16. Princess Says:

    Hi

    I have a bash script here that will create email accounts for each person that will request for 1.

    I want this script to be web based is this possible?

    Anyone can help me…

    Thanks

Leave a Reply

We encourage your comments, and suggestions. But please stay on topic, be polite, and avoid spam. Thank you very much for stopping by our site!

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word

Tags: , , , , , , , , ,

Copyright © 2004-2008 nixCraft. All rights reserved - TOS/Disclaimer - Privacy policy - Sitemap - Powered by Open source software.