01. juli 2005 - 11:20Der er
14 kommentarer og 1 løsning
Flere kommandoer til Process
Hej eksperter.
Jeg sidder og vil gerne udføre en sekvens af kommandoer fra mit javaprogram. (Jeg bruger linux, men det er ikke drabelig vigtigt). Det mit program bør gøre er først at kalde ssh server hernæst skal programmet være i stand til at indtaste passwordet ****** og afhængig af om dette lykkes udføre en kommando på serveren.
Jeg er ikke interesseret i at oprette et server/client interface i java, men kun i at afvikle ssh kommandoen og tilhørende password.
Jeg har rodet en masse med Runtime.getRuntime().exec(...), men jeg kan ikke få den til at modtage mere end en enkelt kommando ad gangen (f.eks. echo "hello world").
Ok .. i spørgsmålet bad jeg jo om ssh, så jeg håber du vil kommentere på mit eget forsøg. Jeg prøver nu med en modificeret udgave af din kode at forbinde til min ssh server, og køre ll .. here goes:
import java.io.*;
public class Exec { public static void main(String[] args) throws IOException { Process p = Runtime.getRuntime().exec("ssh hite@min_server.dk"); PrintWriter pw = new PrintWriter(p.getOutputStream()); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; System.out.println("venter på password prompt");
try{ Thread.sleep(1000); }catch(Exception e){} pw.println("mit_eget_password"); pw.flush(); System.out.println("venter på klar prompt");
Jeg fik løst problemet .. det endte jo med at være mere ssh-orienteret end Process orienteret, men jeg vedlægger en (noget lang) kode som gør det jeg ønskede. I øvrigt kan ideen med at læse og skrive til stdin og stdout også bruges til Process eksemplet. Arne_v, jeg fik rigeligt brugt det du skrev til mig. Den vedlagte kode er en modificeret udgave af eksemplerne der følger med mindterm ssh systemet. Mindterm jar-filen skal bruges for at køre dette eksempel.
/****************************************************************************** * * Copyright (c) 1999-2003 AppGate Network Security AB. All Rights Reserved. * * This file contains Original Code and/or Modifications of Original Code as * defined in and that are subject to the MindTerm Public Source License, * Version 2.0, (the 'License'). You may not use this file except in compliance * with the License. * * You should have received a copy of the MindTerm Public Source License * along with this software; see the file LICENSE. If not, write to * AppGate Network Security AB, Otterhallegatan 2, SE-41118 Goteborg, SWEDEN * *****************************************************************************/
/** * This is a variant of RunRemoteCommand2 which processes the stdio streams * slightly differently, otherwise it does exactly the same thing. */ public class RunRemoteCommand2 { private static char EOT = (char)4;//ascii: 4 = End Of Transmission
/* * Connect to the server and authenticate using plain password * authentication (if other authentication method needed check other * constructors for SSH2SimpleClient). */ Socket serverSocket = new Socket(server, port); SSH2Transport transport = new SSH2Transport(serverSocket, prefs, createSecureRandom()); client = new SSH2SimpleClient(transport, user, passwd);
/* * Create the remote console to use for command execution. Here we * redirect stderr of all sessions started with this console to our * own stderr (NOTE: stdout is NOT redirected here but is instead * fetched below). */ console = new SSH2ConsoleRemote(client.getConnection(), null, System.err);
/* * Start a shell on server (note: we don't want a PTY here) */ if(!console.shell(true, "dumb", 20, 80)) { throw new Exception("Couldn't execute shell on server!"); }
/* * Fetch the internal stdout stream and wrap it in a BufferedReader * for convenience. */ stdout = console.getStdOut();
cmdRunner = console.getStdIn();
Thread.sleep(2000);
}
private static void endConnection() throws Exception{ /* * Retrieve the exit status of the command (from the remote end). */ int exitStatus = console.waitForExitStatus();
/* * Disconnect the transport layer gracefully */ client.getTransport().normalDisconnect("User disconnects");
/* * Exit with same status as remote command did */ System.exit(exitStatus); }
public static SecureRandomAndPad createSecureRandom() { /* NOTE, this is how it should be done if you want good * randomness, however good randomness takes time so we settle with * just some low-entropy garbage here. * * RandomSeed seed = new RandomSeed("/dev/random", "/dev/urandom"); * byte[] s = seed.getBytesBlocking(20); * return new SecureRandomAndPad(new SecureRandom(s)); * */ byte[] seed = RandomSeed.getSystemStateHash(); return new SecureRandomAndPad(new SecureRandom(seed)); }
Hehe .. og bare rolig .. password er tilfældigt valgt.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.