来源 : GPT4
代码
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import java.io.InputStream;
public class RemoteShUtil {
public static String run(String ip, Integer port, String username, String password, String cmd) {
try {
// 创建Session
JSch jsch = new JSch();
Session session = jsch.getSession(username, ip, port);
session.setPassword(password);
// 配置Session
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(cmd);
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
// 获取执行输出
InputStream in = channel.getInputStream();
channel.connect();
byte[] tmp = new byte[1024];
StringBuffer rs = new StringBuffer();
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0) break;
rs.append(new String(tmp, 0, i)).append("\n");
}
if (channel.isClosed()) {
if (in.available() > 0) continue;
//System.out.println("exit-status: " + channel.getExitStatus());
break;
}
}
// 关闭通道和会话
channel.disconnect();
session.disconnect();
return rs.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// 交互命令,如 top -n 1 > /root/1
// 好像有点问题 上面的命令可以直接查看 top -bn1
public static void runInteractive(String ip, Integer port, String username, String password, String cmd) {
try {
JSch jsch = new JSch();
Session session = jsch.getSession(username, ip, port);
session.setPassword(password);
// 取消主机密钥检查(注意这可能会导致安全问题,最好在代码中处理主机密钥校验)
session.setConfig("StrictHostKeyChecking", "no");
// 连接到 SSH 服务器
session.connect();
// 打开 exec 通道
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand("bash -c '" + cmd + "'");
// 连接 exec 通道
channel.connect();
// 等待执行完成
while (!channel.isClosed()) {
Thread.sleep(100);
}
// 检查退出状态
int exitStatus = channel.getExitStatus();
if (exitStatus == 0) {
System.out.println("Command executed successfully.");
} else {
System.out.println("Execution failed with status: " + exitStatus);
}
// 关闭通道和会话
channel.disconnect();
session.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(run("127.0.0.1", 22, "root", "123456, "ls -la"));
}
}
maven依赖
<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>