Telnet.SendCommand - CRTL+C

8 respostas
vittorino

Ei pessoal, boa noite!

Tenho um aplicativo que se conecta a uma plataforma utilizando a API da Apache commons e realiza algumas verificações no sistema. Preciso enviar crtl+c para interromper uma execução. Como faço isso em java? Alguém pode me ajudar?

Desde já obrigado;

8 Respostas

matheuslmota

Veja se isso lhe ajuda:
http://pastebin.com/f6315063f

matheuslmota

Cara, não sei se rola muito fazer isso em Java. Na API do Windows existe a função GenerateConsoleCtrlEvent e com ela mandar um Ctrl + C para o processo. Não sei nem se você conseguiria capturar o evento associado à tecla Ctrl no Java.

leoramos

Cara, deixa fazer uma pergunta: é pra TELNET, ok, mas tá fazendo que testes?
Eu tô perguntando pq neste EXATO momento, eu tô fazendo uma extensão de uma classe da Apache Commons Net, justamente porquê preciso de informações intermediárias dos comandos, que a API não provê.
Dependendo do que estiveres fazendo, o que tô fazendo aqui pode te servir.
Abraço!

matheuslmota
Cara, você pode enviar o caracter Ctrl-C para o seu processo da seguinte forma:
Process process = Runtime.getRuntime().exec("processo");
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
bufferedWriter.write((char)3);
EDIT: Fiz um algoritmo usando KeyListener que envia um caracter end-of-text para o processo caso Ctrl+C seja pressionado.
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;


public class CtrlC implements KeyListener {
	private Process process;
	static JTextArea area;
	boolean t1 = false, t2 = false;
	public static void main(String[] args) throws IOException {
		CtrlC ctrlC = new CtrlC();
		ctrlC.process = Runtime.getRuntime().exec("processo");
		JFrame frame = new JFrame();
		area = new JTextArea();
		area.addKeyListener(ctrlC);
		frame.add(area);
		frame.setSize(500, 800);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	@Override
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==KeyEvent.VK_CONTROL)
			t1=true;
		if(e.getKeyCode()==KeyEvent.VK_C)
			t2=true;
		if(t1 && t2)
		{	
			BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
			try {
				bufferedWriter.write((char)3);
				bufferedWriter.flush();
				bufferedWriter.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			t1=false;
			t2=false;
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		if(e.getKeyCode()==KeyEvent.VK_CONTROL)
			t1=false;
		if(e.getKeyCode()==KeyEvent.VK_C)
			t2=false;
	}

	@Override
	public void keyTyped(KeyEvent e) {

	}
}
Você pode usar esse TextArea para digitar comandos e pegar a saída dos seus processos. Faça algumas pequenas modificações para usar o TextArea como um prompt.
vittorino


Cara, deixa fazer uma pergunta: é pra TELNET, ok, mas tá fazendo que testes?
Eu tô perguntando pq neste EXATO momento, eu tô fazendo uma extensão de uma classe da Apache Commons Net, justamente porquê preciso de informações intermediárias dos comandos, que a API não provê.
Dependendo do que estiveres fazendo, o que tô fazendo aqui pode te servir.
Abraço!

Bom, minha aplicação conecta a uma plataforma através telnet (commons-net) executa uma sequência de comandos e um desses comandos altera a linha de comando de uma tarefa, nisso eu preciso simular o evento ctrl+c, daí a aplicação é questionada: alterar? sim ou não. Eu preciso do evento que é gerado quando precionado ctrl+c, pois a aplicação não recebe esse evento do teclado.

matheuslmota

vittorino:

Cara, deixa fazer uma pergunta: é pra TELNET, ok, mas tá fazendo que testes?
Eu tô perguntando pq neste EXATO momento, eu tô fazendo uma extensão de uma classe da Apache Commons Net, justamente porquê preciso de informações intermediárias dos comandos, que a API não provê.
Dependendo do que estiveres fazendo, o que tô fazendo aqui pode te servir.
Abraço!

Bom, minha aplicação conecta a uma plataforma através telnet (commons-net) executa uma sequência de comandos e um desses comandos altera a linha de comando de uma tarefa, nisso eu preciso simular o evento ctrl+c, daí a aplicação é questionada: alterar? sim ou não. Eu preciso do evento que é gerado quando precionado ctrl+c, pois a aplicação não recebe esse evento do teclado.

Por acaso você leu o que eu postei?

vittorino

Blz Matheus!?

Eu vi sim seu comentário, eu tinha testado e está apresentado erro:

Exception in thread "main" java.io.IOException: Cannot run program "processo": CreateProcess error=2, O sistema não pode encontrar o arquivo especificado

Segue o código main:

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;


public class Callend {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		
		OutputStream saida = new FileOutputStream("E:\Log\Network.txt");

		OutputStreamWriter writer = new OutputStreamWriter(saida);
		BufferedWriter buffer = new BufferedWriter (writer);
		
		Process process = null;
		CtrlC ctrlC = new CtrlC();  
                ctrlC.process = Runtime.getRuntime().exec("processo");
		BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));  
		
		
		// Conectando ao elemento
		try {
			TelnetSample telnet = new TelnetSample( "10.126.191.129", 
					"user", "user", "38400" );
		// Executa sequencia  comandos
			buffer.write(telnet.sendCommand( "Comandos:;" ));
                        .
                        .
                        .
			buffer.write(telnet.sendCommand( "Comandos:;" ));
			buffer.write(telnet.sendCommand( "altera a tarefa:;" ));
			bufferedWriter.write((char)3);
			buffer.write("Y"); // Salva alteração
			
			buffer.close();
			telnet.disconnect();
		}
		catch( Exception e ) {
			e.printStackTrace();
		}


	}

}
matheuslmota

vittorino:
Blz Matheus!?

Eu vi sim seu comentário, eu tinha testado e está apresentado erro:

Exception in thread "main" java.io.IOException: Cannot run program "processo": CreateProcess error=2, O sistema não pode encontrar o arquivo especificado

ahuahuahua
Cara, “process” foi um nome genérico que eu coloquei, você deve substituir process ou por um comando que você irá rodar remotamente ou então por um shell script. Sendo que se você for rodar um shell script, rode da seguinte foma:

Runtime.getRuntime().exe("/bin/sh -c seu_shell_script.sh");

Mais uma vez, seu_shell_script.sh é um nome genérico, coloque no seu lugar o nome do shell script que você queira rodar

Criado 28 de julho de 2011
Ultima resposta 3 de ago. de 2011
Respostas 8
Participantes 3