Run Program from Bash CGI-Script

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted!

  1. The problem statement, all variables and given/known data:
    This is a problem I am having with my 2 semester senior project. I have a LAMP server running Ubuntu 9.10 with gnome that I need to run a program on from a button on its website. I'm using 'xterm -e vlc'. A member cero pointed out that I needed to include the display name which is ':0.0', I got when I ran 'echo $DISPLAY' in the terminal. I can run 'xterm -e vlc' in a terminal and 'xterm -display :0.0 -e vlc' in a terminal. However, it doesn't work in a bash cgi script.

I also tried adding localhost before ':0.0' to see if that works, but it didn't.

In short words, I need a program to run on the server from a button on the website. Nothing from the cgi-scrip needs to be displayed on the website.

The website is: Crimson Security - Home if you want to check it out.

  1. Relevant commands, code, scripts, algorithms:
    xterm -display :0.0 -e vlc
    xterm -e vlc
    xterm -display localhost:0.0 -e vlc

  2. The attempts at a solution (include all code and scripts):

#!/bin/bash
echo "Content-type: text/html"
echo ""

xterm -e vlc

echo "<html><head><title>Crimson Security - Redirect"
echo "</title></head><body>"

echo "<h1>You have started VLC Media Player</h1>"
echo "Today is $(date)"
echo "<br><br>"
echo "<A HREF='javascript:history.go(-1)'>Go Back</a>"

echo "</body></html>"

Also tried:

#!/bin/bash
echo "Content-type: text/html"
echo ""

#main line of code that I need to work
xterm -display localhost:0.0 -e vlc
#####################

echo "<html><head><title>Crimson Security - Redirect"
echo "</title></head><body>"
echo "<h1>You have started VLC Media Player</h1>"
echo "Today is $(date)"
echo "<br><br>"
echo "<A HREF='javascript:history.go(-1)'>Go Back</a>"

echo "</body></html>"
  1. Complete Name of School (University), City (State), Country, Name of Professor, and Course Number (Link to Course):
    The University of Alabama; Tuscloosa, AL; Dr. Kenneth Ricks; ECE 494 Capstone Design -- The University of Alabama

Note: Without school/professor/course information, you will be banned if you post here! You must complete the entire template (not just parts of it).

Edit: If I forgot something, please let me know.
Original post is located here: http://www.unix.com/shell-programming-scripting/152783-run-program-bash-cgi-script.html

You can't dump an executable in your webspace and expect the server to run it, most are only configured to run executables they find in special /cgi-bin/ directories. If you put your script under /var/www/localhost/cgi-bin/scriptname and open http://my.web.page/scriptname, it might go.

Well, the xterm holds up the script from timely termination. Put it in a "nohup ... & 2>/dev/null". Remember it will want to extend a log nohup.out in $PWD. It might work better to export the DISPLAY, as I find -d sometimes does not. If vlc is X, why does it need an xterm?

Coronal688: All my scripts are in the /cgi-bin/ directory where apache2 looks.

DGPickett: vlc is just a the program I am testing to see if I can successfully run a program from cgi-script. It isn't what I need to run. I tried "nohup xterm -display :0.0 -e vlc & 2>/dev/null" but nothing different happened.

It is as if 'xterm -display :0.0 -e vlc' is just skipped. The actual script I am executing is here: Crson Security - Redirect

Hmm -- maybe it is. Might not be in the PATH apache gives you. Try calling it with an absolute path. You could also 'source /etc/profile' in case there's other mysterious variables libx11 needs.

For that matter: Apache might just plain be being denied permission to connect to the local X server. Usually these days it only allows someone who's logged into X11 to pop up windows on it.

I changed the path to /usr/bin/vlc, didn't work. Also, 'source /etc/profile' does nothing. I tried in the terminal '/usr/bin/vlc /etc/profile' since I'm unsure of the use of 'source /etc/profile' and vlc just ran.

The use when the script is ran is 'www-data'. Could this be an error due to it being ran as that user?

Your local X server probably doesn't let any user but the one who logged into X pop up windows. xhost + as that user might help,but I'm not sure.

In any case, if this X window really isn't really a part of the project, maybe there's a better way to signal you that it succeeded? Could you make the server's PC speaker beep or something? (install the beep utility, setuid it, then just /usr/bin/beep)

Beep is not working for me. I tried 'beep -f 15000 -l 2000 --verbose', no sound is made from terminal or from my cgi-script. Added localhost to xterm but it would not add www-data which is the user the script runs under.

I think I need to change what I am doing. The program I need to control is called Motion which is started and stopped by a bash script my group member made: site for reference WebHome < Motion < Foswiki. This script needs sudo permission to control it, run and kill, as my group member has set it up. I need to start and stop this script in 2 separate cgi-scripts. One to start, and one to stop it. I hope this is not confusing.

The script I need to run opens a new xterm window.

Please let me know if I'm not being clear in my description.

Is this just groping, or are you looking at the logs to see what is complaining? If your cgi runs at all, it can run anything, but whatever you run needs the environment setup it usually enjoys. If it needs a controlling terminal, that is just a bit harder. Why put in explicit path when ~/.profile, ~/.bashrc or the like should have all your usual PATH and such?