Executing Linux / UNIX commands from web page

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 😀

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:

  • #!/bin/bash : First line tell Linux/UNIX how file first.cgi should be run. So it will use /bin/bash interpreter to execute your rest of program.
  • echo “Content-type: text/html” : Send html headers, you must include this line.
  • echo “” : Send a blank line, you must include this line.

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:

  • How to use and place form elements (from POSTs and GETs)
  • Cookies in your environment
  • Use of perl scripting
  • And finally use of special tools
🐧 If you liked this page, please support my work on Patreon or with a donation.
🐧 Get the latest tutorials on SysAdmin, Linux/Unix, Open Source & DevOps topics via:
CategoryList of Unix and Linux commands
File Managementcat
FirewallAlpine Awall CentOS 8 OpenSUSE RHEL 8 Ubuntu 16.04 Ubuntu 18.04 Ubuntu 20.04
Network Utilitiesdig host ip nmap
OpenVPNCentOS 7 CentOS 8 Debian 10 Debian 8/9 Ubuntu 18.04 Ubuntu 20.04
Package Managerapk apt
Processes Managementbg chroot cron disown fg jobs killall kill pidof pstree pwdx time
Searchinggrep whereis which
User Informationgroups id lastcomm last lid/libuser-lid logname members users whoami who w
WireGuard VPNAlpine CentOS 8 Debian 10 Firewall Ubuntu 20.04
43 comments… add one
  • sunil Jul 11, 2016 @ 7:09

    I want to show up and their RAM ,CPU,HARDDISK on browser using Python program.please tell.

  • boiboi Jul 17, 2013 @ 18:47

    hi,

    my browser keeps telling me “error 404: file not found” from http://my-ip/cgi-bin/first.cgi

    i am using lighttpd in a debain(actually i am using a RaspberryPI)

    and i have configured my lighttpd.conf by adding this:

    fastcgi.server = ( “.php” => ((
    “bin-path” => “/usr/bin/php-cgi”,
    “socket” => “/tmp/php.socket”
    )))

    please help

    • ernest Aug 14, 2015 @ 9:00

      ensure that when you navigate to /usr/lib/cgi-bin you execute touch first.cgi (spelling is the issue and ensure you use root )

  • leejackee May 11, 2013 @ 13:47

    Thank you !!! very much my friend it’s a wonderful article.

  • vibin Mar 8, 2013 @ 14:32

    My linux command is having a UI output.can i get that into html..

  • Nishant Sep 29, 2012 @ 11:16

    Dear sir

    i want to run “adduser” from web page how to make “useradd” or “change password” program i am newbie to linux.I need you help.

  • prabhat Sep 29, 2012 @ 11:00

    Dear everyone
    plz help
    I have configured postfix with (mysql+ vmail+dovecot ) server.I have two server on different location.server A and B.
    primary(A) or secondary(B). I have some user on secondary(B) and some on primary(A).

    “admin@kvit.in” on primary server(A) But not Secondary server(B).When I send mail from server B. I get some errore USER UKNOWN.
    ======
    I have done in Sendmail through Luser relay.But i am unable to do in postfix

  • Aravind Dec 31, 2011 @ 12:26

    Whats a CGI ? i am new to this.. Please reply

  • savy Dec 16, 2011 @ 4:28

    I Need to download Executing Linux / UNIX commands from web page

  • Venky$ Nov 18, 2011 @ 7:24

    hi..
    wat r the websites to run unix commands

  • Sai Nov 11, 2011 @ 13:25

    I am trying to execute perl script which accepts a parameter,through Perl CGI as
    system(“./remConnect.pl $var”);
    print “$? &nbsp”;

    $? returns 512. Can you please give a solution to make it run?

    Thanks

  • goodslave Oct 16, 2011 @ 14:05

    I am writing an html page to to display the output of a shell script .
    but i need to pass usename & password from html page to shell script

    please help me to resolve this problem

  • daniel Sep 28, 2011 @ 8:18

    Hi this site is just great.. Thumbs up nixcraft

  • Chris Aug 31, 2011 @ 19:47

    Is there a way to execute a Linux command in index.html? Say for instance $HOSTNAME?

  • akshaya Mar 6, 2011 @ 3:31

    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.

    child

  • Kirby Jun 24, 2010 @ 6:10

    Hi nixcraft, thanks for the Post.

    I’m very interested in the next topic in line after this. I notice this is really old, and sorry to dig up such an old topic.

    But, I’ve looked all over and can not find the next topic: How to use and place form elements (from POSTs and GETs)

    Can you please let me know if you ever wrote that one? Thanks!!
    I’d really like to read about that… more in dept how to control unix commands from a web page/url.

  • Ben May 22, 2010 @ 11:45

    Hi,
    I was happy to find your information. I was able to add a line to start a linux program, with the right attributes. For developing a script within a webpage with buttons I moved to a Ubuntu PC because I was developing on an embedded linux board.

    Since I moved to the Ubuntu system your example still works but the line I placed in your example script does not.

    Can you help me out what could be my problem ? If you want to take a look, please send me a message and I will send you my problem.

    The command works from the command line in Ubuntu but not from the script…

    TnX,
    Ben

  • Guntur Jan 5, 2010 @ 11:55

    hi, my server is using CentOS.. where to put the cgi?

    I don’t understand anything bout cgi..
    but I want to execute a bash command from web page..
    like mkdir or unzip etc..

    please help me 🙂

    thx

  • berot3 Dec 14, 2009 @ 16:35

    yepp works on mac, just the path of the cgi is different: /Library/Webserver/CGI-Executables/
    but thats not what i was looking for 🙂
    maybe u can help me / maybe have heard of someting like this:
    i want to execute commands as if i would be a ssh-console but for http, u know what i mean?

    • 🐧 nixCraft Dec 14, 2009 @ 16:52

      This is going little offtopic. I suggest you post it to our forum along with shell code if you have any and will continue discussion at our forum http://nixcraft.com/

  • berot3 Dec 12, 2009 @ 19:59

    does it work on mac os x?

    • 🐧 nixCraft Dec 13, 2009 @ 8:03

      Yes, it should work under Mac OS X too

  • apctr Nov 30, 2009 @ 8:26

    i want to execute vncviewer in web page.what should I have to do????????

Leave a Reply

Your email address will not be published. Required fields are marked *

Use HTML <pre>...</pre>, <code>...</code> and <kbd>...</kbd> for code samples.