Cet article présente principalement l'explication détaillée et des exemples de méthodes de connexion de Java au serveur via ssh pour exécuter des commandes shell
Java se connectant au serveur via ssh pour exécuter des commandes shell en détail
Java se connecte au serveur via ssh pour exécuter des commandes shell : JSch est une implémentation Java pure de SSH2. Il vous permet de vous connecter à un serveur SSHD, d'utiliser la redirection de port, la redirection X11, les transferts de fichiers et bien plus encore. Vous pouvez intégrer ses fonctionnalités dans vos propres programmes. Parallèlement, le projet propose également une version J2ME pour une connexion directe au serveur SSHD sur le téléphone mobile.
SSH est l'abréviation de Secure Shell, un protocole de sécurité basé sur la couche application et la couche transport. SSH crypte toutes les données pendant le processus de connexion et de transmission et peut être utilisé pour établir des connexions sécurisées entre différents systèmes ou serveurs. SSH propose deux méthodes d'authentification de sécurité : l'authentification par mot de passe et l'authentification par clé. Parmi eux, l'authentification par mot de passe est relativement simple. Tant que vous connaissez le nom d'utilisateur et le mot de passe de l'hôte distant, vous pouvez vous connecter. L'authentification par clé est plus gênante et la connexion prend plus de temps, nous ne la présenterons donc pas en détail ici.
Il existe de nombreux clients basés sur le protocole SSH, tels que : PuTTY, OpenSSH, Xshell 4, etc., qui peuvent se connecter à distance à presque toutes les plateformes UNIX. En même temps, vous pouvez vous connecter à un hôte via la ligne de commande Linux ssh uername@host.
Dans le projet, comment utiliser le code pour implémenter SSH et exécuter le script Shell à distance ? JSch est l'abréviation de Java Secure Channel. Il s'agit d'une implémentation purement Java de la fonction SSH2. Pour des informations spécifiques, veuillez vous référer au site officiel de JSch. Il vous permet de vous connecter à un serveur SSH et d'utiliser la redirection de port, la redirection X11, le transfert de fichiers, etc., et vous pouvez également intégrer ses fonctionnalités dans vos propres applications. Avant utilisation, vous devez télécharger et importer le package JSch : jsch-0.1.50.jar.
Exemple de programme
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()"); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!