Archief - [PROG][JAVA] Script laten lopen op remote server

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

yannick

Legacy Member
Goedemiddag,

Ik wou even vragen of het mogelijk is (ik neem aan van wel) om een script te starten of stoppen op een remote server.

Ik bedoel hiermee dus, kan ik vanuit java dit laten lopen de remote server:
/opt/init.d/iets start

mvg
Yannick Wellens

*EDIT*
Heb een oplossing gevonde dat via ssh werkt, is er ook een andere oplossing?

Tyfius

Legacy Member
Je gaat altijd op de een of andere manier moeten inloggen op die server, anders kan je aan dat script niet aan. Een mogelijkheid is om bijvoorbeeld op die server een webpagina te voorzien die de afhandeling van dat script voor zijn rekening neemt, en jij vanuit jouw Java programma enkel die webpagina moet aanroepen.

yannick

Legacy Member
Kheb die ssh oplossing maar gebruikt, gwn ssh connectie en command uitvoeren. Werkt perfect :D.

Mag slotje op trouwens :).

mvg
Yannick

dJeez

Legacy Member
Ik hoop dat je dan SSH-2 gebruikt en dat je username en paswoord niet in clear text in je code staan...

BTW Welke Java klasse/API gebruik je eigenlijk voor die SSH verbinding?

yannick

Legacy Member
Ok toch geen slotje, heb nog een vraag.

Ik zou graag de error message opvangen en in een variable steken.
Momenteel heb ik deze code, maar die stuurt de output naar System.Err en weet ni goe hoe dit te veranderen:
Code:
((ChannelExec)chan).setCommand(startupscript+" "+action);
    chan.setInputStream(null);
    ((ChannelExec)chan).setErrStream(System.out);
    InputStream in=chan.getInputStream();
    
    chan.connect();
    String responce="";
    byte[] tmp=new byte[1024];
    while(true){
      while(in.available()>0){
        int i=in.read(tmp, 0, 1024);
        if(i<0)break;
        System.out.print(new String(tmp, 0, i));
      }
      if(chan.isClosed()){
        break;
      }
      try{Thread.sleep(1000);}catch(Exception ee){}
    }

yannick

Legacy Member
Ma ik neem aan dat dit dan naar een file wordt geschreven. Ik kan die output ni opvangen rechtstreeks in een string zetten?

mvg
Yannick Wellens

Emerxill

Legacy Member
Gij moogt alles :), ge kunt veel kanten uit met uw stream eh.

Simpel voorbeeldje wat in mij opkomt...
Google voor meer info ;)

Code:
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
StringBuilder sb = new StringBuilder();
String line = null;

while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}

br.close();
return sb.toString();

yannick

Legacy Member
Emerxill zei:
Gij moogt alles :), ge kunt veel kanten uit met uw stream eh.

Simpel voorbeeldje wat in mij opkomt...
Google voor meer info ;)

Code:
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
StringBuilder sb = new StringBuilder();
String line = null;

while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}

br.close();
return sb.toString();

Uiteraard, nu string builder :D. Dat ik daar nog ni ben opgekomen!
Merci, direct is proberen se :p.

Bavo aka Joske

Legacy Member
Code:
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintStream;


public class PipeTest {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		System.out.println("usual out mesg");
		PipedInputStream pin = new PipedInputStream();
		PipedOutputStream pout = new PipedOutputStream(pin);
		System.setOut(new PrintStream(pout));
		System.out.println("should not be printing before err mesg");
		System.err.println("err mesg");
		System.err.println("retrieving from out...");
		char c = (char)pin.read();
		while (c != -1) {
			System.err.print(c);
			c = (char)pin.read();
		}
	}

}

Dit voorbeeld redirect System.out naar een 'pipe', en leest later de messages die erin geschreven zijn uit. Je kan dus een pipe opstellen zoals hier en aan de 'errstream' meegeven, daarna uitlezen.
Ik gebruik hier system.err als alternatieve output voor de test (system.err en system.out zij twee verschillende outputstreams die normaal naar console schrijven)


edit: dat van Emerxill lijkt me niet toepasbaar, aangezien je een outputstream moet meegeven, geen inputstream. Anders kan je gewoon met StringWriter werken, mocht je een Writer mgen meegeven.

