Invoke a linux command from with in a java servlet

Hi Everyone,
I am kind of new to Linux and Tomcat server technology. I have been trying to run a servlet that would run a linux command using the "Runtime.getRuntime().exec( cmd );" in java. I tried running the command in an independent Java Program and it runs fine. I am trying to do the same thing in a servlet so that I could invoke and execute the linux command when I invoke a servlet URL. But it does not seem to work. I mean the servlet program compiles well and prints all the html text but the command does not get executed. It does not give any error messages either. The program is as follws:
public class Example1 extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
PrintWriter output;
     response.setContentType ("text/html");
     output = response.getWriter();
     StringBuffer buf = new StringBuffer();
     buf.append ("<html>");
     buf.append ("<head>");
     buf.append ("<title>\n");
     buf.append ("A Simple Servlet Example \n");
     buf.append ("</title>");
     buf.append ("</head>");
     buf.append ("<body>\n");
     buf.append ("Welcome to Servlets in SSL Command \n");
     buf.append ("</body>");
     buf.append ("</html>");
     System.out.println("Hello Linux");
     String cmd = "";
     cmd = "cp file1.txt file2.txt";
     System.out.println(cmd);
     try
          Runtime.getRuntime().exec( cmd );
     catch( java.io.IOException e )
          System.out.println("\n " + e.toString());
     output.println(buf.toString());
     output.close();
do you have any suggestions reagarding this. Thx in Advance.
Regards
nsk

Read this before you do anything with Runtime.exec:
http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html
I agree with Annie: it's a bad idea to put code like this in a servlet. Move it into a JavaBean that you can test off-line and then let your serlvet simply instantiate it and call its methods.
This will tie your app into Linux, of course. Sure you absolutely have to do this? Write an interface and a factory method to hide this implementation detail. It'll give you a chance to chance implementations if you ever have to deploy on Windoze or something else.
Merry Christmas, Annie. Don't spend the day at the forum, as helpful as you are.

