一、思路

    (1)作为java的web后台应用,在做ssh连接的时候,比如导入所需要的协议jar包,如ssh.jar,本次测试,本人使用的是

java ssh执行命令 java操作ssh_java


    (2) 导入jar包后,开始进入代码编程,首先需要进行创建用户名、密码、端口、ip地址等变量,用来存储对应连接的服务器信息。

    (3)创建连接对象,同时在创建会话对象,在java中一切皆对象。

    (4)判断连接是否成功,如果成功执行命令代码,如果失败,进行返回信息。

    (5)在连接成功后,需要对接收的数据进行处理,此处的数据是StringBuilder()方式来接收。

    (6)此时需要将接收到的数据进行解析,使用while()循环方法。

二、实现步骤

String str="";
	public String Qinghc(){
		System.out.println("执行244");
		String hostname="127.0.0.1";//IP地址
	    String username="weblogic";//用户名
	    String password="sepc*92333";//密码
	    Connection conn=new Connection(hostname,10022);//创建连接,参数:IP,端口
	    Session ssh=null;//设置会话
	    String line=null;//接收line数据
	    StringBuilder sb=null;//设置StringBuilder 类型
	    try{
	   	 conn.connect();//开启连接
	      //通过conn.authenticateWithPassword方法,参数用户名,密码,开始连接,返回一个boolean 类型值
	   	 boolean isconn=conn.authenticateWithPassword(username, password);
	   	 //判断访问是否成功
	   	 if(!isconn){
	   		 System.out.println("服务器登陆失败!!!!");
	   	 }else{
	   		 
	   		 System.out.println("登陆成功!!");
	   	            //成功后,打开会话(创建会话)
	   		 ssh=conn.openSession();
	            	//通过execComand方法执行shell 命令
	   		 ssh.execCommand("echo 0>/home/weblogic/Oracle/Middleware/user_projects/domains/i6000/bin/nohup.out");
	   		   //设置InputStream 输入模式,设置ssh的方式
	   		 InputStream is =new StreamGobbler(ssh.getStdout());
	   		  //通过buffereadReader 来接收inputStreamReader 为utf-8 的所有信息。is为当前
	   		 BufferedReader brs=new BufferedReader(new InputStreamReader(is,"UTF-8"));
	   		sb =new StringBuilder();
	   		 while(true){//循环读取信息。
	   			 line=brs.readLine();
	   		    
	   			if(line==null){
	   				 break;
	   			 }
	   			sb.append(line+"<br>");//追加显示
	   			
	   			 //System.out.println(strs.size());
	   			 System.out.println(line+"<br/>");//打印处读取的出的行信息
	   		 }
	   			
	   	 }
	   	 ssh.close();//关闭session会话连接
	   	 conn.close();//关闭conn连接
	   	str="缓存清理完毕,请查看<br>"+sb;
	    }catch(IOException e){
	    	str="命令执行失败!!!";
	   	 System.out.println(e.toString());
	   	 e.printStackTrace();
	    }
	    return str;
	    
	}

以上代码块,作为测试是没问题,但是对于企业来说,以上代码还是相对过于臃肿的不可复用的,具体优化如下:

1.需要将用户名、密码、Ip,端口等变化较多的代码,进行单独存放,以便于管理和修改。

java ssh执行命令 java操作ssh_ssh_02

java ssh执行命令 java操作ssh_运维_03

2.通过代码块进行读取userinfoX.properties中的信息

String[] ps=new String[4];//设置大小为4的String数组,用于存放从userinfox.properties中的数据
		ResourceBundle resourced=ResourceBundle.getBundle("userinfoX");//读取文件数据
		Enumeration<String> allkey=resourced.getKeys();//将数据集中的keys进行提取
		while(allkey.hasMoreElements()){//通过循环keys的内容循环出vlue值
			String key=allkey.nextElement();
			String value=resourced.getString(key);
			if("username"==key||"username".equals(key)){
				ps[0]=value;
			}else if("pwd"==key||"pwd".equals(key)){
				ps[1]=value;
				
			}else if ("portNew"==key||"portNew".equals(key)){
				ps[2]=value;
			}else if ("ipnew"==key||"ipnew".equals(key)){
				ps[3]=value;
			}
			
			System.out.println(key+"---"+value);
	        
   }
		 for (int i = 0; i < ps.length; i++) {
			System.out.println(ps[i]);//打印出值
		}

3.获取到相关的配置后,开始优化ssh连接代码

(1)优化执行命令

public String getCmd(){
		SizeTool st=new  SizeTool();
	    Userinfo u=st.SizFinfo();
	    List<DosM> dms=u.getDms();
	    String strcmd="";
		 for (int i=0;i<dms.size();i++) {
		    	DosM dox=dms.get(i);
				if(dox.getXuL().equals(cmdx)||cmdx==dox.getXuL()){
					System.out.println(cmdx+"--cmdx");
					strcmd=dox.getStrcmd();
					
				}
			}
		 
		
		 return strcmd;
	}

(2)优化ssh连接命令

ReadProties p=new  ReadProties();
			String[] os=p.getNew();
			String hostname=os[3];
		    String username=os[0];
		    String password=os[1];
	    Connection conn=new Connection(hostname,Integer.parseInt(os[2]));
	    Session ssh=null;
	   
	    try{
	   	 conn.connect();
	   	 boolean isconn=conn.authenticateWithPassword(username, password);
	   	 
	   	 if(!isconn){
	   		 System.out.println("服务器登陆失败!!!!");
	   	 }else{
	   		 
	   		 System.out.println("登陆成功!!");
	   		 ssh=conn.openSession();
	   	   
	   		 ssh.execCommand(strcmd);
	   		
	   		 InputStream is =new StreamGobbler(ssh.getStdout());

三、注意点

   (1)开启session、connect的后,在最后一点要close掉,如果不进行此操作,会导致服务器会话连接数不停增大,导致服务器连接数达到最大设置限制后,其他服务将无法连接服务器。

   (2) BufferedReader brs=new BufferedReader(new InputStreamReader(is,"UTF-8")); 必须设置UTF-8,这个根据服务器的配置决定,可以在服务器上执行echo $LANG命令查询

   (3)代码执行顺序,先创建conn连接,再进行session会话连接,关闭时,先关闭session 再关闭conn。