通过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包

猜你喜欢

转载自bhdweb.iteye.com/blog/1677619