[置顶] java SSH1/SSH2远程连接实例
看到网上有很多通过telnet实现远程登录的例子,就是找不到关于ssh远程登录的例子,ssh2的可能会有一些,但是目前开发项目遇到了比较底层的东西,这个需要通过ssh1连接的,于是就有了这个实例。
今天要给大家带来的就是 java通过ssh1/ssh2远程连接服务器的实例,实例用到了一个jar包,名称是mindterm,下载地址http://tech.cryptzone.com/mindterm/mindterm.html
废话不多说,看代码...
SshRequestHandler.java
package examples; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.security.SecureRandom; import org.apache.log4j.Logger; import com.mindbright.nio.NetworkConnection; import com.mindbright.ssh.SSHConsoleClient; import com.mindbright.ssh2.SSH2ConsoleRemote; import com.mindbright.ssh2.SSH2SimpleClient; import com.mindbright.ssh2.SSH2Transport; import com.mindbright.util.RandomSeed; import com.mindbright.util.SecureRandomAndPad; public class SshRequestHandler { public static final Logger logger = Logger.getLogger(SshRequestHandler.class); //SSH1变量 public SSHConsoleClient client_ssh1=null; //SSH2变量 public SSH2ConsoleRemote client_ssh2=null; //通用变量 private String version=null;//SSH1/SSH2:1/2 public static boolean echo = false; ///////////////////////////////////// public boolean isEcho() { return echo; } public void setEcho(boolean echo) { SshRequestHandler.echo = echo; } public boolean login(String server, int port, String user, String password,String version){ try { this.version=version; if (version.equals("ssh1")) { SSH1_imp ssh_imp=new SSH1_imp(server, String.valueOf(port), user, password); client_ssh1 = new SSHConsoleClient(ssh_imp.getSrvHost(), ssh_imp.getSrvPort(),ssh_imp,ssh_imp); if(client_ssh1.shell()) { echo=true; logger.debug("ssh1登录成功"); return true; } else { echo=false; return false; } } else { SSH2Transport transport = new SSH2Transport(NetworkConnection.open(server, port),createSecureRandom()); SSH2SimpleClient Ssh2 = new SSH2SimpleClient(transport,user, password); client_ssh2 = new SSH2ConsoleRemote(Ssh2.getConnection()); if(client_ssh2.shell()) { echo=true; logger.debug("SSH2登录成功"); return true; } else { echo=true; return false; } } } catch (Exception e) { logger.error("登录失败:"+e.getMessage()); echo=false; return false; } } private SecureRandomAndPad createSecureRandom() { byte[] seed; File devRandom = new File("/dev/urandom"); if (devRandom.exists()) { RandomSeed rs = new RandomSeed("/dev/urandom", "/dev/urandom"); seed = rs.getBytesBlocking(20); } else { seed = RandomSeed.getSystemStateHash(); } return new SecureRandomAndPad(new SecureRandom(seed)); } public InputStream exeCommend(String cmd) { try { if(version.equals("ssh1")) { OutputStream os = client_ssh1.getStdIn(); os.write((cmd).getBytes()); os.flush(); Thread.sleep(2000); return client_ssh1.getStdOut(); } else { OutputStream os = client_ssh2.getStdIn(); os.write((cmd).getBytes()); os.flush(); Thread.sleep(1000); return client_ssh2.getStdOut(); } } catch (Exception e) { logger.error(e.getMessage()); return null; } } public static String getString(InputStream in) throws Exception { String returnString=""; while (true) { int count = in.available(); if (count > 0) { byte[] tmp = new byte[count]; in.read(tmp); String temp=new String(tmp); returnString+=temp; } if(returnString!=null&&returnString.length()>=0) { return returnString; } } } public static boolean getConnectioned() { return echo; } public void disconnect() { try { if(version.equals("ssh1")) { client_ssh1.close(); echo=false; } else { client_ssh2.close(); echo=false; } logger.debug("断开SSH连接!"); } catch (Exception e) { logger.error(e.getMessage()); } } }
******************************************************************************************************************
SSH1_imp.java
package examples; import java.io.File; import java.io.IOException; import java.security.interfaces.RSAPublicKey; import java.util.Properties; import com.mindbright.nio.NetworkConnection; import com.mindbright.ssh.SSH; import com.mindbright.ssh.SSHAuthenticator; import com.mindbright.ssh.SSHClientUser; import com.mindbright.ssh.SSHInteractor; import com.mindbright.ssh.SSHInteractorAdapter; import com.mindbright.ssh.SSHRSAKeyFile; public class SSH1_imp extends SSHInteractorAdapter implements SSHAuthenticator, SSHClientUser{ private Properties props = new Properties(); SSH1_imp(String server,String port,String user,String password) { props.put("server", server); props.put("port", port); props.put("username", user); props.put("password", password); props.put("auth-method", "password"); } public int getAliveInterval() { return 0; } public int getCompressionLevel() { return 0; } public int getConnectTimeout() { return 60; } public String getDisplay() { return null; } public int getHelloTimeout() { return 60; } public SSHInteractor getInteractor() { return this; } public int getKexTimeout() { return 180; } public int getMaxPacketSz() { return 0; } public NetworkConnection getProxyConnection() throws IOException { return null; } public String getSrvHost() throws IOException { return getProp("server"); } private String getProp(String key) { return (String)props.get(key); } public int getSrvPort() { return Integer.parseInt(getProp("port")); } public boolean wantPTY() { return false; } public boolean wantX11Forward() { return false; } public int[] getAuthTypes(SSHClientUser arg0) { return SSH.getAuthTypes(getProp("auth-method")); } public String getChallengeResponse(SSHClientUser arg0, String arg1) throws IOException { return null; } public int getCipher(SSHClientUser arg0) { return SSH.CIPHER_3DES; } public SSHRSAKeyFile getIdentityFile(SSHClientUser arg0) throws IOException { String idfile = System.getProperty("user.home") + File.separatorChar + ".ssh" + File.separatorChar + "identity"; return new SSHRSAKeyFile(idfile); } public String getIdentityPassword(SSHClientUser arg0) throws IOException { return null; } public String getPassword(SSHClientUser arg0) throws IOException { return getProp("password"); } public String getUsername(SSHClientUser arg0) throws IOException { return getProp("username"); } public boolean verifyKnownHosts(RSAPublicKey arg0) throws IOException { return true; } }
****************************************************************************************************************************
ConfigReadUtil.javapackage examples; import java.io.File; import java.io.FileInputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.Properties; import org.apache.log4j.Logger; /** * 动态读取配置文件类 * * @author liubing */ public class ConfigReadUtil { private static Logger log = Logger.getLogger(ConfigReadUtil.class); /** * 属性文件全名 */ private static final String PFILE = "config.properties"; /** * 配置文件路径 */ //private URI uri = null; /** * 属性文件所对应的属性对象变量 */ private long m_lastModifiedTime = 0; /** * 对应于属性文件的文件对象变量 */ private File m_file = null; /** * 属性文件所对应的属性对象变量 */ private Properties m_props = null; /** * 唯一实例 */ private static ConfigReadUtil m_instance = new ConfigReadUtil(); /** * 私有构造函数 * * @throws URISyntaxException */ private ConfigReadUtil() { try { m_lastModifiedTime = getFile().lastModified(); if (m_lastModifiedTime == 0) { log.info(PFILE + "file does not exist!"); } m_props = new Properties(); m_props.load(new FileInputStream(getFile())); } catch (URISyntaxException e) { System.err.println("文件路径不正确"); e.printStackTrace(); } catch (Exception e) { System.err.println("文件读取异常"); e.printStackTrace(); } } /** * 查找ClassPath路径获取文件 * * @return File对象 * @throws URISyntaxException */ private File getFile() throws URISyntaxException { URI fileUri = this.getClass().getClassLoader().getResource(PFILE) .toURI(); m_file = new File(fileUri); return m_file; } /** * 静态工厂方法 * * @return 返回ConfigurationRead的单一实例 */ public synchronized static ConfigReadUtil getInstance() { return m_instance; } /** * 读取一特定的属性项 */ public String getConfigItem(String name, String defaultVal) { long newTime = m_file.lastModified(); // 检查属性文件是否被修改 if (newTime == 0) { // 属性文件不存在 if (m_lastModifiedTime == 0) { System.err.println(PFILE + " file does not exist!"); } else { System.err.println(PFILE + " file was deleted!!"); } return defaultVal; } else if (newTime > m_lastModifiedTime) { m_props.clear(); try { m_props.load(new FileInputStream(getFile())); } catch (Exception e) { System.err.println("文件重新读取异常"); e.printStackTrace(); } } m_lastModifiedTime = newTime; String val = m_props.getProperty(name); if (val == null) { return defaultVal; } else { return val; } } /** * 读取一特定的属性项 * * @param name * 属性项的项名 * @return 属性项的值(如此项存在), 空(如此项不存在) */ public String getConfigItem(String name) { return getConfigItem(name, ""); } }***********************************************************************************************************TestSsh.javapackage examples; import org.apache.log4j.Logger; public class TestSsh { public static final Logger logger=Logger.getLogger(TestSsh.class); private static String server; private static int port; private static String user; private static String password; private static String version ;// "SSH1"/"SSH2" private static String cmdLine ; public static void main(String[] args){ server="127.0.0.1"; port = 22; user="administrator"; password="admin"; version="ssh2"; cmdLine="ls"; try { SshRequestHandler ssh = new SshRequestHandler(); if(ssh.login(server, port, user, password, version)) { logger.info(SshRequestHandler.getString(ssh.exeCommend(cmdLine+"\n"))); ssh.disconnect(); } else { logger.debug("登录失败"); } } catch (Exception e) { logger.error("Exception:"+e); } } }
-----------------------------------程序员 闫帆原创---------------------------------------
转载请注明原创人信息 程序员 闫帆yanfanvip