读书人

经过Ssh协议连接到服务器执行执行的指

发布时间: 2012-11-16 14:12:14 作者: rapoo

通过Ssh协议连接到服务器执行执行的指令

用j2ssh-core-0.2.9.jar连接远程主机时,第一次会需要用户输入Yes\No\Always来是否接受主机公匙,如果程序在后台运行,无法与用户交互,所以需要ConsoleKnownHostsKeyVerification类,然后在连接时使用SshClient.connect(String hostname, int port,

HostKeyVerification hosts),hosts参数使用此类的对象。

?

下面是ConsoleKnownHostsKeyVerification类的代码

?

package test;import java.io.File;import java.io.IOException;import com.sshtools.j2ssh.transport.AbstractKnownHostsKeyVerification;import com.sshtools.j2ssh.transport.InvalidHostFileException;import com.sshtools.j2ssh.transport.publickey.SshPublicKey;public class ConsoleKnownHostsKeyVerification extends        AbstractKnownHostsKeyVerification {    public ConsoleKnownHostsKeyVerification() throws InvalidHostFileException {        super(new File(System.getProperty("user.home"), ".ssh" + File.separator                + "known_hosts").getAbsolutePath());    }    public ConsoleKnownHostsKeyVerification(String knownhosts)            throws InvalidHostFileException {        super(knownhosts);    }    public void onHostKeyMismatch(String host, SshPublicKey pk,            SshPublicKey actual) {        try {            System.out.println("The host key supplied by " + host + " is: "                    + actual.getFingerprint());            System.out.println("The current allowed key for " + host + " is: "                    + pk.getFingerprint());            getResponse(host, pk);        } catch (Exception e) {            e.printStackTrace();        }    }    public void onUnknownHost(String host, SshPublicKey pk) {        try {            System.out.println("The host " + host                    + " is currently unknown to the system");            System.out.println("The host key fingerprint is: "                    + pk.getFingerprint());            getResponse(host, pk);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 获取用户输入的信息,判断是否接受主机公匙     * <p>     * 修改:xxx ,去掉从流中获取信息,直接接受公匙,注释掉的代码为源码     *      * @param host     *            主机ip     * @param pk     *            主机公匙     * @throws InvalidHostFileException     * @throws IOException     */    private void getResponse(String host, SshPublicKey pk)            throws InvalidHostFileException, IOException {        if (isHostFileWriteable()) {            allowHost(host, pk, true);        }    }}
?

?

测试代码如下,主要是测试了下载文件,和最常用的日志查询的命令

?

?

package test;import java.io.BufferedReader;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.List;import com.sshtools.j2ssh.SftpClient;import com.sshtools.j2ssh.SshClient;import com.sshtools.j2ssh.authentication.AuthenticationProtocolState;import com.sshtools.j2ssh.authentication.PasswordAuthenticationClient;import com.sshtools.j2ssh.connection.ChannelOutputStream;import com.sshtools.j2ssh.session.SessionChannelClient;import com.sshtools.j2ssh.sftp.FileAttributes;import com.sshtools.j2ssh.sftp.SftpFile;public class TestSsh {@SuppressWarnings("unchecked")public static void main(String[] args) { SshClient client = new SshClient();          try {          ConsoleKnownHostsKeyVerification console = new ConsoleKnownHostsKeyVerification();            client.connect("172.16.20.133", 22,console);//IP和端口              //设置用户名和密码              PasswordAuthenticationClient pwd = new PasswordAuthenticationClient();              pwd.setUsername("root");              pwd.setPassword("111111");              int result = client.authenticate(pwd);              if (result == AuthenticationProtocolState.COMPLETE) {//如果连接完成              SftpClient sftp = client.openSftpClient();                List<SftpFile> list = sftp.ls("./Desktop/hehe");                  for (SftpFile f : list) {                //下载文件                /* FileOutputStream fos = new FileOutputStream(new File("c:/1.txt"));                 FileAttributes fa =sftp.get(f.getAbsolutePath(),fos);                 fos.write(fa.toByteArray());                 fos.close();*/                                //取日志(取2012-09-12 删除用户  的日志)                if(f.getFilename().endsWith(".out")||f.getFilename().endsWith(".log")){                SessionChannelClient session = client.openSessionChannel();                         if (session.startShell()){                         ChannelOutputStream writer = session.getOutputStream();                               writer.write("grep -E '2012-09-12  删除用户'\n".getBytes());                               writer.flush();                               writer.write("exit\n".getBytes());                               writer.flush();   BufferedReader in = new BufferedReader(new InputStreamReader(session.getInputStream()));   BufferedReader err= new BufferedReader(new InputStreamReader(session.getStderrInputStream()));                               String line;                               while ((line = in.readLine()) != null){                                   System.out.println(line);                               }                               System.out.println("------------------------");                               while ((line = err.readLine()) != null){                                   System.out.println(line);                               }                           }                }                }              }          } catch (IOException e) {              e.printStackTrace();          }  }}

?

附件是jar包

?

?

?

读书人网 >软件架构设计

热点推荐