Java 远程登录SSH,执行linux指令(demo查询剩余磁盘大小)

发布时间:2019-08-13作者:laosun阅读(2428)

Java

    首先导入jar包

    <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.55</version>
    </dependency>

    调用类

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.log4j.Logger;
    
    import com.google.common.collect.Maps;
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelExec;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
    
    /**
     * SSH登录Linux调用shell工具类
     * @author sun
     */
    public class ShellUtils {
    	
    	protected static final Logger LOG = Logger.getLogger(ShellUtils.class);
    	
    	public static void main(String[] args) {
    		//测试
    		getDisk("rootlogin", "10.xxx.4.xxx", 22, "rootpassword");
    	}
    	
    	/**
    	 * 获取磁盘使用率
    	 * @param loginName
    	 * @param ip
    	 * @param port
    	 * @param password
    	 * @return
    	 */
    	@SuppressWarnings({ "rawtypes", "unchecked" })
    	public static Result getDisk(String loginName, String ip, int port, String password) {
    		Result result = execute(loginName, ip, port, password, "df -h");
    		if(ResultConstants.RESULT_CODE_SUCCESS.equals(result.getCode())) {
    			List<String> stdout = (List<String>) result.getData();
    			if(stdout!=null && stdout.size()>0) {
    				String[] strArray = null;
    				Map<String, String> disk = Maps.newHashMap();
    				disk.put("ip", ip);
    				int lineNum = 0;
    				for(String line:stdout) {
    					lineNum++;
    					if (lineNum != 2) {
    						continue;
    					}
    					int m = 0;
    					strArray = line.split(" ");
    					for (String para : strArray) {
    						if (para.trim().length() == 0)
    							continue;
    						++m;
    						if (para.endsWith("G") || para.endsWith("Gi")) {
    							// 目前的服务器
    							if (m == 2) {
    								disk.put("total", para);
    							}
    							if (m == 3) {
    								disk.put("used", para);
    							}
    						}
    						if (para.endsWith("%")) {
    							if (m == 5) {
    								disk.put("use_rate", para);
    							}
    						}
    					}
    				}
    				result.setCode(ResultConstants.RESULT_CODE_SUCCESS);
    				result.setMsg(ResultConstants.RESULT_DESC_SUCCESS);
    				result.setData(disk);
    			}
    		}
    		return result;
    	}
    	
    	/**
    	 * 远程登录并且执行指令返回结果
    	 * @param loginName
    	 * @param ip
    	 * @param port
    	 * @param password
    	 * @param command
    	 * @return
    	 */
    	@SuppressWarnings({ "unchecked", "rawtypes" })
    	public static Result execute(String loginName, String ip, int port, String password, String command) {
    		Result result = new Result();
    		JSch jsch = new JSch();
    		MyUserInfo userInfo = new MyUserInfo();
    		List<String> stdout = new ArrayList<>();
    
    		try {
    			// 创建session并且打开连接,因为创建session之后要主动打开连接
    			Session session = jsch.getSession(loginName, ip, port);
    			session.setPassword(password);
    			//最好设置,否则第一次登录会提示不信任 reject HostKey: 10.31.4.195
    			//https://blog.csdn.net/Mitnick5194/article/details/85863267
    			session.setConfig("StrictHostKeyChecking", "no");
    			// 此处必须设置userInfo
    			session.setUserInfo(userInfo);
    			session.connect();
    
    			// 打开通道,设置通道类型,和执行的命令
    			Channel channel = session.openChannel("exec");
    			ChannelExec channelExec = (ChannelExec) channel;
    			channelExec.setCommand(command);
    			channelExec.setInputStream(null);
    			BufferedReader input = new BufferedReader(new InputStreamReader(channelExec.getInputStream()));
    			channelExec.connect();
    
    			// 接收远程服务器执行命令的结果
    			String line;
    			while ((line = input.readLine()) != null) {
    				stdout.add(line);
    			}
    			input.close();
    
    			// 关闭通道
    			channelExec.disconnect();
    			// 关闭session
    			session.disconnect();
    			result.setCode(ResultConstants.RESULT_CODE_SUCCESS);
    			result.setMsg(ResultConstants.RESULT_DESC_SUCCESS);
    			result.setData(stdout);
    		} catch (Exception e) {
    			e.printStackTrace();
    			LOG.error(LogKit.append("远程SSH执行命令", "出现异常", e.getMessage()));
    			result.setCode(ResultConstants.RESULT_CODE_FAILED);
    			result.setMsg(e.getMessage());
    			return result;
    		}
    		return result;
    	}
    	
    }

    对象

    import com.jcraft.jsch.UserInfo;
    
    public class MyUserInfo implements UserInfo {
    
    	@Override
    	public String getPassphrase() {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public String getPassword() {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public boolean promptPassword(String message) {
    		// TODO Auto-generated method stub
    		return false;
    	}
    
    	@Override
    	public boolean promptPassphrase(String message) {
    		// TODO Auto-generated method stub
    		return false;
    	}
    
    	@Override
    	public boolean promptYesNo(String message) {
    		// TODO Auto-generated method stub
    		return false;
    	}
    
    	@Override
    	public void showMessage(String message) {
    		// TODO Auto-generated method stub
    
    	}
    
    }


1 +1

版权声明

 Java  linux  扩展  centos

 请文明留言

1 条评论