Similar Messages

  • How to execute Linux command from Java app.

    Hi all,
    Could anyone show me how to execute Linux command from Java app. For example, I have the need to execute the "ls" command from my Java app (which is running on the Linux machine), how should I write the codes?
    Thanks a lot,

    You can use "built-in" shell commands, you just need to invoke the shell and tell it to run the command. See the -c switch in the man page for your shell. But, "ls" isn't built-in anyays.
    If you use exec, you will want to set the directory with the dir argument to exec, or add it to the command or cmdarray. See the API for the variants of java.lang.Runtime.exec(). (If you're invoking it repeatedly, you can most likely modify a cmdarray more efficiently than having exec() decompose your command).
    You will also definitely want to save the returned Process and read the output from it (possibly stderr too and get an exit status). See API for java.lang.Process. Here's an example
    java.io.BufferedReader br =
    new java.io.BufferedReader(new java.io.InputStreamReader(
    Runtime.getRuntime().exec ("/sbin/ifconfig ppp0").
    getInputStream()));
    while ((s = br.readLine()) != null) {...                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

  • Execute linux command from java

    I wanna execute linux command from java, bu the output has error:
    Return code = 1
    top: failed tty get
    The code as:
    import java.io.*;
    public class Execute {
         public static void main(String[] args) {
              try {
                   final Process process = Runtime.getRuntime().exec("top");
                   new Thread() {
                        public void run() {
                             try {
                                  InputStream is = process.getInputStream();
                                  byte[] buffer = new byte[1024];
                                  for (int count = 0; (count = is.read(buffer)) >= 0;) {
                                       System.out.write(buffer, 0, count);
                             } catch (Exception e) {
                                  e.printStackTrace();
                   }.start();
                   new Thread() {
                        public void run() {
                             try {
                                  InputStream is = process.getErrorStream();
                                  byte[] buffer = new byte[1024];
                                  for (int count = 0; (count = is.read(buffer)) >= 0;) {
                                       System.err.write(buffer, 0, count);
                             } catch (Exception e) {
                                  e.printStackTrace();
                   }.start();
                   int returnCode = process.waitFor();
                   System.out.println("Return code = " + returnCode);
              } catch (Exception e) {
                   e.printStackTrace();
    }Help please.

    Your code is probably good to run a program, that does not use terminal capabilities.
    Program "top" is a little bit more complicated - you have to run it with a real terminal.
    Try to run "xterm -e top". You can find an example how to run an external program
    from java code in cnd/gdb module on http://cnd.netbeans.org
    For example, take a look at openExternalProgramIOWindow() method on this page:
    http://cnd.netbeans.org/source/browse/cnd/gdb/src/org/netbeans/modules/cnd/debugger/gdb/proxy/Attic/GdbProxyCL.java?rev=1.1.2.6.2.5&only_with_tag=release551_fixes&view=markup
    It runs a command with external terminal.
    Thanks,
    Nik

  • Sending down Linux commands from database

    Hello
    Im working with Oracle 10.2.0.4.3 on Linux SuSE FUSE Version 2.3.0-RC0-SL0/SLES-9.
    Im currently doing an extract of BLOB files down to a directory on the server.
    When I do the extract the Oracle user becomes the owner of the files and my own user doesn't have the access (neither read or write) to the files.
    I cannot receive Oracle access due a security issue so Im wondering if its possible to send down a command from the database that does a
    $chmod a+rw my_directory/*.* ?
    Iv looked into the some forums and I didnt find anything in particulate that would help me, so Im wondering if any of you know if this is possible ?
    BR / SA

    Hello
    Thank you for your advice but the question was to send down Linux commands from the DB, not do anything in the Linux enviroment.
    Here is a good place to start that I found on the net.
    public class JShellCommand {
    public static int execute(String cmd) {
    try
    String[] shellCmd = { "/bin/sh", "-c", cmd };
    Process process = Runtime.getRuntime().exec(shellCmd);
    int exitVal = process.waitFor();
    return (exitVal);
    catch (Exception e)
    return 1;
    load it into db with loadjava and wrap it with:
    CREATE OR REPLACE
    FUNCTION Shell_Command(
    p_CMD IN VARCHAR2
    RETURN NUMBER
    AS
    LANGUAGE JAVA
    NAME 'JShellCommand.execute(java.lang.String) return int';
    For OS command you can use:
    public class JCommand {
    public static int execute(String cmd) {
    try
    Process process = Runtime.getRuntime().exec(cmd);
    int exitVal = process.waitFor();
    return (exitVal);
    catch (Exception e)
    return 1;
    and
    CREATE OR REPLACE
    FUNCTION OS_Command(
    p_Cmd IN VARCHAR2
    RETURN NUMBER
    AS LANGUAGE JAVA
    NAME 'JCommand.execute(java.lang.String) return int';
    /

  • Unable to execute Linux command from Java

    Hi,
    I am currently working on a code wherein i need to execute Linux command from Java. Below are some of the query i have.
    1) Is there any efficient method of running OS commands from Java, rather than using Runtime and Process method.
    2) Below is details of my code which fails in execution
    **-- Java Version**
    java version "1.6.0"
    OpenJDK Runtime Environment (build 1.6.0-b09)
    OpenJDK Server VM (build 1.6.0-b09, mixed mode)
    -- Program Code ----
    Where <path> = Path i put myself
    package test;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.*;
    public class GetInode{
         * @param args
         public static void main(String[] args) {
              GetInode test = new GetInode();
              test.getInode();
         public void getInode(){                    
              String command = "/usr/bin/stat -Lt <path>;
              System.out.println(command);
              Process process;
              Runtime rt;     
              try{
              rt = Runtime.getRuntime();               
              process = rt.exec(command);
              InputStreamReader isr = new InputStreamReader(process.getErrorStream());
              BufferedReader bre = new BufferedReader(isr);
              BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream());
              System.out.println(bre.readLine());
    System.out.println(br.readLine().split(" ")[7]);
              process.destroy();          
              }catch (Exception ex){
                   System.out.println("Error :- " + ex.getMessage());
    ------Output -------------
    /usr/bin/stat -Lt "<path>"
    /usr/bin/stat: cannot stat `"<path>"': No such file or directory
    Error :- null
    Can any one help me what is wrong and why i am unable to run the Linux command from Java.

    For clarity purpose............i m submitting actual code here
    --- Code ---
    package test;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.*;
    public class GetInode{
    * @param args
    public static void main(String[] args) {
    GetInode test = new GetInode();
    test.getInode();
    public void getInode(){               
    String command = "/usr/bin/stat -Lt \"/afs/inf.ed.ac.uk/user/s08/s0898671/workspace/CASWESBLIN/TestFS/01_FIL_01.txt.txt\"";
    System.out.println(command);
    Process process;
    Runtime rt;
    try{
    rt = Runtime.getRuntime();
    process = rt.exec(command);
    InputStreamReader isr = new InputStreamReader(process.getErrorStream());
    BufferedReader bre = new BufferedReader(isr);
    BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
    System.out.println(bre.readLine());
    System.out.println(br.readLine().split(" ")[7]);
    process.destroy();
    }catch (Exception ex){
    System.out.println("Error :- " + ex.getMessage());
    --- Output ---
    [ratz]s0898671: java GetInode
    /usr/bin/stat -Lt "/afs/inf.ed.ac.uk/user/s08/s0898671/workspace/CASWESBLIN/TestFS/01_FIL_01.txt.txt"
    /usr/bin/stat: cannot stat `"/afs/inf.ed.ac.uk/user/s08/s0898671/workspace/CASWESBLIN/TestFS/01_FIL_01.txt.txt"': No such file or directory
    Error :- null
    -- Linux Terminal --
    If i copy the first line from the output and execute on Linux terminal her is the output that i get
    [ratz]s0898671: /usr/bin/stat -Lt "/afs/inf.ed.ac.uk/user/s08/s0898671/workspace/CASWESBLIN/TestFS/01_FIL_01.txt.txt"
    /afs/inf.ed.ac.uk/user/s08/s0898671/workspace/CASWESBLIN/TestFS/01_FIL_01.txt.txt 12003 24 81a4 453166 10000 1c 360466554 2 0 1 1246638450 1246638450 1246638450 4096
    Can you just assist me where am i really making mistake.......i was wondering if the command that i pass from Java....can be executed on Linux terminal why is it faling to run from java.........and when i print the Error Stream for process output........it show cannot Stat.......

  • Sqlplus commands from withing the batch files

    Hi,
    Oracle9.2
    need to execute the sqlplus commands from withing the batch files without calling the .sql file separately . How it can be done ?
    With Regards

    Hi,
    I agree with you...but as per your solution, after all you are calling the .sql file while connecting the sqlplus which I know already and I don't want to execute the sql commands like that as shown below.
    For example:
    for shut down the database and starting it again .sql files will be called as shown below
    Note: shutdown.sql file will contain simple database shutdown command.
    sqlplus -s "sys/%password%@%tnsname% as sysdba" @D:\shutdown_db.sql
    and again for restarting the db i will perform as below
    sqlplus -s "sys/%password%@%tnsname% as sysdba" @D:\start_db.sql
    But I want to get it executed directly from the DOS batch file.
    The thing is I want to execute this both the above database commands from the batch file itself without calling the .sql files separately as shown above.
    is it possible, so how it can be done ?
    Regards
    Edited by: user640001 on Feb 9, 2011 9:53 PM

  • Calling Operating System Commands from PL/SQL using java

    Calling Operating System Commands from PL/SQL - The Java Way
    wlth help of given thread link,
    Calling OS Commands from Plsql
    but i had user privilege problem
    Declare
    x Varchar2(2000);
    Begin
    x := OSCommand_Run('/tmp/sri/GROUP_ho.sh');
    DBMS_OUTPUT.Put_Line(x);
    End;
    o/p;
    can't exec: /tmp/sri/GROUP_ho.sh lacks user privilege
    i done the grant privillage also
    part
    dbms_java.grant_permission('abcd', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
    dbms_java.grant_permission('abcd', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
    dbms_java.grant_permission('
    abcd', 'SYS:java.io.FilePermission','<<ALL FILES>>', 'execute');
    again
    get
    can't exec: /tmp/sri/GROUP_ho.sh lacks user privilege
    same error;

    Process management at the OS level should prevent execution continuing in the calling code until the command has completed (either successfully or with error).
    If the low level java code were to spawn child process threads then execution could continue, but I'm guessing the Java function your talking about doesn't do that and just calls the operating system to execute the command and waits for the returning code to come back.

  • Will weblogic 4.5 work with the Sun Java Servlet Development Kit Version 2.1?

              Will weblogic 4.5 work with the Sun Java Servlet Development Kit Version 2.1
              (JSDK 2.1). The reason I want this is we want our application servlets to
              use the new 2.1 redirection mechanism to redirect to JSP files.
              

    WL 4.5 supports JSP 1.0 (and, therefore Servlet 2.1).
              What I want to know is when will it support JSP 1.1 (and, therefore Servlet
              2.2)!
              Regards,
              Murali Krishna Devarakonda
              Cox News <[email protected]> wrote in message
              news:7rk40p$s00$[email protected]..
              >
              > Will weblogic 4.5 work with the Sun Java Servlet Development Kit Version
              2.1
              > (JSDK 2.1). The reason I want this is we want our application servlets to
              > use the new 2.1 redirection mechanism to redirect to JSP files.
              >
              >
              >
              >
              

  • Problem in executing Linux command from Java Programme.

    hi everybody,
    can anybody help me to solve one problem i have.
    i want to capture the output of linux command "grep" in my java programme.but it is not working properly .(maybe this sub-process doesn't have permission to read files)
    here is my code and corresponding outputs.
    import java.io.*;
    public class BSearch
    public static void main(String kj[])
    try
    Runtime rt=Runtime.getRuntime();
    String command="grep \"hello\" -r /usr/MyDir ";               
    Process rtProc=rt.exec(command);          
    InputStream is=rtProc.getInputStream();
    BufferedReader br =new BufferedReader(new InputStreamReader(is));     
    String line =null;
    while((line=br.readLine()) != null)
    System.out.println(br.readLine());
    br.close();
    catch(Exception e)
    System.err.println("Error in command "+e);               
    it finds "hello" pattern only in BSearch.class file although if i fire this command on LINUX prompt it
    shows all the files in /usr/MyDir which contain "hello" pattern.
    java programme output :
    Binary file /usr/MyDir/BSearch.class matches.
    linux command output :
    /usr/MyDir/one.txt: hello sdfs
    Binary file /usr/MyDir/BSearch.class matches.
    /usr/MyDir/two.txt: kjsdf hello sdfsdf
    will anybody help me solve this problem.

    It may be a Problem of Catching the Echoes back from the Processes...I have a Program which Captures the Echoes..see if it works
    import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import java.beans.PropertyChangeSupport;import java.lang.ref.WeakReference;/** * Implements a proxy property change listener using a weak reference to avoid memory locking that would occur if it * was a strong reference. To understand this, we hve to understand that the property change listeners themselves are * hilding onto panels and other objects with strong java references. If the panel goes away while we are viewing an * object, we have a circular emory hold situation where the panel cant be collected because it has ahold of the * property and the property cannot because it has ahold of the pane. If we use weak references instead, then the hard * link between the listener and the producer is softened to almost nothing. */public class WeakPropertyChangeListener implements PropertyChangeListener {  /**   * A poperty change support object is included here so that the listener can remove   * himself from the listeners if the reference internally goes to null.   */  private PropertyChangeSupport pcs = null;  /** Holds the weak reference to the real listener. */  private WeakReference weakRef = null;  /**   * Constructs a new Proxy object for the given support and listener.   * @param pcs The property change support that this object will be using.   * @param pcl The real listener.   */  public WeakPropertyChangeListener(PropertyChangeSupport pcs, PropertyChangeListener pcl) {    if (pcs == null) throw new NullPointerException("pcs");    if (pcl == null) throw new NullPointerException("pcl");    this.pcs = pcs;    weakRef = new WeakReference(pcl);  } /** @see <{PropertyChangeListener}> */ public void propertyChange(PropertyChangeEvent changeEvent) {    Object referrant = weakRef.get();    if (referrant == null) {      pcs.removePropertyChangeListener(this);    } else {      ((PropertyChangeListener)referrant).propertyChange(changeEvent);    } } /** Returns true for comparison to referrant or this. */ public boolean equals(Object obj) {    if (obj instanceof WeakPropertyChangeListener) return super.equals(obj);    else if (obj != null)return obj.equals(weakRef.get());    else return false;  }}// snipet public void addPropertyChangeListener(PropertyChangeListener listener) {    this.propertyChangeSupport.addPropertyChangeListener(      new WeakPropertyChangeListener(this.propertyChangeSupport, listener));  } public void removePropertyChangeListener(PropertyChangeListener listener) {    this.propertyChangeSupport.removePropertyChangeListener(listener);  }

  • Calling Linux Command From Pl/SQL

    Hi!
    I need to create a trigger which will call a linux command. Basically, when a value changes in a table, I would like to run a linux script. The value in the table can change anytime during any day. I had a look at DBMS_JOB.SUBMIT but I'm not sure if this will work for me because I only need to run the linux script once - when the trigger is fired. I also don't wanna clutter the job queue. Please help. Thanx in advance.

    You didn't mention if you're looking for synchronous or asynchronous execution of your Linux command. Should the program wait for it to complete?
    If it has to be synchronous, you'll need to look into using the external program listener. If asynchronous is ok (and it usually is) and then I'd go with scheduling a job - don't worry about "cluttering up the job queue".
    If you're on 10g or later, don't bother with DBMS_JOB - use DBMS_SCHEDULER instead, which makes it much easier to execute an external process.

  • Linux commands from java

    hi all,
    i ve to exectue linux commands in background from within the jsp /servlet/Ejb .what code lines should i write or any other procedure to execute those.
    i know u guys must ve done this before.
    tc

    If you was writing a standa alone Java application that runs top of J2SE, then you could use java.lang.Runtime.exec() apis to call an operating system command. But since you are writing a J2EE component, as per J2EE standard, you don't have the privileges to call Runtime.exec() api because that can lead to security hole. See section #6.2.3 of J2EE 1.4 platform spec (http://java.sun.com/j2ee/download.html#platformspec) for more details about security permission set available to a J2EE component.
    Sahoo

  • Downloading Java 6 on Linux command line with wget

    Hello,
    I'm trying to download Java 6 on the Linux command line, because my GUI interface is not working.
    So I'm using the Linux wget command for this.
    I tried the following
    wget -r -O jdk.bin http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jdk-6u4-linux-i586.bin?BundledLineItemUUID=_09IBe.lhyoAAAEYq_YMXRqM&OrderID=gRNIBe.l1jQAAAEYoPYMXRqM&ProductID=48tIBe.phvMAAAEWdt1NOLEE&FileName=/jdk-6u4-linux-i586.binWhen I try the above wget command, I get only html files, javascript file, but I don't get the actual .bin download file.
    I got the above download URL from here:
    https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter;pgid=m5sy.hOjk2-x8Y;sid=UKAQRO-lOXkQRagRtUZYQQANrvJ_UCLgBULfhfK7tUrq7g==
    I can't get the file through FTP because and FTP download option is not available.
    Any help is appreciated.

    I transferred it over. First i downloaded it on windows and then installed winscp on windows and proftpd on ubuntu and then transferred it from windows to linux.
    I think it would be impossible for anyone using a console browser such as Lynx to download the file, because, html buttons are involved. If it was all just links then it would have been possible.
    But thanks for your reply.
    I wish the make the Java download Lynx (text browser) friendly.

  • What is wrong with the following Java servlet code that downloads files?

    Hi,
    I need urgent help.
    This is the issue. I have a JSP code that calls a Java servlet class. This class is used to download files from the JSP page. The following is the piece of code that does the file download.
    String pathOfFile = gsPath + "/" + gsFileName.substring(gsFileName.indexOf("~")+1);
    File F = new File(pathOfFile);
    res.setContentType("application/stream");
    res.setHeader("Content-Disposition", "attachment; filename=" +gsFileName.trim());
    This code works just fine with IE. However, when this is used with Netscape, the class name gets added to the original file name extension. For example, if the class name is 'FileRetriever' and the file being downloaded is originally named 'a.doc', the file gets a name of 'a.doc.FileRetriever' after download using Netscape or Mozilla.
    One way to solve this is by adding the appropriate file type in the MIME settings in browser preference. However, this not a permanent solution.
    Can somebody let me know the correct code to fix this issue?
    Thanks for your time.

    We loose control of the file name once we pass the original file name to the input stream. When our code instructs Netscape to write the file on the local disk using an output stream, that is when Netscape/Mozilla adds this additional extension to the original file. So, essentially, we do not know about this additional extension.
    Any ideas on how to resolve this?
    Thanks.

  • Problem with JSP and Java Servlet Web Application....

    Hi every body....
    I av developed a web based application with java (jsp and Java Servlets)....
    that was working fine on Lane and Local Host....
    But when i upload on internet with unix package my servlets and Java Beans are not working .....
    also not access database which i developed on My Sql....
    M using cpanel support on web server
    Plz gave me solution...
    Thanx looking forward Adnan

    You need to elaborate "not working" in developer's perspective instead of in user's perspective.

  • Exec a "MV" (move) Linux command from ABAP program using wildcard "*"

    Hi,
    I have a problem by using FM "SXPG_COMMAND_EXECUTE", SM49 while i try to move the whole content of a SAP folder into another.
    Foders are on the same file system:
    source: /tmp/
    dest:   /usr/sap/tmp
    I made a command in SM69 named ZMOVE:
    I put OS: Linux (is case sensitive)
            command: "mv"
            parameters: /tmp/* /usr/sap/tmp
    hence the final sentence should be "mv /tmp/* /usr/sap/tmp". I did it directly by using program "rsbdcos0" and works fine.
    Now if I try to execute the command ZMOVE from SM49 or using the function module it gives the same error
    *mv: cannot stat  /tmp/ ': No such file or directory**
    I made several tries by changing the parameter section (also using a script on the same directory).
    The permissions are ok, so the only problem seems to be the wildcard (*) character.
    Any suggestions?
    Thanks in advance
    Fabrizio

    Problem solved.
    Forget function modules, SM69 etc. there's an ABAP command in order to perform a SO command.
    Here an example:
    data: lf_file like rlgrap-filename,
          lf_idx(3) type n,
          cmd(254),
          result(255) occurs 100 with header line.
    cmd = 'mv /dir_source/* /dir_dest'.
      call 'SYSTEM' id 'COMMAND' field cmd
                    id 'TAB'     field result-sys.

Maybe you are looking for