본 글에서는 Java가 ssh를 통해 서버에 연결하여 쉘 명령을 실행하는 방법에 대한 자세한 설명과 예제 방법을 주로 소개합니다
Java가 SSH를 통해 서버에 연결하여 쉘 명령을 실행하는 방법을 자세히 소개합니다
java는 ssh를 통해 서버에 연결하여 쉘 명령을 실행합니다: JSch는 SSH2의 순수 Java 구현입니다. SSHD 서버에 연결하고, 포트 전달, X11 전달, 파일 전송 등을 사용할 수 있습니다. 해당 기능을 자신의 프로그램에 통합할 수 있습니다. 동시에 이 프로젝트는 휴대폰의 SSHD 서버에 직접 연결하기 위한 J2ME 버전도 제공합니다.
SSH는 Secure Shell의 약자로 애플리케이션 계층과 전송 계층을 기반으로 하는 보안 프로토콜입니다. SSH는 연결 및 전송 프로세스 중에 모든 데이터를 암호화하며, 서로 다른 시스템이나 서버 간에 보안 연결을 설정하는 데 사용될 수 있습니다. SSH는 비밀번호 기반 인증과 키 기반 인증이라는 두 가지 보안 인증 방법을 제공합니다. 그 중 비밀번호 기반 인증은 비교적 간단하다. 원격 호스트의 사용자 이름과 비밀번호만 알면 로그인이 가능하다. 키 기반 인증은 더 번거롭고 연결에 더 많은 시간이 소요되므로 여기서는 자세히 소개하지 않겠습니다.
거의 모든 UNIX 플랫폼에 원격으로 연결할 수 있는 PuTTY, OpenSSH, Xshell 4 등과 같은 SSH 프로토콜 기반 클라이언트가 많이 있습니다. 동시에 Linux 명령줄 ssh uername@host를 통해 호스트에 연결할 수 있습니다.
프로젝트에서 코드를 사용하여 SSH를 구현하고 Shell 스크립트를 원격으로 실행하는 방법은 무엇입니까? JSch는 Java Secure Channel의 약어로 SSH2 기능을 순수 Java로 구현한 것입니다. 자세한 내용은 JSch 공식 웹사이트를 참조하세요. 이를 통해 SSH 서버에 연결하고 포트 전달, X11 전달, 파일 전송 등을 사용할 수 있으며 해당 기능을 자신의 애플리케이션에 통합할 수도 있습니다. 사용하기 전에 JSch 패키지(jsch-0.1.50.jar)를 다운로드하고 가져와야 합니다.
샘플 프로그램
package com.stormma.demo; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; public class Shell { //远程主机的ip地址 private String ip; //远程主机登录用户名 private String username; //远程主机的登录密码 private String password; //设置ssh连接的远程端口 public static final int DEFAULT_SSH_PORT = 22; //保存输出内容的容器 private ArrayList<string> stdout; /** * 初始化登录信息 * @param ip * @param username * @param password */ public Shell(final String ip, final String username, final String password) { this.ip = ip; this.username = username; this.password = password; stdout = new ArrayList<string>(); } /** * 执行shell命令 * @param command * @return */ public int execute(final String command) { int returnCode = 0; JSch jsch = new JSch(); MyUserInfo userInfo = new MyUserInfo(); try { //创建session并且打开连接,因为创建session之后要主动打开连接 Session session = jsch.getSession(username, ip, DEFAULT_SSH_PORT); session.setPassword(password); session.setUserInfo(userInfo); session.connect(); //打开通道,设置通道类型,和执行的命令 Channel channel = session.openChannel("exec"); ChannelExec channelExec = (ChannelExec)channel; channelExec.setCommand(command); channelExec.setInputStream(null); BufferedReader input = new BufferedReader(new InputStreamReader (channelExec.getInputStream())); channelExec.connect(); System.out.println("The remote command is :" + command); //接收远程服务器执行命令的结果 String line; while ((line = input.readLine()) != null) { stdout.add(line); } input.close(); // 得到returnCode if (channelExec.isClosed()) { returnCode = channelExec.getExitStatus(); } // 关闭通道 channelExec.disconnect(); //关闭session session.disconnect(); } catch (JSchException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return returnCode; } /** * get stdout * @return */ public ArrayList<string> getStandardOutput() { return stdout; } public static void main(final String [] args) { Shell shell = new Shell("xxx.xxx.xxx.xxx", "username", "password"); shell.execute("uname -s -r -v"); ArrayList<string> stdout = shell.getStandardOutput(); for (String str : stdout) { System.out.println(str); } } }
MyUserInfo
package com.stormma.demo; import com.jcraft.jsch.UserInfo; public class MyUserInfo implements UserInfo { @Override public String getPassphrase() { // TODO Auto-generated method stub System.out.println("MyUserInfo.getPassphrase()"); return null; } @Override public String getPassword() { // TODO Auto-generated method stub System.out.println("MyUserInfo.getPassword()"); return null; } @Override public boolean promptPassphrase(String arg0) { // TODO Auto-generated method stub System.out.println("MyUserInfo.promptPassphrase()"); System.out.println(arg0); return false; } @Override public boolean promptPassword(String arg0) { // TODO Auto-generated method stub System.out.println("MyUserInfo.promptPassword()"); System.out.println(arg0); return false; } @Override public boolean promptYesNo(String arg0) { // TODO Auto-generated method stub' System.out.println("MyUserInfo.promptYesNo()"); System.out.println(arg0); if (arg0.contains("The authenticity of host")) { return true; } return true; } @Override public void showMessage(String arg0) { // TODO Auto-generated method stub System.out.println("MyUserInfo.showMessage()"); } }
위 내용은 ssh를 통해 서버에 접속하여 쉘 명령을 실행하는 방법에 대한 Java의 자세한 설명과 샘플 코드를 자세히 소개합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!