转载: java teln…
2017-09-15 11:26
429 查看
原文地址:转载: java telnet ssh 实现作者:荒岛码农原文:http://blog.csdn.net/Code_cj/article/details/6411682
2011-05-11
13:17 911人阅读 评论(1) 收藏 举报
先看看telnet 和ssh的定义:
Telnet协议是TCP/IP协议中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
SSH是一个用来替代TELNET、FTP以及R命令的工具包,主要是想解决口令在网上明文传输的问题。为了系统安全和用户自身的权益,推广SSH是必要的。
SSH是英文Secure
Shell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。
实际上,telnet和ssh的功能基本相同,都是实现远程登陆的网络协议。
和其他多数协议一样, java 中telnet
ssh的实现也要经过三部曲:建立连接、使用连接 和释放连接 。ssh是用以替换telnet 的一种协议,在java
编程中 ,ssh和telnet 的不同仅仅表现在建立连接和释放连接中。
使用连接的过程,其实就是发送命令和远程服务器交互的过程,原理也很简单:每向服务器发送一条命令,就等待服务器执行此命令后返回的字符流,暂且把它叫做一次交互。我们以在规定时间内接收这些字符流,如果这些字符流中出现了“命令提示符”,说明服务器处于等待状态,我们就认为此次交互完成,否则,此次交互失败,出现异常。
linux服务器上的命令提示符不多,登陆命令提示符就更有限了,一般就包括 用户名提示符、密码提示符
和登陆成功提示符(也叫命令提示符)这三类,不同linux的用户命令提示符、密码提示符也会稍有不同。
下面简单写一个程序做telnet的测试,此程序仅作测试,所以很多写法并不规范。
(1)所需包:commons-net-2.2.jar
(2)代码如下:
[java][/b] view
plaincopy
package telnet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.regex.Pattern;
import org.apache.commons.net.telnet.TelnetClient;
public class Telnet {
private TelnetClient telnetClient;
private InputStream inputStream;
private OutputStream outputStream;
private long timeout=30000;//默认超时为30秒
public void connect(String hostIp,int port,String userName,String password) throws SocketException, IOException{
telnetClient=new TelnetClient();
telnetClient.connect(hostIp, port);
inputStream=telnetClient.getInputStream(); //接收服务器消息的输入流
outputStream=telnetClient.getOutputStream(); //发送消息到服务器的输出流
//连接完毕,服务器就等待客户发送 用户名,然后是密码
if(sendLoginInfo(userName,".*PASSWORD:")){//假如发送完用户名后得到的提示符是密码提示符
sendLoginInfo(password, "//]//$"); //假如发送密码信息后得到的提示符是命令提示符
}
}
private boolean sendLoginInfo(String info,String regext){
Pattern pattern=Pattern.compile(regext);
try {
outputStream.write((info+"/n").getBytes());
outputStream.flush();
int i=-1;
StringBuilder sb=new StringBuilder();
long startTime=System.currentTimeMillis();
while(System.currentTimeMillis()-startTime
while( (i=(char) inputStream.read())>-1){
if(i==-1){
throw new IllegalArgumentException("接收不到消息");
}
char ch=(char)i;
if(ch=='/n'||ch=='/r'){ //命令提示符是最后在一行的
sb.delete(0, sb.length());
continue;
}
sb.append((char)ch);
if(pattern.matcher(sb.toString()).find()){
return true;
}
}
}
throw new IllegalArgumentException("超时收不到提示符");
} catch (IOException e) {
close();
return false;
}
}
public String send(String cmd){
if(null==telnetClient||null==inputStream||null==outputStream){
throw new IllegalArgumentException("请先 建立连接 或建立连接失败");
}
Pattern pattern=Pattern.compile("//]//$");//假如命令提示符为 /$
StringBuilder text=new StringBuilder();
try {
outputStream.write((cmd+"/n").getBytes());
outputStream.flush();
StringBuilder sb=new StringBuilder();
long startTime=System.currentTimeMillis();
int i=-1;
while(System.currentTimeMillis()-startTime
while( (i=inputStream.read())>-1){
if(i==-1){
throw new IllegalArgumentException("接收不到消息");
}
char ch=(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()){//返回字符流中找到了命令提示符
return text.toString();
}
}
}
throw new IllegalArgumentException("超时收不到提示符");
} catch (IOException e) {
close();
return null;
}
}
public void close(){
if(null!=null){
try {
telnetClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws SocketException, IOException {
Telnet telnet=new Telnet();
telnet.connect("ip" , 23, "username", "passowrd");
System.out.println(telnet.send("ls"));
telnet.close();
}
}
ssh 的实现和和 telnet 大同小异,差别在于建立连接和释放连接:
(1)需要包:jsch-0.1.42.jar
(2) 关键代码如下:
[java][/b] view
plaincopy
public void connect(String hostIp,int port,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();
}
}
//关闭连接
public void close(){
if(null!=channel){
channel.disconnect();
}
if(null!=session){
session.disconnect();
}
}
其中 defaultUserInfo
是实现了UserInfo的一个类对象:
[java][/b] view
plaincopy
UserInfo defaultUserInfo = new UserInfo() {
public String getPassphrase() {
return null;
}
public String getPassword() {
return null;
}
public boolean promptPassword(String arg0) {
return false;
}
public boolean promptPassphrase(String arg0) {
return false;
}
public boolean promptYesNo(String arg0) {
return true;
}
public void showMessage(String arg0) {
}
}
java telnet ssh 实现
2011-05-1113:17 911人阅读 评论(1) 收藏 举报
先看看telnet 和ssh的定义:
Telnet协议是TCP/IP协议中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。
SSH是一个用来替代TELNET、FTP以及R命令的工具包,主要是想解决口令在网上明文传输的问题。为了系统安全和用户自身的权益,推广SSH是必要的。
SSH是英文Secure
Shell的简写形式。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。
实际上,telnet和ssh的功能基本相同,都是实现远程登陆的网络协议。
和其他多数协议一样, java 中telnet
ssh的实现也要经过三部曲:建立连接、使用连接 和释放连接 。ssh是用以替换telnet 的一种协议,在java
编程中 ,ssh和telnet 的不同仅仅表现在建立连接和释放连接中。
使用连接的过程,其实就是发送命令和远程服务器交互的过程,原理也很简单:每向服务器发送一条命令,就等待服务器执行此命令后返回的字符流,暂且把它叫做一次交互。我们以在规定时间内接收这些字符流,如果这些字符流中出现了“命令提示符”,说明服务器处于等待状态,我们就认为此次交互完成,否则,此次交互失败,出现异常。
linux服务器上的命令提示符不多,登陆命令提示符就更有限了,一般就包括 用户名提示符、密码提示符
和登陆成功提示符(也叫命令提示符)这三类,不同linux的用户命令提示符、密码提示符也会稍有不同。
下面简单写一个程序做telnet的测试,此程序仅作测试,所以很多写法并不规范。
(1)所需包:commons-net-2.2.jar
(2)代码如下:
[java][/b] view
plaincopy
package telnet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.regex.Pattern;
import org.apache.commons.net.telnet.TelnetClient;
public class Telnet {
private TelnetClient telnetClient;
private InputStream inputStream;
private OutputStream outputStream;
private long timeout=30000;//默认超时为30秒
public void connect(String hostIp,int port,String userName,String password) throws SocketException, IOException{
telnetClient=new TelnetClient();
telnetClient.connect(hostIp, port);
inputStream=telnetClient.getInputStream(); //接收服务器消息的输入流
outputStream=telnetClient.getOutputStream(); //发送消息到服务器的输出流
//连接完毕,服务器就等待客户发送 用户名,然后是密码
if(sendLoginInfo(userName,".*PASSWORD:")){//假如发送完用户名后得到的提示符是密码提示符
sendLoginInfo(password, "//]//$"); //假如发送密码信息后得到的提示符是命令提示符
}
}
private boolean sendLoginInfo(String info,String regext){
Pattern pattern=Pattern.compile(regext);
try {
outputStream.write((info+"/n").getBytes());
outputStream.flush();
int i=-1;
StringBuilder sb=new StringBuilder();
long startTime=System.currentTimeMillis();
while(System.currentTimeMillis()-startTime
while( (i=(char) inputStream.read())>-1){
if(i==-1){
throw new IllegalArgumentException("接收不到消息");
}
char ch=(char)i;
if(ch=='/n'||ch=='/r'){ //命令提示符是最后在一行的
sb.delete(0, sb.length());
continue;
}
sb.append((char)ch);
if(pattern.matcher(sb.toString()).find()){
return true;
}
}
}
throw new IllegalArgumentException("超时收不到提示符");
} catch (IOException e) {
close();
return false;
}
}
public String send(String cmd){
if(null==telnetClient||null==inputStream||null==outputStream){
throw new IllegalArgumentException("请先 建立连接 或建立连接失败");
}
Pattern pattern=Pattern.compile("//]//$");//假如命令提示符为 /$
StringBuilder text=new StringBuilder();
try {
outputStream.write((cmd+"/n").getBytes());
outputStream.flush();
StringBuilder sb=new StringBuilder();
long startTime=System.currentTimeMillis();
int i=-1;
while(System.currentTimeMillis()-startTime
while( (i=inputStream.read())>-1){
if(i==-1){
throw new IllegalArgumentException("接收不到消息");
}
char ch=(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()){//返回字符流中找到了命令提示符
return text.toString();
}
}
}
throw new IllegalArgumentException("超时收不到提示符");
} catch (IOException e) {
close();
return null;
}
}
public void close(){
if(null!=null){
try {
telnetClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws SocketException, IOException {
Telnet telnet=new Telnet();
telnet.connect("ip" , 23, "username", "passowrd");
System.out.println(telnet.send("ls"));
telnet.close();
}
}
ssh 的实现和和 telnet 大同小异,差别在于建立连接和释放连接:
(1)需要包:jsch-0.1.42.jar
(2) 关键代码如下:
[java][/b] view
plaincopy
public void connect(String hostIp,int port,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();
}
}
//关闭连接
public void close(){
if(null!=channel){
channel.disconnect();
}
if(null!=session){
session.disconnect();
}
}
其中 defaultUserInfo
是实现了UserInfo的一个类对象:
[java][/b] view
plaincopy
UserInfo defaultUserInfo = new UserInfo() {
public String getPassphrase() {
return null;
}
public String getPassword() {
return null;
}
public boolean promptPassword(String arg0) {
return false;
}
public boolean promptPassphrase(String arg0) {
return false;
}
public boolean promptYesNo(String arg0) {
return true;
}
public void showMessage(String arg0) {
}
}
相关文章推荐
- 转载:C, Erlang, Java and Go Web…
- (转载)Java Collection&nbs…
- 转载 Java爬虫框架(二)--模…
- Java 动态代理机制分析及扩展(转载…
- 【转载】java for 的几种用法
- linux 中的软件安装位置(转载)
- (转载)IplImage, CvMat,&nbsp…
- 怎样成为一个高级JAVA工程师 .
- Java Map试用方法
- java 中static的作用
- java request和response的区别
- 黑马程序员JAVA 记事本
- Java Swing 中插入图片背景
- javamail 邮件发送
- Java timer timertask用法(转)
- 从 Java 应用程序动态生…
- Windows Socket API 使用小结(转载…
- Java学习笔记27 将数字转换为中文…
- Java中文&编码问题小结(转载)
- Java字符串问题盘点(JKD6) 如…