{"id":511,"date":"2024-11-19T10:47:12","date_gmt":"2024-11-19T09:47:12","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=511"},"modified":"2024-12-03T11:08:29","modified_gmt":"2024-12-03T10:08:29","slug":"einsatz-der-jsch-library-fuer-ssh-zugriffe-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=511","title":{"rendered":"Einsatz der JSch-Library f\u00fcr SSH-Zugriffe in Java"},"content":{"rendered":"\n<p>Die <strong>JSch-Library<\/strong> (Java Secure Channel) ist eine beliebte Open-Source-Bibliothek, die es erm\u00f6glicht, sichere Verbindungen zu anderen Systemen \u00fcber das Secure Shell Protocol (SSH) herzustellen. Mit ihrer Hilfe k\u00f6nnen Entwickler in Java-basierte Anwendungen Funktionen integrieren, um auf entfernten Rechnern Befehle auszuf\u00fchren, Dateien zu \u00fcbertragen oder Protokollierungsaufgaben durchzuf\u00fchren. Dieser Artikel gibt einen umfassenden \u00dcberblick \u00fcber die Nutzung von JSch, einschlie\u00dflich Einrichtung, Authentifizierung, Ausf\u00fchrung von Remote-Befehlen und Dateihandling.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Voraussetzungen<\/strong><\/h4>\n\n\n\n<p>Um JSch in einer Anwendung zu nutzen, sind folgende Schritte notwendig:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Bibliothek einbinden<\/strong>:<br>Die JSch-Bibliothek kann \u00fcber <strong>Maven<\/strong> oder direkt als <strong>JAR-Datei<\/strong> eingebunden werden. F\u00fcr Maven-Projekte f\u00fcgt man folgendes Dependency in die <code>pom.xml<\/code> ein: <code>&lt;dependency> &lt;groupId>com.jcraft&lt;\/groupId> &lt;artifactId>jsch&lt;\/artifactId> &lt;version>0.1.55&lt;\/version> &lt;\/dependency><\/code><\/li>\n\n\n\n<li><strong>Voraussetzungen auf dem Zielsystem<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Ein laufender SSH-Server auf dem entfernten Rechner.<\/li>\n\n\n\n<li>Ein Benutzerkonto mit entsprechenden Berechtigungen.<\/li>\n\n\n\n<li>Optional: Zugriffsschl\u00fcssel (<code>.pem<\/code> oder <code>.ppk<\/code>) oder ein Passwort.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Java-Entwicklungsumgebung<\/strong>:<br>Eine g\u00e4ngige IDE wie IntelliJ IDEA, Eclipse oder VS Code wird empfohlen, um das Projekt zu verwalten.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Grundlegende Nutzung von JSch<\/strong><\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">1. <strong>Einrichten der Verbindung<\/strong><\/h5>\n\n\n\n<p>Die Klasse <code>com.jcraft.jsch.JSch<\/code> dient als Einstiegspunkt. Mit ihr wird die SSH-Verbindung aufgebaut:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.jcraft.jsch.JSch;\n<span class=\"hljs-keyword\">import<\/span> com.jcraft.jsch.Session;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SSHConnectionExample<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-built_in\">String<\/span> user = <span class=\"hljs-string\">\"username\"<\/span>;\n        <span class=\"hljs-built_in\">String<\/span> host = <span class=\"hljs-string\">\"remote.server.com\"<\/span>;\n        int port = <span class=\"hljs-number\">22<\/span>; <span class=\"hljs-comment\">\/\/ Standard-SSH-Port<\/span>\n        <span class=\"hljs-built_in\">String<\/span> password = <span class=\"hljs-string\">\"password\"<\/span>;\n\n        <span class=\"hljs-keyword\">try<\/span> {\n            JSch jsch = <span class=\"hljs-keyword\">new<\/span> JSch();\n            Session session = jsch.getSession(user, host, port);\n            session.setPassword(password);\n\n            <span class=\"hljs-comment\">\/\/ Sicherheitskonfiguration (unsichere Hostpr\u00fcfung deaktivieren)<\/span>\n            session.setConfig(<span class=\"hljs-string\">\"StrictHostKeyChecking\"<\/span>, <span class=\"hljs-string\">\"no\"<\/span>);\n\n            <span class=\"hljs-comment\">\/\/ Verbindung herstellen<\/span>\n            session.connect();\n            System.out.println(<span class=\"hljs-string\">\"SSH-Verbindung erfolgreich hergestellt!\"<\/span>);\n\n            <span class=\"hljs-comment\">\/\/ Verbindung schlie\u00dfen<\/span>\n            session.disconnect();\n        } <span class=\"hljs-keyword\">catch<\/span> (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Hinweis<\/strong>: Im obigen Beispiel wird die <code>StrictHostKeyChecking<\/code>-Einstellung deaktiviert, um Hostschl\u00fcsselpr\u00fcfung zu umgehen. In produktiven Umgebungen sollte dies vermieden werden.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">2. <strong>Ausf\u00fchrung von Remote-Befehlen<\/strong><\/h5>\n\n\n\n<p>Um Befehle auf dem Zielsystem auszuf\u00fchren, verwendet man das <code>ChannelExec<\/code>-Objekt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.jcraft.jsch.*;\n\n<span class=\"hljs-keyword\">import<\/span> java.io.InputStream;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ExecuteRemoteCommand<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-built_in\">String<\/span> user = <span class=\"hljs-string\">\"username\"<\/span>;\n        <span class=\"hljs-built_in\">String<\/span> host = <span class=\"hljs-string\">\"remote.server.com\"<\/span>;\n        <span class=\"hljs-built_in\">String<\/span> command = <span class=\"hljs-string\">\"ls -la\"<\/span>;\n\n        <span class=\"hljs-keyword\">try<\/span> {\n            JSch jsch = <span class=\"hljs-keyword\">new<\/span> JSch();\n            Session session = jsch.getSession(user, host, <span class=\"hljs-number\">22<\/span>);\n            session.setPassword(<span class=\"hljs-string\">\"password\"<\/span>);\n            session.setConfig(<span class=\"hljs-string\">\"StrictHostKeyChecking\"<\/span>, <span class=\"hljs-string\">\"no\"<\/span>);\n            session.connect();\n\n            <span class=\"hljs-comment\">\/\/ Channel f\u00fcr Befehlsausf\u00fchrung \u00f6ffnen<\/span>\n            ChannelExec channelExec = (ChannelExec) session.openChannel(<span class=\"hljs-string\">\"exec\"<\/span>);\n            channelExec.setCommand(command);\n\n            <span class=\"hljs-comment\">\/\/ Ausgabe des Befehls lesen<\/span>\n            InputStream inputStream = channelExec.getInputStream();\n            channelExec.connect();\n\n            <span class=\"hljs-comment\">\/\/ Ergebnis ausgeben<\/span>\n            byte&#91;] buffer = <span class=\"hljs-keyword\">new<\/span> byte&#91;<span class=\"hljs-number\">1024<\/span>];\n            int bytesRead;\n            <span class=\"hljs-keyword\">while<\/span> ((bytesRead = inputStream.read(buffer)) != <span class=\"hljs-number\">-1<\/span>) {\n                System.out.print(<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">String<\/span>(buffer, <span class=\"hljs-number\">0<\/span>, bytesRead));\n            }\n\n            <span class=\"hljs-comment\">\/\/ Verbindung schlie\u00dfen<\/span>\n            channelExec.disconnect();\n            session.disconnect();\n        } <span class=\"hljs-keyword\">catch<\/span> (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird der Befehl <code>ls -la<\/code> auf dem Zielsystem ausgef\u00fchrt. Die Ausgabe wird \u00fcber einen InputStream eingelesen.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h5 class=\"wp-block-heading\">3. <strong>Dateien \u00fcbertragen<\/strong><\/h5>\n\n\n\n<p>F\u00fcr die \u00dcbertragung von Dateien stellt JSch das <code>sftp<\/code>-Protokoll bereit. Dieses wird \u00fcber ein <code>ChannelSftp<\/code>-Objekt genutzt.<\/p>\n\n\n\n<p><strong>Hochladen von Dateien:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.jcraft.jsch.*;\n\n<span class=\"hljs-keyword\">import<\/span> java.io.FileInputStream;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UploadFile<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-built_in\">String<\/span> user = <span class=\"hljs-string\">\"username\"<\/span>;\n        <span class=\"hljs-built_in\">String<\/span> host = <span class=\"hljs-string\">\"remote.server.com\"<\/span>;\n        <span class=\"hljs-built_in\">String<\/span> localFile = <span class=\"hljs-string\">\"C:\/path\/to\/local\/file.txt\"<\/span>;\n        <span class=\"hljs-built_in\">String<\/span> remoteDir = <span class=\"hljs-string\">\"\/remote\/path\/\"<\/span>;\n\n        <span class=\"hljs-keyword\">try<\/span> {\n            JSch jsch = <span class=\"hljs-keyword\">new<\/span> JSch();\n            Session session = jsch.getSession(user, host, <span class=\"hljs-number\">22<\/span>);\n            session.setPassword(<span class=\"hljs-string\">\"password\"<\/span>);\n            session.setConfig(<span class=\"hljs-string\">\"StrictHostKeyChecking\"<\/span>, <span class=\"hljs-string\">\"no\"<\/span>);\n            session.connect();\n\n            <span class=\"hljs-comment\">\/\/ SFTP-Kanal \u00f6ffnen<\/span>\n            ChannelSftp sftpChannel = (ChannelSftp) session.openChannel(<span class=\"hljs-string\">\"sftp\"<\/span>);\n            sftpChannel.connect();\n\n            <span class=\"hljs-comment\">\/\/ Datei hochladen<\/span>\n            sftpChannel.put(<span class=\"hljs-keyword\">new<\/span> FileInputStream(localFile), remoteDir + <span class=\"hljs-string\">\"file.txt\"<\/span>);\n\n            System.out.println(<span class=\"hljs-string\">\"Datei erfolgreich hochgeladen!\"<\/span>);\n\n            <span class=\"hljs-comment\">\/\/ Verbindung schlie\u00dfen<\/span>\n            sftpChannel.disconnect();\n            session.disconnect();\n        } <span class=\"hljs-keyword\">catch<\/span> (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>Herunterladen von Dateien:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.jcraft.jsch.*;\n\n<span class=\"hljs-keyword\">import<\/span> java.io.FileOutputStream;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DownloadFile<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-built_in\">String<\/span> user = <span class=\"hljs-string\">\"username\"<\/span>;\n        <span class=\"hljs-built_in\">String<\/span> host = <span class=\"hljs-string\">\"remote.server.com\"<\/span>;\n        <span class=\"hljs-built_in\">String<\/span> remoteFile = <span class=\"hljs-string\">\"\/remote\/path\/file.txt\"<\/span>;\n        <span class=\"hljs-built_in\">String<\/span> localDir = <span class=\"hljs-string\">\"C:\/path\/to\/local\/\"<\/span>;\n\n        <span class=\"hljs-keyword\">try<\/span> {\n            JSch jsch = <span class=\"hljs-keyword\">new<\/span> JSch();\n            Session session = jsch.getSession(user, host, <span class=\"hljs-number\">22<\/span>);\n            session.setPassword(<span class=\"hljs-string\">\"password\"<\/span>);\n            session.setConfig(<span class=\"hljs-string\">\"StrictHostKeyChecking\"<\/span>, <span class=\"hljs-string\">\"no\"<\/span>);\n            session.connect();\n\n            <span class=\"hljs-comment\">\/\/ SFTP-Kanal \u00f6ffnen<\/span>\n            ChannelSftp sftpChannel = (ChannelSftp) session.openChannel(<span class=\"hljs-string\">\"sftp\"<\/span>);\n            sftpChannel.connect();\n\n            <span class=\"hljs-comment\">\/\/ Datei herunterladen<\/span>\n            sftpChannel.get(remoteFile, <span class=\"hljs-keyword\">new<\/span> FileOutputStream(localDir + <span class=\"hljs-string\">\"file.txt\"<\/span>));\n\n            System.out.println(<span class=\"hljs-string\">\"Datei erfolgreich heruntergeladen!\"<\/span>);\n\n            <span class=\"hljs-comment\">\/\/ Verbindung schlie\u00dfen<\/span>\n            sftpChannel.disconnect();\n            session.disconnect();\n        } <span class=\"hljs-keyword\">catch<\/span> (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Fehlerbehandlung und Sicherheit<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Hostschl\u00fcsselpr\u00fcfung aktivieren<\/strong>:<br>In produktiven Umgebungen sollte die Hostschl\u00fcsselpr\u00fcfung aktiviert und ein bekannter Hostschl\u00fcssel in einer Datei wie <code>known_hosts<\/code> gespeichert werden: <code>jsch.setKnownHosts(\"~\/.ssh\/known_hosts\");<\/code><\/li>\n\n\n\n<li><strong>Fehlermeldungen abfangen<\/strong>:<br>JSch wirft verschiedene Exceptions, wie <code>JSchException<\/code> oder <code>SftpException<\/code>. Eine granulare Fehlerbehandlung ist empfehlenswert, um Netzwerkprobleme, Berechtigungsfehler oder Datei\u00fcbertragungsprobleme zu erkennen.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Fazit<\/strong><\/h4>\n\n\n\n<p>Die JSch-Bibliothek bietet eine m\u00e4chtige und flexible M\u00f6glichkeit, SSH-Funktionen in Java-Anwendungen zu integrieren. Ob Remote-Befehle ausgef\u00fchrt oder Dateien \u00fcbertragen werden sollen \u2013 mit den bereitgestellten Klassen und Methoden lassen sich viele Anwendungsf\u00e4lle abdecken. Dennoch sollte man auf Sicherheit achten, insbesondere bei der Authentifizierung und Hostschl\u00fcsselpr\u00fcfung, um Sicherheitsl\u00fccken zu vermeiden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die JSch-Library (Java Secure Channel) ist eine beliebte Open-Source-Bibliothek, die es erm\u00f6glicht, sichere Verbindungen zu anderen Systemen \u00fcber das Secure Shell Protocol (SSH) herzustellen. Mit ihrer Hilfe k\u00f6nnen Entwickler in Java-basierte Anwendungen Funktionen integrieren, um auf entfernten Rechnern Befehle auszuf\u00fchren, Dateien zu \u00fcbertragen oder Protokollierungsaufgaben durchzuf\u00fchren. Dieser Artikel gibt einen umfassenden \u00dcberblick \u00fcber die Nutzung [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-511","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=511"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/511\/revisions"}],"predecessor-version":[{"id":512,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/511\/revisions\/512"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=511"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}