java telnet 代码实现_转载: java telnet ssh 实现

先看看telnet 和ssh的定义:

Telnet协议是TCP/IP协议中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。

SSH是一个用来替代TELNET、FTP以及R命令的工具包,主要是想解决口令在网上明文传输的问题。为了系统安全和用户自身的权益,推广SSH是必要的。SSH是英文SecureShell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。

实际上,telnet和ssh的功能基本相同,都是实现远程登陆的网络协议。

和其他多数协议一样, java 中telnetssh的实现也要经过三部曲:建立连接、使用连接 和释放连接 。ssh是用以替换telnet 的一种协议,在java编程中 ,ssh和telnet 的不同仅仅表现在建立连接和释放连接中。

使用连接的过程,其实就是发送命令和远程服务器交互的过程,原理也很简单:每向服务器发送一条命令,就等待服务器执行此命令后返回的字符流,暂且把它叫做一次交互。我们以在规定时间内接收这些字符流,如果这些字符流中出现了“命令提示符”,说明服务器处于等待状态,我们就认为此次交互完成,否则,此次交互失败,出现异常。

linux服务器上的命令提示符不多,登陆命令提示符就更有限了,一般就包括 用户名提示符、密码提示符和登陆成功提示符(也叫命令提示符)这三类,不同linux的用户命令提示符、密码提示符也会稍有不同。

下面简单写一个程序做telnet的测试,此程序仅作测试,所以很多写法并不规范。

(1)所需包:commons-net-2.2.jar

(2)代码如下:

packagetelnet;

importjava.io.IOException;

importjava.io.InputStream;

importjava.io.OutputStream;

importjava.net.SocketException;

importjava.util.regex.Pattern;

importorg.apache.commons.net.telnet.TelnetClient;

publicclassTelnet {

privateTelnetClient telnetClient;

privateInputStream inputStream;

privateOutputStream outputStream;

privatelongtimeout=30000;//默认超时为30秒

publicvoidconnect(String hostIp,intport,String userName,String password)throwsSocketException, IOException{

telnetClient=newTelnetClient();

telnetClient.connect(hostIp, port);

inputStream=telnetClient.getInputStream(); //接收服务器消息的输入流

outputStream=telnetClient.getOutputStream();     //发送消息到服务器的输出流

//连接完毕,服务器就等待客户发送 用户名,然后是密码

if(sendLoginInfo(userName,".*PASSWORD:")){//假如发送完用户名后得到的提示符是密码提示符

sendLoginInfo(password, "//]//$"); //假如发送密码信息后得到的提示符是命令提示符

}

}

privatebooleansendLoginInfo(String info,String regext){

Pattern pattern=Pattern.compile(regext);

try{

outputStream.write((info+"/n").getBytes());

outputStream.flush();

inti=-1;

StringBuilder sb=newStringBuilder();

longstartTime=System.currentTimeMillis();

while(System.currentTimeMillis()-startTime

while( (i=(char) inputStream.read())>-1){

if(i==-1){

thrownewIllegalArgumentException("接收不到消息");

}

charch=(char)i;

if(ch=='/n'||ch=='/r'){//命令提示符是最后在一行的

sb.delete(0, sb.length());

continue;

}

sb.append((char)ch);

if(pattern.matcher(sb.toString()).find()){

returntrue;

}

}

}

thrownewIllegalArgumentException("超时收不到提示符");

} catch(IOException e) {

close();

returnfalse;

}

}

publicString   send(String cmd){

if(null==telnetClient||null==inputStream||null==outputStream){

thrownewIllegalArgumentException("请先 建立连接 或建立连接失败");

}

Pattern pattern=Pattern.compile("//]//$");//假如命令提示符为 /$

StringBuilder text=newStringBuilder();

try{

outputStream.write((cmd+"/n").getBytes());

outputStream.flush();

StringBuilder sb=newStringBuilder();

longstartTime=System.currentTimeMillis();

inti=-1;

while(System.currentTimeMillis()-startTime

while( (i=inputStream.read())>-1){

if(i==-1){

thrownewIllegalArgumentException("接收不到消息");

}

charch=(char)i;

text.append(ch);

if(ch=='/n'||ch=='/r'){

sb.delete(0, sb.length());

continue;

}

sb.append(ch);

if(pattern.matcher(sb.toString()).find()){//返回字符流中找到了命令提示符

returntext.toString();

}

}

}

thrownewIllegalArgumentException("超时收不到提示符");

} catch(IOException e) {

close();

returnnull;

}

}

publicvoidclose(){

if(null!=null){

try{

telnetClient.disconnect();

} catch(IOException e) {

e.printStackTrace();

}

}

}

publicstaticvoidmain(String[] args)throwsSocketException, IOException {

Telnet telnet=newTelnet();

telnet.connect("ip",23,"username","passowrd");

System.out.println(telnet.send("ls"));

telnet.close();

}

}

ssh 的实现和和 telnet 大同小异,差别在于建立连接和释放连接:

(1)需要包:jsch-0.1.42.jar

(2) 关键代码如下:

publicvoidconnect(String hostIp,intport,String userName,String password){

try{

session=jsch.getSession(userName,hostIp,port );

session.setPassword(password);

session.setUserInfo(defaultUserInfo);

session.connect();

channel=session.openChannel("shell");

inputStream=channel.getInputStream();

outputStream=channel.getOutputStream();

} catch(JSchException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}catch(IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//关闭连接

publicvoidclose(){

if(null!=channel){

channel.disconnect();

}

if(null!=session){

session.disconnect();

}

}

其中 defaultUserInfo是实现了UserInfo的一个类对象:

UserInfo defaultUserInfo =newUserInfo() {

publicString getPassphrase() {

returnnull;

}

publicString getPassword() {

returnnull;

}

publicbooleanpromptPassword(String arg0) {

returnfalse;

}

publicbooleanpromptPassphrase(String arg0) {

returnfalse;

}

publicbooleanpromptYesNo(String arg0) {

returntrue;

}

publicvoidshowMessage(String arg0) {

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值