Windows系统下如何使用Java代码操作Linux?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
一、场景描述:
主项目(Web)部署在Windows下,算法项目(TensorFlow)部署在Linux环境下。
二、依赖环境(Jar)
<!--Java SSH插件-->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh3</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.ssh3.ChannelCondition;
import ch.ethz.ssh3.Connection;
import ch.ethz.ssh3.Session;
import ch.ethz.ssh3.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.ssh3.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大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。