ganymed-ssh2-build250使用中遇到的问题

在java中使用工具ganymed-ssh2-build250建立于linux的SSH连接时,进行了一个鉴权操作,方法如下:

//检测默认用户名和密码是否正确
 public static boolean authenticateLogin(String ip, String username, String password) {
 
  LOGGER.debug("enter VolumeManage.authenticateLogin(String ip, String username, String password) " + "[ip] = " + ip
    + " [username] = " + username + " [password] = " + password);
 
  boolean result = false;
  Connection conn = null;
  CommunicateWithLinuxImpl com = null;
  try {
               
                conn = new Connection(ip);
                com =  new CommunicateWithLinuxImpl(ip, 22, username, password);
                com.setProtocol(Constant.CLI_SSH);
                conn.connect();
                /* Authenticate */
                boolean isAuthenticated = conn.authenticateWithPassword(username, password);
       
                if (isAuthenticated == true) {
                    result = true;
                }
           
   //com.disconnect();
  
  } catch (Exception e) {
   LOGGER.error("System error", e);
   result = false;
  } finally {
  
   if (conn != null) {
    conn.close();
   }
  
   if (com != null) {
    try {
     com.disconnect();
    } catch (CommunicationException e) {
     // TODO Auto-generated catch block
     LOGGER.error("System error", e);
    }
   }
  
  
  }
 
  LOGGER.debug("exit VolumeManage.authenticateLogin(String ip, String username, String password) " + result);
 
  return result;
  
 }

系统在linux上运行时,出现了一个bug,当ip为一个空的字符串时,boolean isAuthenticated = conn.authenticateWithPassword(username, password);

结果竟然为isAuthenticated=true, 而在windows上用空的字符串进行测试时,发现结果总是为isAuthenticated=false.

通过查看ganymed-ssh2-build250的源代码,发现该工具当传入的IP地址为空或者null时,会取得当前系统设置的loopbackIpAddress:

 private static InetAddress[] getAllByName(String host, InetAddress reqAddr)
 throws UnknownHostException {

 if (host == null || host.length() == 0) {
     InetAddress[] ret = new InetAddress[1];
     ret[0] = impl.loopbackAddress();
     return ret;
 }

默认为当前主机的地址(127.0.0.1):

public synchronized InetAddress loopbackAddress() {
        if (loopbackAddress == null) {
            byte[] loopback = {0x7f,0x00,0x00,0x01};
            loopbackAddress = new Inet4Address("localhost", loopback);
        }
        return loopbackAddress;
    }

在linux中,输入vi /etc/networks命令,可查询得到loopback地址:

default 0.0.0.0
loopback 127.0.0.0
link-local 169.254.0.0

因此linux中,鉴权取得IP是loopback address,返回总是为true;

对于在windows中为什么不能查询到loopback address,原因还不是很清楚,待进一步查看源代码

 

附:

对于回路地址,通过查询,主要用途如下:


此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。常见于如下用途。
一、作为一台路由器的管理地址
系统管理员完成网络规划之后,为了方便管理,会为每一台路由器创建一个loopback 接口,并在该接口上单独指定一个IP 地址作为管理地址,管理员会使用该地址对路由器远程登录(telnet ),该地址实际上起到了类似设备名称一类的功能。
但是通常每台路由器上存在众多接口和地址,为何不从当中随便挑选一个呢?原因如下:由于telnet 命令使用TCP 报文,会存在如下情况:路由器的某一个接口由于故障down 掉了,但是其他的接口却仍旧可以telnet ,也就是说,到达这台路由器的TCP 连接依旧存在。所以选择的telnet 地址必须是永远也不会down 掉的,而虚接口恰好满足此类要求。由于此类接口没有与对端互联互通的需求,所以为了节约地址资源,loopback 接口的地址通常指定为32 位掩码。
二、使用该接口地址作为动态路由协议OSPF 、BGP 的router id动态路由协议OSPF 、BGP 在运行过程中需要为该协议指定一个Router id ,作为此路由器的唯一标识,并要求在整个自治系统内唯一。由于router id 是一个32 位的无符号整数,这一点与IP 地址十分相像。而且IP 地址是不会出现重复现象的,所以通常将路由器的router id 指定为与该设备上的某个接口的地址相同。由于loopback 接口的IP 地址通常被视为路由器的标识,所以也就成了router id 的最佳选择。
三、使用该接口地址作为BGP 建立TCP 连接的源地址在BGP 协议中,两个运行BGP 的路由器之间建立邻居关系是通过TCP 建立连接完成的。在配置邻居时通常指定loopback 接口为建立TCP 连接的源地址(通常只用于IBGP ,原因同2.1 ,都是为了增强TCP 连接的健壮性)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值