如何通过Java代码连接putty并将命令传递给终端?

时间:2016-05-10 07:57:16

标签: java unix putty

我尝试使用以下代码。但是腻子正在发射和关闭imidiatlly。 in command.txt包含ls -lrt代码。

Runtime r = Runtime.getRuntime();
    //Runtime r2 = Runtime.getRuntime();
    Process p = null;
    //Process p2 = null;
    String s = "D:\\Nandan\\putty.exe -ssh -l ***** -pw ******** XX.XX.XX.XX -m D:\\Nandan\\command.txtx";
    //String s2 = "ls -lrt";
    try
    {
        p = r.exec(s);
        p.waitFor();

    } catch (Exception e)
    {
        System.out.println("Exception error :"+e.getMessage());
        e.printStackTrace();
    }

3 个答案:

答案 0 :(得分:3)

Putty是ssh客户端,所以你不用调用putty就可以直接使用java ssh库JSch.jar来执行linux机器上的任何操作。下面是相同的示例代码

Session session = new JSch().getSession(user, hostName, 22);        
session.setPassword(password);
java.util.Properties config = new java.util.Properties(); 
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand("some command here");
String result = IOUtils.toString(channel.getInputStream());
channel.disconnect();
session.disconnect();

要了解详情,请浏览http://www.jcraft.com/jsch/examples/

链接

答案 1 :(得分:0)

我成功做到了这样

    private static void printResult(InputStream input, Channel channel) throws Exception {
    int SIZE = 1024;
    byte[] tmp = new byte[SIZE];
    while (true) {
        while (input.available() > 0) {
            int i = input.read(tmp, 0, SIZE);
            if (i < 0)
                break;
            System.out.print(new String(tmp, 0, i));
        }
        if (channel.isClosed()) {
            System.out.println("exit-status: " + channel.getExitStatus());
            break;
        }
        try {
            Thread.sleep(300);
        } catch (Exception ee) {
        }
    }
}

关于功能 printResult

import tkinter as tk

from Adafruit_IO import Client, Feed, RequestError

ADAFRUIT_IO_USERNAME = "**********"
ADAFRUIT_IO_KEY = "***************"

aio = Client(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY)

try:
    temperature = aio.feeds('temperature')
except RequestError: 
    feed = Feed(name="temperature")
    temperature = aio.create_feed(feed)
    
class Timer:
    
     def __init__(self, parent):
         self.temp = 25
         self.label = tk.Label(text="--,- °C", font="Arial 30", width=10)
         self.label.pack()
         self.label.after(5000, self.sendtemp)

     def sendtemp(self):
         aio.send_data(temperature.key,self.temp) 
         data = aio.receive(temperature.key)
         print(data.value)
         self.label.configure(text="%i°C" % self.temp)
         self.temp +=1
         self.label.after(5000, self.sendtemp)       

if __name__ == "__main__":
     window = tk.Tk()
     window.title ("Thermometer")
     window.geometry("300x100")
     timer = Timer(window)
     window.mainloop()

答案 2 :(得分:0)

解决代码问题,这是问题的一部分。

Putty 的

-m 选项指示服务器启动文件中存在的命令而不是 shell,以便在命令完成后会话关闭。为了使 putty 会话具有交互性,我们需要添加 -t 选项,并且在作为输入提供给 -m 选项的文件中,我们需要添加“/bin/bash”作为最后一个命令。

putty.exe -ssh -l username -pw NextGenCne password -m D:\test.txt -t

D:\test.txt 文件内容如下。

cd /home/username/mydirectory
/bin/bash

所以完整的程序将如下所示。

Runtime r = Runtime.getRuntime();
    //Runtime r2 = Runtime.getRuntime();
    Process p = null;
    //Process p2 = null;
    String s = "D:\\Nandan\\putty.exe -ssh -l ***** -pw ******** XX.XX.XX.XX -m D:\\Nandan\\command.txtx -t";
    //String s2 = "ls -lrt";
    try
    {
        p = r.exec(s);
        p.waitFor();

    } catch (Exception e)
    {
        System.out.println("Exception error :"+e.getMessage());
        e.printStackTrace();
    }

注意:如果目的是从java代码中以某种方式打开putty终端,那么上面的方法是可以的,如果目的只是在服务器上执行一些命令并捕获输出,那么就去上面已经提到的JSch答案。