38

I want to launch a bash script when a button is pressed on a website. This is my first attempt:

<button type="button" onclick="/path/to/name.sh">Click Me!</button>

But no luck. Any suggestions?

3
  • 4
    are you trying to run the script on the user's machine or on the server?
    – Mat
    Commented Jun 4, 2011 at 9:05
  • 1
    on the server. I'm running Debian
    – dukevin
    Commented Jun 4, 2011 at 9:17
  • 1
    @Mat What about the case of running the script on the user's machine?
    – iwantmyphd
    Commented Feb 14, 2015 at 6:05

4 Answers 4

35

As stated by Luke you need to use a server side language, like php. This is a really simple php example:

<?php
if ($_GET['run']) {
  # This code will run if ?run=true is set.
  exec("/path/to/name.sh");
}
?>

<!-- This link will add ?run=true to your URL, myfilename.php?run=true -->
<a href="?run=true">Click Me!</a>

Save this as myfilename.php and place it on a machine with a web server with php installed. The same thing can be accomplished with asp, java, ruby, python, ...

3
  • 4
    This answer works on my Ubuntu desktop with apache2 and php5 installed. Following is some additional information to help better understand this answer: 1. "myfilename.php" may be placed under the web server's root directory (DocumentRoot) which usually is "/var/www". 2. "myfilename.php" contains the above code, plus other HTML code. 3. The web client uses "<server name>/myfilename.php" as the HTTP address.
    – jonathanzh
    Commented Jun 18, 2015 at 1:12
  • we don't php installed can it possible any other way like javascript. or without php install run this script.
    – xyz_scala
    Commented Aug 13, 2020 at 7:01
  • Shell can also be a server-sided language. Why not just case "${REQUEST_METHOD:-}/${QUERY_STRING:-}" in (GET/run=true) /path/to/name.sh;; esac? Then let web server software call this, I guess.
    – user15283025
    Commented Nov 3, 2021 at 1:12
13

This is really just an expansion of BBB's answer which lead to to get my experiment working.

This script will simply create a file /tmp/testfile when you click on the button that says "Open Script".

This requires 3 files.

  1. The actual HTML Website with a button.
  2. A php script which executes the script
  3. A Script

The File Tree:

root@test:/var/www/html# tree testscript/
testscript/
├── index.html
├── testexec.php
└── test.sh

1. The main WebPage:

root@test:/var/www/html# cat testscript/index.html
<form action="/testscript/testexec.php">
    <input type="submit" value="Open Script">
</form>

2. The PHP Page that runs the script and redirects back to the main page:

root@test:/var/www/html# cat testscript/testexec.php
<?php
shell_exec("/var/www/html/testscript/test.sh");
header('Location: http://192.168.1.222/testscript/index.html?success=true');
?>

3. The Script :

root@test:/var/www/html# cat testscript/test.sh

#!/bin/bash

touch /tmp/testfile
3
  • if its possible to run the exe from sh file ? my environment is windows os. i want to execute the exe from browser i searched past three days nothing help me
    – Karthi
    Commented Feb 22, 2017 at 5:38
  • 1
    Could you please expand on the need for ?success=true' after the .html part on step 2? Maybe it can be removed? Commented Nov 22, 2019 at 13:58
  • @SOpalajodeArrierez I think your correct, its just there as example Commented Mar 25, 2022 at 21:30
7

PHP is likely the easiest.

Just make a file script.php that contains <?php shell_exec("yourscript.sh"); ?> and send anybody who clicks the button to that destination. You can return the user to the original page with header:

<?php
shell_exec("yourscript.sh");
header('Location: http://www.website.com/page?success=true');
?>

Reference: http://php.net/manual/en/function.shell-exec.php

6

This is how it look like in pure bash

cat /usr/lib/cgi-bin/index.cgi

#!/bin/bash
echo Content-type: text/html
echo ""
## make POST and GET stings
## as bash variables available
if [ ! -z $CONTENT_LENGTH ] && [ "$CONTENT_LENGTH" -gt 0 ] && [ $CONTENT_TYPE != "multipart/form-data" ]; then
read -n $CONTENT_LENGTH POST_STRING <&0
eval `echo "${POST_STRING//;}"|tr '&' ';'`
fi
eval `echo "${QUERY_STRING//;}"|tr '&' ';'`

echo  "<!DOCTYPE html>"
echo  "<html>"
echo  "<head>"
echo  "</head>"

if [[ "$vote" = "a" ]];then
echo "you pressed A"
  sudo /usr/local/bin/run_a.sh
elif [[ "$vote" = "b" ]];then
echo "you pressed B"
  sudo /usr/local/bin/run_b.sh
fi

echo  "<body>"
echo  "<div id=\"content-container\">"
echo  "<div id=\"content-container-center\">"
echo  "<form id=\"choice\" name='form' method=\"POST\" action=\"/\">"
echo  "<button id=\"a\" type=\"submit\" name=\"vote\" class=\"a\" value=\"a\">A</button>"
echo  "<button id=\"b\" type=\"submit\" name=\"vote\" class=\"b\" value=\"b\">B</button>"
echo  "</form>"
echo  "<div id=\"tip\">"
echo  "</div>"
echo  "</div>"
echo  "</div>"
echo  "</div>"
echo  "</body>"
echo  "</html>"

Build with https://github.com/tinoschroeter/bash_on_steroids

2
  • 1
    Exactly what I was looking for! Thanks a lot! Commented Nov 3, 2021 at 4:28
  • Funny how this solution matches exactly the question, while the highest vote is not. Compliments to you Tino.
    – Leo
    Commented May 7, 2022 at 23:12

Not the answer you're looking for? Browse other questions tagged or ask your own question.