Bavo aka Joske

Legacy Member
Code:
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PrintStream;


public class PipeTest {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		System.out.println("usual out mesg");
		System.out.flush(); // flush to make sure it is printed before redirecting
		PipedInputStream pin = new PipedInputStream();
		PipedOutputStream pout = new PipedOutputStream(pin); // create pipe to in
		System.setOut(new PrintStream(pout)); // redirect
		System.out.println("should be printing after next err mesg"); // print to ipe
		System.err.println("err mesg"); // print directly
		System.err.println("retrieving from out...");
		char c = (char)pin.read(); // read first char from pipe
		StringBuilder builder = new StringBuilder();
		while (c != -1) {
			builder.append(c); //save
			System.err.print(c); // or print
			c = (char)pin.read(); // next char
		}
		System.err.println(builder.toString());
	}

}

Heb het wat aangepast. Je moet opletten dat het blijft steken in de 'pin.read' tot de connectie wordt gesloten, want het kan niet weten wanneer het is gedaan, of wanneer het gewoon aan het wachten is.
Dat vereist wat aandacht, in dit geval blijft het na de testzin gewoon wachten.

yannick

Legacy Member
Merci, da werkt dus perfect (na wa geklooi om ervoor te zorgen da em ni eeuwig in de lus blijft, ik heb pin.available moeten gebruiken).

Code:
PipedInputStream pin = new PipedInputStream();
PipedOutputStream pout = new PipedOutputStream(pin);
System.setErr(new PrintStream(pout));

char c = (char)pin.read();
    while (pin.available()>0) {
            responce=responce+c;
            c = (char)pin.read();
    }

Thanks allemaal!

mvg
Yannick

Bavo aka Joske

Legacy Member
Wees voorzichtig met available(), het geeft AFAIK enkel terug of er nog meer kan gelezen worden zonder te wachten. Dat is enkel goed als je weet dat de buffer/stream waar je van leest reeds vol zit, en er tijdens het lezen niets meer aan wordt toegevoegd. Indien wel, dan zal available() zeggen dat er niets meer is, terwijl er later nog data af kwam (IO kan delayed zijn).
Read() daareentegen wacht met lezen tot er iets komt. In uw geval is available misschien juister. Te zien wie de data stuurt en hoe.

dJeez

Legacy Member
Een domme opmerking eigenlijk, maar ik ga ze toch maken. Als je engelstalige variabelenamen gebruikt, zorg dan dat ze correct zijn, maw response ipv responce. Het is heel hatelijk om code te erven waar ze pogingen doen om engelstalige benamingen te gebruiken die dan niet kloppen (of zelfs totaal op iets anders slaan). Naamgeving is echt wel belangrijk...

Ff checken op een online dienst als Babel Fish kan voor uw eventuele opvolgers veel frustraties voorkomen :p.

Verder zou je ook beter een StringBuilder gebruiken ipv een String, zoals de meesten in hun voorbeelden hierboven overigens doen (da's veel efficiënter, zie vb. http://chaoticjava.com/posts/stringbuilder-vs-string/ voor een summiere uitleg).

BTW De reden waarom ik vroeg naar de SSH implementatie is omdat ik zelf ook iets gelijkaardigs wou doen (nl. remote beheer van servers via een Java applicatie), zelf was ik Trilead SSH for Java tegengekomen op mijn zoektocht. Nu kan ik beiden eens vergelijken :p.

yannick

Legacy Member
Omg, wat een kanjer van een taalfout. Ga het onmiddellijk veranderen, bedankt om me erop te wijzen :).

Ik ben wel content van deze ssh api, doet alles wat het moet en meer :p.
Ik heb even dat artikel gelezen en ik moet zeggen, ben blij dat ik het weet nu! De overhead dat je genereert met string + is enorm.

Bedankt!

*EDIT*
Ok die trilead lijkt mij wel een pak simpeler eig :p. Maar zoals ik zei ben ik wel content van mijn create nu :). Twerkt perfect en veilig, dus meer moet dat niet zijn :).

mvg
Yannick Wellens

Bavo aka Joske

Legacy Member
op project hebben we jcsh en j2ssh geprobeerd
en j2ssh leek het beste (heropende connecties indien tunneling etc, andere niet)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan