Koneksi SSH Dengan Java

Java Top

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Perkenalan

SSH, juga dikenal sebagai Secure Shell atau Secure Socket Shell, adalah protokol jaringan yang memungkinkan satu komputer terhubung dengan aman ke komputer lain melalui jaringan yang tidak aman. Dalam tutorial ini, kami akan menunjukkan cara membuat koneksi ke server SSH jarak jauh dengan Java menggunakan pustaka JSch dan Apache MINA SSHD .

Dalam contoh kami, pertama-tama kami akan membuka koneksi SSH, lalu menjalankan satu perintah, membaca output dan menuliskannya ke konsol, dan, terakhir, menutup koneksi SSH. Kami akan menyimpan kode sampel sesederhana mungkin.

2. JSch

JSch adalah implementasi Java dari SSH2 yang memungkinkan kita untuk terhubung ke server SSH dan menggunakan penerusan porta, penerusan X11, dan transfer file. Juga, ini dilisensikan di bawah lisensi gaya BSD dan memberi kita cara mudah untuk membuat koneksi SSH dengan Java.

Pertama, mari tambahkan dependensi JSch Maven ke file pom.xml kita :

 com.jcraft jsch 0.1.55 

2.1. Penerapan

Untuk membuat koneksi SSH menggunakan JSch, kita membutuhkan nama pengguna, kata sandi, URL host, dan port SSH . Port SSH default adalah 22, tetapi mungkin saja kami akan mengonfigurasi server untuk menggunakan port lain untuk koneksi SSH:

public static void listFolderStructure(String username, String password, String host, int port, String command) throws Exception { Session session = null; ChannelExec channel = null; try { session = new JSch().getSession(username, host, port); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); channel = (ChannelExec) session.openChannel("exec"); channel.setCommand(command); ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); channel.setOutputStream(responseStream); channel.connect(); while (channel.isConnected()) { Thread.sleep(100); } String responseString = new String(responseStream.toByteArray()); System.out.println(responseString); } finally { if (session != null) { session.disconnect(); } if (channel != null) { channel.disconnect(); } } }

Seperti yang bisa kita lihat di kode, pertama-tama kita membuat sesi klien dan mengkonfigurasinya untuk koneksi ke server SSH kita. Kemudian, kami membuat saluran klien yang digunakan untuk berkomunikasi dengan server SSH di mana kami menyediakan jenis saluran - dalam hal ini, exec, yang berarti bahwa kami akan meneruskan perintah shell ke server.

Juga, kita harus mengatur aliran keluaran untuk saluran kita dimana respon server akan ditulis. Setelah kami membuat koneksi menggunakan metode channel.connect () , perintah akan diteruskan, dan respons yang diterima ditulis di konsol.

Mari kita lihat bagaimana menggunakan parameter konfigurasi berbeda yang ditawarkan JSch :

  • StrictHostKeyChecking - ini menunjukkan apakah aplikasi akan memeriksa apakah kunci publik host dapat ditemukan di antara host yang dikenal. Juga, nilai parameter yang tersedia adalah ask , yes, dan no , dimana ask adalah defaultnya. Jika kita menyetel properti ini ke yes , JSch tidak akan pernah secara otomatis menambahkan kunci host ke file known_hosts , dan akan menolak untuk terhubung ke host yang kunci hostnya telah berubah. Ini memaksa pengguna untuk menambahkan semua host baru secara manual. Jika kita menyetelnya ke no , JSch akan secara otomatis menambahkan kunci host baru ke daftar host yang dikenal
  • compression.s2c - menentukan apakah akan menggunakan kompresi untuk aliran data dari server ke aplikasi klien kami. Nilai yang tersedia adalah zlib dan tidak ada yang nilai detiknya adalah default
  • compression.c2s - menentukan apakah akan menggunakan kompresi untuk aliran data ke arah klien-server. Nilai yang tersedia adalah zlib dan tidak ada yang nilai detiknya adalah default

Penting untuk menutup sesi dan saluran SFTP setelah komunikasi dengan server selesai untuk menghindari kebocoran memori .

3. Apache MINA SSHD

Apache MINA SSHD menyediakan dukungan SSH untuk aplikasi berbasis Java. Library ini didasarkan pada Apache MINA, library IO asinkron yang dapat diskalakan dan berperforma tinggi.

Mari tambahkan dependensi Apache Mina SSHD Maven:

 org.apache.sshd sshd-core 2.5.1 

3.1. Penerapan

Mari kita lihat contoh kode untuk menghubungkan ke server SSH menggunakan Apache MINA SSHD:

public static void listFolderStructure(String username, String password, String host, int port, long defaultTimeoutSeconds, String command) throws IOException { SshClient client = SshClient.setUpDefaultClient(); client.start(); try (ClientSession session = client.connect(username, host, port) .verify(defaultTimeoutSeconds, TimeUnit.SECONDS).getSession()) { session.addPasswordIdentity(password); session.auth().verify(defaultTimeoutSeconds, TimeUnit.SECONDS); try (ByteArrayOutputStream responseStream = new ByteArrayOutputStream(); ClientChannel channel = session.createChannel(Channel.CHANNEL_SHELL)) { channel.setOut(responseStream); try { channel.open().verify(defaultTimeoutSeconds, TimeUnit.SECONDS); try (OutputStream pipedIn = channel.getInvertedIn()) { pipedIn.write(command.getBytes()); pipedIn.flush(); } channel.waitFor(EnumSet.of(ClientChannelEvent.CLOSED), TimeUnit.SECONDS.toMillis(defaultTimeoutSeconds)); String responseString = new String(responseStream.toByteArray()); System.out.println(responseString); } finally { channel.close(false); } } } finally { client.stop(); } }

Saat bekerja dengan Apache MINA SSHD, kami memiliki urutan kejadian yang sangat mirip dengan JSch. Pertama, kami membuat koneksi ke server SSH menggunakan instance kelas SshClient . Jika kita menginisialisasi dengan SshClient.setupDefaultClient (), kita akan dapat bekerja dengan instance yang memiliki konfigurasi default yang sesuai untuk sebagian besar kasus penggunaan. Ini termasuk cipher, kompresi, MAC, pertukaran kunci, dan tanda tangan.

Setelah itu, kita akan membuat ClientChannel dan melampirkan ByteArrayOutputStream padanya, sehingga kita akan menggunakannya sebagai aliran respons. Seperti yang bisa kita lihat, SSHD membutuhkan waktu tunggu yang ditentukan untuk setiap operasi. Ini juga memungkinkan kita untuk menentukan berapa lama akan menunggu respon server setelah perintah dilewatkan dengan menggunakan metode Channel.waitFor () .

Penting untuk diperhatikan bahwa SSHD akan menulis keluaran konsol lengkap ke dalam aliran respons. JSch akan melakukannya hanya dengan hasil eksekusi perintah.

Dokumentasi lengkap tentang Apache Mina SSHD tersedia di repositori GitHub resmi proyek.

4. Kesimpulan

Artikel ini mengilustrasikan cara membuat koneksi SSH dengan Java menggunakan dua pustaka Java yang tersedia - JSch dan Apache Mina SSHD. Kami juga menunjukkan cara meneruskan perintah ke server jarak jauh dan mendapatkan hasil eksekusi. Selain itu, contoh kode lengkap tersedia di GitHub.

Jawa bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya