Windows系统下使用Java代码操作Linux的方法介绍

互联网 19-3-21
本篇文章给大家带来的内容是关于Windows系统下使用Java代码操作Linux的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

一、场景描述:

  主项目(Web)部署在Windows下,算法项目(TensorFlow)部署在Linux环境下。

二、依赖环境(Jar)

        <!--Java SSH插件-->         <dependency>             <groupId>ch.ethz.ganymed</groupId>             <artifactId>ganymed-ssh2</artifactId>             <version>build210</version>         </dependency>         <dependency>             <groupId>sshtools</groupId>             <artifactId>j2ssh-core</artifactId>             <version>0.2.9</version>         </dependency>          <dependency>             <groupId>commons-io</groupId>             <artifactId>commons-io</artifactId>             <version>2.4</version>         </dependency>

三、后端代码

package cn.virgo.audio.utils;   import ch.ethz.ssh2.ChannelCondition; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; import com.sshtools.j2ssh.SshClient; import com.sshtools.j2ssh.authentication.AuthenticationProtocolState; import com.sshtools.j2ssh.authentication.PasswordAuthenticationClient; import com.sshtools.j2ssh.sftp.SftpFile; import org.apache.commons.io.IOUtils;  import java.io.*; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List;  public class RemoteShellExecutor {      private Connection conn;      private String ip;      private String userName;      private String password;      private String charset = Charset.defaultCharset().toString();      private static final int TIME_OUT = 1000 * 5 * 60;      /**      * 构造函数      *      * @param ip      * @param userName      * @param password      */     public RemoteShellExecutor(String ip, String userName, String password) {         this.ip = ip;         this.userName = userName;         this.password = password;     }      /**      * 链接远程桌面      *      * @return      * @throws IOException      */     private boolean login() throws IOException {         conn = new ch.ethz.ssh2.Connection(ip);         conn.connect();         return conn.authenticateWithPassword(userName, password);     }      /**      * 执行shell      *      * @param cmds      * @return      * @throws Exception      */     public int exec(String cmds) throws Exception {         InputStream stdOut = null;         InputStream stdErr = null;         int ret = -1;         try {             if (login()) {                 Session session = conn.openSession();                 session.execCommand(cmds);                 stdOut = new StreamGobbler(session.getStdout());                 processStream(stdOut, charset);                 stdErr = new StreamGobbler(session.getStderr());                 processStream(stdErr, charset);                 session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);                 ret = session.getExitStatus();             } else {                 throw new Exception("远程链接失败:" + ip);             }         } catch (Exception e) {             e.printStackTrace();         } finally {             if (conn != null) {                 conn.close();             }             IOUtils.closeQuietly(stdOut);             IOUtils.closeQuietly(stdErr);         }         return ret;     }      /**      * 获取执行过程输出      *      * @param in      * @param charset      * @return      * @throws IOException      */     private void processStream(InputStream in, String charset) throws IOException {         byte[] buf = new byte[1024];         while (in.read(buf) != -1) {             System.out.println(new String(buf, charset));         }     }      /**      *  获取Linux下某个文件数据,将其拷贝到本地tmpPath下      */     public List<String> getCaleResByFileFromSSH(String filePath, String filename, String tmpPath) {         List<String> resList = new ArrayList<>();         SshClient client = new SshClient();         try {             client.connect(this.ip);             //设置用户名和密码             PasswordAuthenticationClient pwd = new PasswordAuthenticationClient();             pwd.setUsername(this.userName);             pwd.setPassword(this.password);             int result = client.authenticate(pwd);             if (result == AuthenticationProtocolState.COMPLETE) {//如果连接完成                 List<SftpFile> list = client.openSftpClient().ls(filePath);                 for (SftpFile f : list) {                     if (f.getFilename().equals(filename)) {                         OutputStream os = new FileOutputStream(tmpPath + f.getFilename());                         client.openSftpClient().get(f.getAbsolutePath(), os);                         //以行为单位读取文件start                         File file = new File(tmpPath + f.getFilename());                         BufferedReader reader = null;                         try {                             reader = new BufferedReader(new FileReader(file));                             String tempString = null;                             int line = 1;//行号                             //一次读入一行,直到读入null为文件结束                             while ((tempString = reader.readLine()) != null) {                                 //显示行号                                 System.out.println("line " + line + ": " + tempString);                                 resList.add(tempString);                                 line++;                             }                             reader.close();                         } catch (IOException e) {                             e.printStackTrace();                         } finally {                             if (reader != null) {                                 try {                                     reader.close();                                 } catch (IOException e1) {                                 }                             }                         }                         //以行为单位读取文件end                     }                 }             }         } catch (IOException e) {             e.printStackTrace();         }         return resList;     } }

以上就是Windows系统下使用Java代码操作Linux的方法介绍的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: java
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:如何在Java中创建只读文件?(代码实例)

相关资讯