先看看telnet 和ssh的定义:html
Telnet协议是TCP/IP协议中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工做的能力。在终端使用者的电脑上使用telnet程序,用它链接到服务器。终端使用者能够在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入同样。能够在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登陆服务器。Telnet是经常使用的远程控制Web服务器的方法。java
SSH是一个用来替代TELNET、FTP以及R命令的工具包,主要是想解决口令在网上明文传输的问题。为了系统安全和用户自身的权益,推广SSH是必要的。 SSH是英文Secure Shell的简写形式。经过使用SSH,你能够把全部传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,并且也可以防止DNS欺骗和IP欺骗。linux
实际上,telnet和ssh的功能基本相同,都是实现远程登录的网络协议。shell
和其余多数协议同样, Java 中telnet ssh的实现也要通过三部曲:创建链接、使用链接 和释放链接 。ssh是用以替换telnet 的一种协议,在java 编程中 ,ssh和telnet 的不一样仅仅表如今创建链接和释放链接中。apache
使用链接的过程,其实就是发送命令和远程服务器交互的过程,原理也很简单:每向服务器发送一条命令,就等待服务器执行此命令后返回的字符流,暂且把它叫作一次交互。咱们以在规定时间内接收这些字符流,若是这些字符流中出现了“命令提示符”,说明服务器处于等待状态,咱们就认为这次交互完成,不然,这次交互失败,出现异常。编程
linux服务器上的命令提示符很少,登录命令提示符就更有限了,通常就包括 用户名提示符、密码提示符 和登录成功提示符(也叫命令提示符)这三类,不一样linux的用户命令提示符、密码提示符也会稍有不一样。安全
下面简单写一个程序作telnet的测试,此程序仅做测试,因此不少写法并不规范。服务器
注意: linux默认是使用SSH服务的 而不安装telnet服务,若是要使用telnet 就必须先安装相应的软件包,即便安装了软件包 默认的设置telnet 服务也是不运行的 须要手工进行设置。网络
参考:http://www.2cto.com/os/201208/146747.htmlsession
(1)所需包:commons-net-2.2.jar
(2)代码以下:
ssh 的实现和和 telnet 大同小异,差异在于创建链接和释放链接:
(1)须要包:jsch-0.1.42.jar
(2) 关键代码以下:
[java] view plain copy
其中 defaultUserInfo 是实现了UserInfo的一个类对象:
[java] view plain copy
先看看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)代码以下:
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秒
/**
* 创建telnet链接
* @param hostIp 服务器Ip
* @param port 端口号 telnet 默认端口号为23
* @param userName 登录帐号
* @param password 登录密码
* @throws IOException
* @throws SocketException
*/
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<timeout){
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<timeout){
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) 关键代码以下:
/**
* 创建链接
* @param hostIp 服务器Ip
* @param port ssh端口号 默认为 22
* @param userName
* @param password
*/
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的一个类对象:
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) { } }