首页 > 编程知识 正文

java连接ssh 执行命令,ssh登录并执行命令

时间:2023-05-04 17:53:03 阅读:181262 作者:1302

/* * @ authorstormma * @ date 2017-01-11 * @ describeloginlinuxserverbyssh * /生命不息!

jch是SSH2的纯Java实现。 允许连接到sshd服务器、端口传输、X11传输、文件传输等。 可以将其功能集成到自己的程序中。 该项目还提供了用于将SSHD服务直接连接到手机的J2ME版本。

SSH是secure shell的缩写,是基于APP应用层和传输层构建的安全协议。 SSH在连接和传输过程中对所有数据进行加密,可用于不同系统或服务器之间的安全连接。 SSH有两种安全认证方式:基于密码的认证和基于加密密钥的认证。 其中,基于密码的验证相对简单,知道远程主机的用户名和密码就可以登录。 用加密密钥进行认证很麻烦,连接需要时间,所以在此不详细说明。

有许多基于SSH协议的客户端,包括PuTTY、OpenSSH和Xshell 4,可以远程连接到几乎任何UNIX平台。 您还可以通过Linux命令行ssh uername@host连接到主机。

在项目中,如何利用代码实现SSH并远程运行shell脚本呢? JSch是Java安全信道的缩写,是SSH2功能的纯Java实现。 具体信息请参考JSch官方网站。 可以连接到SSH服务器,使用端口传输、X11传输、文件传输等。 它还可以将功能集成到自己的APP应用程序中。 使用之前,必须下载并导入JSch包: jsch-0.1.50.jar。

示例程序package com.stormma.demo; import java.io.BufferedReader; import Java.io.input streamreader; import java.util.ArrayList; import com.jcraft.jsch.Channel; import com.j craft.jsch.channel exec; import com.jcraft.jsch.JSch; import com.j craft.jsch.jschexception; import com.jcraft.jsch.Session; 公共类shell//远程主机的ip地址private String ip; //远程主机的登录用户名private String username; //远程主机登录密码私有字符串密码; 为//ssh连接设置远程端口publicstaticfinalintdefault _ ssh _ port=22; //保存输出内容的容器专用阵列字符串输出; /**初始化注册信息* @ paramip * @ param username * @ param password */publicshell (finalstringip,final String username,finalstinals this.password=password; stdout=new ArrayListString (; }/* * * shell命令* @ param command * @ return */public int execute (finalstringcommand ) { int returnCode=0; JSch jsch=new JSch (; myuserinfouserinfo=newmyuserinfo (; 创建try{//session并打开连接。 创建session后,连接session session=jsch.getsession (username,ip,DEFAULT_SSH_PORT ); session.setpassword(password; session.setuserinfo () userinfo; session.connect (; //用于打开通道、设置和执行通道类型的命令channel channel=session.open channel (' exec ); hannelexecChannelexec=(channel exec ) channel; Channelexec.setcommand(command; channel exec.set inputstream (null ); 缓冲

Reader input = new BufferedReader(new InputStreamReader (channelExec.getInputStream())); channelExec.connect(); System.out.println("The remote command is :" + command); //接收远程服务器执行命令的结果 String line; while ((line = input.readLine()) != null) { stdout.add(line); } input.close(); // 得到returnCode if (channelExec.isClosed()) { returnCode = channelExec.getExitStatus(); } // 关闭通道 channelExec.disconnect(); //关闭session session.disconnect(); } catch (JSchException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return returnCode; } /** * get stdout * @return */ public ArrayList<String> getStandardOutput() { return stdout; } public static void main(final String [] args) { Shell shell = new Shell("xxx.xxx.xxx.xxx", "username", "password"); shell.execute("uname -s -r -v"); ArrayList<String> stdout = shell.getStandardOutput(); for (String str : stdout) { System.out.println(str); } } }

MyUserInfo

package com.stormma.demo;import com.jcraft.jsch.UserInfo;public class MyUserInfo implements UserInfo { @Override public String getPassphrase() { // TODO Auto-generated method stub System.out.println("MyUserInfo.getPassphrase()"); return null; } @Override public String getPassword() { // TODO Auto-generated method stub System.out.println("MyUserInfo.getPassword()"); return null; } @Override public boolean promptPassphrase(String arg0) { // TODO Auto-generated method stub System.out.println("MyUserInfo.promptPassphrase()"); System.out.println(arg0); return false; } @Override public boolean promptPassword(String arg0) { // TODO Auto-generated method stub System.out.println("MyUserInfo.promptPassword()"); System.out.println(arg0); return false; } @Override public boolean promptYesNo(String arg0) { // TODO Auto-generated method stub' System.out.println("MyUserInfo.promptYesNo()"); System.out.println(arg0); if (arg0.contains("The authenticity of host")) { return true; } return true; } @Override public void showMessage(String arg0) { // TODO Auto-generated method stub System.out.println("MyUserInfo.showMessage()"); }}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。