在后台使用JSch运行程序

时间:2016-06-15 11:07:49

标签: java ubuntu permissions remote-access jsch

我正在尝试使用JSch连接到远程计算机。我的所有系统都在 ubuntu 上运行,包括我的生产机器。我能够成功连接并运行jar文件。但是当我关闭窗口时,程序会自动关闭。我现在想要实现的是在后台运行这个jar文件。

我已经使用' & '添加了sudo命令。在这种情况下,服务器甚至无法启动。我尝试过使用shell频道,但服务器在停止我的程序时没有启动或关闭。

我还尝试了 nohup 不公开命令在后台运行。当我使用 ps ux 获取进程状态时,STAT列显示T,根据this表示进程已停止。我已经在这里坚持了3天

  1. 我写的代码有什么问题吗?为什么服务器无法在后台运行?
  2. setPty(true) - >这是做什么的?
  3. 当我输入密码时,有没有办法阻止密码打印到控制台?
  4. 我一直在我的本地网络中测试此代码。在连接到我们的生产服务器时,我们传递一个权限文件,如下所示: sudo ssh -i permissionFilePath serverName @ ipAddress 。我是否必须再次更改我的方法以传递此权限文件才能访问生产系统?
  5. 我正在使用以下版本的JSch:

    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.53</version>
    </dependency>
    

    我使用以下代码:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    
    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.JSchException;
    import com.jcraft.jsch.Session;
    
    public class App extends Application {
        @Override
        public void start(Stage primaryStage) {
            Button btn = new Button();
            btn.setText("click");
            btn.setOnAction(new EventHandler<ActionEvent>() {
                public void handle(ActionEvent arg0) {
                    try {
                        JSch objJSch = new JSch();
                        Session objSession;
                        objSession = objJSch.getSession("userName", "host");
                        objSession.setPassword("password");
                        objSession.setConfig("StrictHostKeyChecking", "no");
                        System.out.println("Establishing Connection...");
                        objSession.connect();
                        System.out.println("Connection established.");
                        Channel objChannel = objSession.openChannel("exec");
                        ((ChannelExec) objChannel).setCommand("cd {{path to my jar file}};sudo java -jar start.jar");
                        ((ChannelExec) objChannel).setErrStream(System.err);
                        ((ChannelExec) objChannel).setPty(true);//why should i use this??
                        InputStream in = objChannel.getInputStream();
                        OutputStream out = objChannel.getOutputStream();
                        objChannel.connect();
                        out.write(("password" + "\n").getBytes());
                        out.flush();
                        BufferedReader br = new BufferedReader(new InputStreamReader(in));
                        String s;
                        while ((s = br.readLine()) != null) {
                            System.out.println(s);
                        }
                        while (!objChannel.isClosed()) {
                            System.out.println("Waiting to close channel");
                        }
                        System.out.println("disconnecting...");
                        objChannel.disconnect();
                        objSession.disconnect();
                        System.out.println("disconnected.");
                    } catch (JSchException e) {
                        if (e.getMessage().equalsIgnoreCase("Auth fail"))
                            System.out.println("Authorization failed...");
                        else
                            e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
            StackPane root = new StackPane();
            root.getChildren().add(btn);
            Scene scene = new Scene(root, 300, 250);
            primaryStage.setTitle("");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

1 个答案:

答案 0 :(得分:1)

 Your Code
((ChannelExec) objChannel).setCommand("cd {{path to my jar file}};sudo java -jar start.jar");

Modify it to :
((ChannelExec) objChannel).setCommand("cd {{path to my jar file}};sudo java -jar start.jar > /dev/null 2>&1 &");

这将解决您的问题。