目录
前言
上一篇已经基本阐述了CentOS如何远程到目标Windows服务器并执行授权的方式,此篇为additional内容,通过cmd方式进行授权,相对于Powershell方式授权,更加方便
附:centOS操作实践
Windows服务器
ip | 192.168.50.224 |
---|---|
userName | ssikme |
准备工作
1. CentOS可ping通windows服务器
2. Windows服务器已预装openssh
3. CentOS可ssh到windows服务器
执行步骤
添加依赖
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
Java脚本
package com.yzr;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import com.jcraft.jsch.*;
public class testSSH {
public static void main(String[] args) {
login();
}
public static void login() {
// 本地
String username = "ssikme";
String hostip = "192.168.50.224";
String password = "yzr19980330";
// 使用 JSch 进行 SSH 连接
try {
JSch jsch = new JSch();
Session session = jsch.getSession(username, hostip, 22); // 指定用户名、主机名和端口号
// 关闭 StrictHostKeyChecking,以避免第一次连接时的主机密钥验证
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(password); // 输入服务器密码
session.connect();
// 执行多条指令
List<String> commands = new ArrayList<>();
//commands.add("dir D:\\yzrtest /b");
//commands.add("net use Z: \\\\192.168.40.123\\nas password /user:PBSTEST\\zhry");
commands.add("wmic logicaldisk get name");
commands.add("icacls \"D:\\yzrtest\" /grant Everyone:(OI)(CI)(F) /c");
List<String> result = getCmdResult(session, commands);
result.forEach((x)-> System.out.println(x));
session.disconnect();
} catch (Exception e) {
e.printStackTrace();
System.out.println("连接失败");
return;
}
System.out.println("链接成功");
}
//用来执行命令
//Session表示传递连接对话,commands表示传递命令集合
public static List<String> getCmdResult(Session session , List<String> commands){
//用来存放命令的返回值
List<String> cmdResult = new ArrayList<>();
for (String command : commands) {
System.out.println(command);
Channel channel = null;
try {
//创建执行通道
channel = session.openChannel("exec");
//设置命令
((ChannelExec) channel).setCommand(command);
//连接通道
channel.connect();
//读取通道的输出
//存放命令的执行结果,如果结果有很多行,则每次line的值不同
String line;
//lines用来拼接line结果
StringBuffer lines = new StringBuffer();
// 3. 获取标准输入流
BufferedReader inputStreamReader = new BufferedReader(new InputStreamReader(
((ChannelExec) channel).getInputStream(), "GBK"));
// 4. 获取标准错误输入流
BufferedReader errInputStreamReader = new BufferedReader(new InputStreamReader(((ChannelExec) channel).getErrStream(), "GBK"));
// 5. 记录命令执行 log
while ((line = inputStreamReader.readLine()) != null) {
lines.append(line).append("\n");
}
// 6. 记录命令执行错误 log
String errLine = null;
while ((errLine = errInputStreamReader.readLine()) != null) {
lines.append(errLine).append("---------------------------------\n");
}
//如果命令执行没有返回值,则直接输出没有返回值
if (String.valueOf(lines).equals("")){
cmdResult.add("命令["+command+"]执行成功,但没有返回值");
}else {
//否则将每行返回直接存入到list中
cmdResult.add(String.valueOf(lines));
}
inputStreamReader.close();
errInputStreamReader.close();
channel.disconnect();
} catch (JSchException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return cmdResult;
}
}
验证
1、上传到CentOS环境
由于java脚本引用了其他依赖,建议打成jar包上传到CentOS环境中。这里建议使用xshell或secureCRT方式上传,如果直接在虚拟机内拖动上传,可能会异常,这是由于上传协议不同导致的。
2、运行jar包
java -jar testSSH.jar
3、运行完成
出现以下结果即为完成