<强> java通过ssh连接服务器执行shell命令详解强>
<强> java通过ssh连接服务器执行shell命令强>:JSch是SSH2的一个纯java实现。它允许你连接到一个sshd服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的程序中,同时该项目也提供一个J2ME版本用来在手机上直连sshd服务器。
SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议. SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接. SSH提供两种的安全验证方式:基于密码的认证和基于密匙的认证。其中,基于密码的认证比较简单,只要知道远程主机的用户名和密码,就可以进行登录。基于密匙的认证比较麻烦,而且连接比较耗时,这里不详细介绍。
有很多基于SSH协议的客户端,例如:腻子,OpenSSH, Xshell 4等,可以远程连接几乎所有UNIX平台,同时,可以通过Linux命令行SSH uername@host连接到某主机。
在项目中,如何利用代码实现SSH,远程执行Shell脚本呢? JSch是Java安全通道的缩写,是一个SSH2功能的纯Java实现,具体信息可以参考JSch官网。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,同时你也可以集成它的功能到你自己的应用程序。在使用前,需要下载并导入JSch包:jsch-0.1.50.jar。
示例程序
包com.stormma.demo; 进口java.io.BufferedReader; 进口java.io.InputStreamReader; 进口java.util.ArrayList; 进口com.jcraft.jsch.Channel; 进口com.jcraft.jsch.ChannelExec; 进口com.jcraft.jsch.JSch; 进口com.jcraft.jsch.JSchException; 进口com.jcraft.jsch.Session; 公共类壳{//远程主机的ip地址 私人字符串ip;//远程主机登录用户名 私人字符串的用户名;//远程主机的登录密码 私人密码字符串;//设置ssh连接的远程端口 公共静态最终int DEFAULT_SSH_PORT=22;//保存输出内容的容器 私人ArrayList标准输出;/* * *初始化登录信息 * @param ip * @param用户名 * @param密码 */公共Shell(最终字符串ip,最终字符串的用户名,最终字符串密码){ 这一点。ip=ip; 这一点。用户名=用户名; 这一点。密码=密码; stdout=new ArrayList (); }/* * *执行shell命令 * @param命令 * @return */公共int(最终字符串执行命令){ int returnCode=0; JSch JSch=new JSch (); MyUserInfo用户信息=new MyUserInfo (); 尝试{//创建会话并且打开连接,因为创建会议之后要主动打开连接 会话=jsch会话。getSession(用户名、ip DEFAULT_SSH_PORT); session.setPassword(密码); session.setUserInfo(用户信息); session.connect ();//打开通道,设置通道类型,和执行的命令 频道频道=session.openChannel(“执行”); ChannelExec ChannelExec=(ChannelExec)通道; channelExec.setCommand(命令); channelExec.setInputStream(空); BufferedReader输入=new BufferedReader(新InputStreamReader (channelExec.getInputStream ())); channelExec.connect (); system . out。println(“远程命令是:”+命令);//接收远程服务器执行命令的结果 字符串行; 在((=input.readLine行())!=null) { stdout.add(线); } input.close ();//得到returnCode 如果(channelExec.isClosed ()) { returnCode=channelExec.getExitStatus (); }//关闭通道 channelExec.disconnect ();//关闭会话 session.disconnect (); }捕捉(JSchException e) {//TODO自动生成的catch块 e.printStackTrace (); }捕捉(异常e) { e.printStackTrace (); } 返回returnCode; }/* * *把stdout * @return */公共ArrayList getStandardOutput () { 返回标准输出; } 最后公共静态void main (String [] args) { 壳壳=新的Shell (“xxx.xxx.xxx。xxx”、“用户名”、“密码”); 壳。执行(“uname - s - r - v”); ArrayList stdout=shell.getStandardOutput (); (字符串str: stdout) { System.out.println (str); } } } >之前 MyUserInfo
包com.stormma.demo; 进口com.jcraft.jsch.UserInfo; 公共类MyUserInfo实现用户信息{ @Override 公共字符串getPassphrase () {//TODO自动生成方法存根 System.out.println (“MyUserInfo.getPassphrase () "); 返回null; } @Override 公共字符串getPassword () {//TODO自动生成方法存根 System.out.println (“MyUserInfo.getPassword () "); 返回null; } @Override 公共布尔promptPassphrase(字符串arg0) {//TODO自动生成方法存根 System.out.println (“MyUserInfo.promptPassphrase () "); System.out.println (arg0); 返回错误; } @Override 公共布尔promptPassword(字符串arg0) {//TODO自动生成方法存根 System.out.println (“MyUserInfo.promptPassword () "); System.out.println (arg0); 返回错误; } @Override 公共布尔promptYesNo(字符串arg0) {//TODO自动生成方法存根的 System.out.println (“MyUserInfo.promptYesNo () "); System.out.println (arg0); 如果(arg0)。包含(“宿主”的真实性)){ 返回true; } 返回true; } @Override 公共空间showMessage(字符串arg0) {//TODO自动生成方法存根 System.out.println (“MyUserInfo.showMessage () "); } }java通过ssh连接服务器执行shell命令详解及实例