小兔网

本篇文章给大家带来的内容是关于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的方法介绍的知识。速戳>>知识兔学习精品课!