J2ssh 를 이용한 SSH 접속 인증


Linux 공개키(Public Key) 생성

> 패스워드를 이용한 인증과 공개키를 이용한 인증 방식


import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.sshtools.j2ssh.SshClient;
import com.sshtools.j2ssh.authentication.AuthenticationProtocolState;
import com.sshtools.j2ssh.authentication.PasswordAuthenticationClient;
import com.sshtools.j2ssh.authentication.PublicKeyAuthenticationClient;
import com.sshtools.j2ssh.configuration.SshConnectionProperties;
import com.sshtools.j2ssh.session.SessionChannelClient;
import com.sshtools.j2ssh.transport.publickey.SshPrivateKey;
import com.sshtools.j2ssh.transport.publickey.SshPrivateKeyFile;

/**
 * # SSH 접속 클라이언트
 */
public class J2sshCient {
    private Log log = LogFactory.getLog(this.getClass());    
    private SshClient ssh = null;    
    private SessionChannelClient session = null;    
    private String hostPrompt = null;        
    
    /**
     * @param server
     * @param userid
     * @param pwd
     * @throws Exception
     */
    public J2sshCient(String server, String userid, String password) throws Exception{    
        PasswordAuthenticationClient auth = null;    

        try {
            if (server == null || userid == null || password == null) {
                System.out.println("Parameter is null!");
            }

            ssh = new SshClient();
            ssh.setSocketTimeout(30000);
            SshConnectionProperties properties = new SshConnectionProperties();
            properties.setHost(server);
            properties.setPort(22);
            properties.setPrefPublicKey("ssh-dss");
            // Connect to the host
            ssh.connect(properties, new AlwaysAllowingConsoleKnownHostsKeyVerification());

// # 패스워드를 이용한 인증 접속        
// ------------------------------------------------------------
//            PasswordAuthenticationClient authClient = new PasswordAuthenticationClient();
//            authClient.setUsername(userid);
//            authClient.setPassword(password);
// ------------------------------------------------------------



// # 패스워드 없이 공개키를 이용한 인증 접속        
// ------------------------------------------------------------
            // Initialize the authentication data.
            PublicKeyAuthenticationClient authClient = new PublicKeyAuthenticationClient();
            // 사용자 계정
            authClient.setUsername(userid);
            // id_rsa 파일 위치
            SshPrivateKeyFile file = SshPrivateKeyFile.parse(
                                          new File("/home/userid/.ssh/id_rsa"));
            SshPrivateKey privateKey = file.toPrivateKey(null);
            authClient.setKey( privateKey );    
// ------------------------------------------------------------
            int result = ssh.authenticate(authClient);

            if (result != AuthenticationProtocolState.COMPLETE) {
                throw new Exception("Login failed");
            }    

            // SSH 터미널 커맨드 실행용
            session = ssh.openSessionChannel();
            session.requestPseudoTerminal("vt100", 80, 25, 0, 0 , "");
            session.startShell();
        } catch (Exception e) {
            e.printStackTrace();
            log.error(e);
            throw e;
        }    
    }   

    /*    * 커맨드 실행 함수(ex : ls -l\n)    */
    public String exec(String cmd) throws Exception
    {
        StringBuffer returnValue = null;
        boolean promptReturned = false;
        byte[] buffer = null;
        OutputStream out = null;
        InputStream in = null;
        int read;
        String response = null;
        int i = 0;

        try {
            if (session == null) {
                log.error("Session is not connected!");
                throw new Exception("Session is not connected!");
            }

            out = session.getOutputStream();
            cmd = cmd+"\n"; // 행단위 명령을 위해 \n 추가
            out.write(cmd.getBytes());
            out.flush();
            in = session.getInputStream();
            buffer = new byte[255];
            returnValue = new StringBuffer(300);

            while(promptReturned == false && (read = in.read(buffer))> 0) {
                response = new String(buffer, 0, read);
                if (i == 1)
                    returnValue.append(response.toString());
                if (!StringUtils.isEmpty(response) 
                   && response.indexOf(this.hostPrompt) >= 0) {
                    ++i;
                    if (i >= 2) {
                        promptReturned = true;
                    }
                }
            }
            log.error("returnValue : " + returnValue.toString());

        } catch (Exception e) {
            e.printStackTrace();
            log.error(e);
        }
        return returnValue.toString();
    }

    public boolean isClosed() throws Exception
    {
        boolean rtn = true;
        try {

            if (session != null)
                rtn = session.isClosed();
        } catch(Exception e) {
            e.printStackTrace();
            log.error(e);
        }
        return rtn;
    }

    public boolean logout() throws Exception
    {
        boolean rtn = false;

        try {
            if (session != null) {
                session.getOutputStream().write("exit\n".getBytes());
                session.close();
            }
            if (ssh != null)
                ssh.disconnect();
            rtn = true;
        } catch(Exception e) {
            e.printStackTrace();
            log.error(e);
        }
        return rtn;
    }

    public String getHostprompt() {

        return this.hostPrompt;
    } 

    public void setHostprompt(String hostPrompt) {

        this.hostPrompt = hostPrompt;
    }

    public static void main(String[] args)     {
        try {

            J2sshCient jsclient = new J2sshCient("192.168.1.10", "userid", "password");
            jsclient.setHostprompt("> ");
            String result = jsclient.exec("ls -al");
            System.out.println("jsclient.exec :" + result);
            jsclient.logout();
            System.out.println("isClosed : " + jsclient.isClosed());
            
        } catch (Exception e) {
            System.out.println(e);
        }    
    }

}


관련 문서 :

※ 위 내용은, 여러 자료를 참고하거나 제가 주관적으로 정리한 것입니다.
   잘못된 정보나 보완이 필요한 부분을, 댓글 또는 메일로 보내주시면 많은 도움이 되겠습니다.
08 13, 2013 20:50 08 13, 2013 20:50


Trackback URL : http://develop.sunshiny.co.kr/trackback/946

Leave a comment

« Previous : 1 : ... 86 : 87 : 88 : 89 : 90 : 91 : 92 : 93 : 94 : ... 648 : Next »

Recent Posts

  1. HDFS - Python Encoding 오류 처리
  2. HP - Vertica ROS Container 관련 오류...
  3. HDFS - Hive 실행시 System Time 오류
  4. HP - Vertica 사용자 쿼리 이력 테이블...
  5. Client에서 HDFS 환경의 데이터 처리시...

Recent Comments

  1. 안녕하세요^^ 배그핵
  2. 안녕하세요^^ 도움이 되셨다니, 저... sunshiny
  3. 정말 큰 도움이 되었습니다.. 감사합... 사랑은
  4. 네, 안녕하세요. 댓글 남겨 주셔서... sunshiny
  5. 감사합니다 많은 도움 되었습니다!ㅎㅎ 프리시퀸스

Recent Trackbacks

  1. wireless communication systems wireless communication systems %M
  2. amazon fire television amazon fire television %M
  3. how to broadcast your own tv station how to broadcast your own tv station %M
  4. elapsed time clock for operating r... elapsed time clock for operating r... %M
  5. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   12 2019   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. 오라클 클럽
  4. API - Java
  5. Apache Hadoop API
  6. Apache Software Foundation
  7. HDFS 생태계 솔루션
  8. DNSBL - Spam Database Lookup
  9. Ready System
  10. Solaris Freeware
  11. Linux-Site
  12. 윈디하나의 솔라나라

Site Stats

TOTAL 2780509 HIT
TODAY 92 HIT
YESTERDAY 1360 HIT