一、思路
(1)作为java的web后台应用,在做ssh连接的时候,比如导入所需要的协议jar包,如ssh.jar,本次测试,本人使用的是
。
(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,端口等变化较多的代码,进行单独存放,以便于管理和修改。
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。