Sambungan SSH Dengan Java

Java Teratas

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

>> SEMAK KURSUS

1. Pengenalan

SSH, juga dikenal sebagai Secure Shell atau Secure Socket Shell, adalah protokol rangkaian yang membolehkan satu komputer tersambung dengan selamat ke komputer lain melalui rangkaian yang tidak terjamin. Dalam tutorial ini, kami akan menunjukkan cara membuat sambungan ke pelayan SSH jauh dengan Java menggunakan perpustakaan JSch dan Apache MINA SSHD .

Dalam contoh kami, kami akan membuka sambungan SSH terlebih dahulu, kemudian melaksanakan satu arahan, membaca output dan menulisnya ke konsol, dan, akhirnya, menutup sambungan SSH. Kami akan menyimpan contoh kod sesederhana mungkin.

2. JSch

JSch adalah implementasi Java dari SSH2 yang memungkinkan kita terhubung ke pelayan SSH dan menggunakan pemajuan port, pemajuan X11, dan pemindahan file. Juga, ia dilesenkan di bawah lesen gaya BSD dan memberi kita cara mudah untuk mewujudkan sambungan SSH dengan Java.

Pertama, mari tambahkan kebergantungan JSch Maven ke fail pom.xml kami :

 com.jcraft jsch 0.1.55 

2.1. Pelaksanaan

Untuk mewujudkan sambungan SSH menggunakan JSch, kami memerlukan nama pengguna, kata laluan, URL host, dan port SSH . Port SSH lalai adalah 22, tetapi kebetulan kami akan mengkonfigurasi pelayan untuk menggunakan port lain untuk sambungan 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 dapat kita lihat dalam kod, pertama-tama kita membuat sesi klien dan mengkonfigurasinya untuk sambungan ke pelayan SSH kita. Kemudian, kami membuat saluran pelanggan yang digunakan untuk berkomunikasi dengan pelayan SSH di mana kami menyediakan jenis saluran - dalam kes ini, exec, yang bermaksud bahawa kami akan menyampaikan perintah shell ke pelayan.

Juga, kita harus menetapkan aliran output untuk saluran kita di mana respons pelayan akan ditulis. Setelah kami membuat sambungan menggunakan kaedah channel.connect () , arahan dilalui, dan respons yang diterima ditulis di konsol.

Mari lihat bagaimana menggunakan parameter konfigurasi yang berbeza yang ditawarkan oleh JSch :

  • StrictHostKeyChecking - ini menunjukkan sama ada aplikasi akan memeriksa sama ada kunci awam host boleh didapati di antara host yang dikenali. Juga, nilai parameter yang tersedia adalah ask , ya, dan tidak , di mana ask adalah lalai. Sekiranya kita menetapkan sifat ini ke ya , JSch tidak akan menambahkan kunci hos secara automatik ke fail yang dikenali_hosts , dan ia akan menolak untuk menyambung ke hos yang kunci hosnya telah berubah. Ini memaksa pengguna menambahkan semua hos baru secara manual. Sekiranya kita menetapkannya ke tidak , JSch secara automatik akan menambahkan kunci hos baru ke senarai hos yang diketahui
  • compression.s2c - menentukan sama ada menggunakan pemampatan untuk aliran data dari pelayan ke aplikasi pelanggan kami. Nilai yang tersedia adalah zlib dan tidak ada yang kedua adalah lalai
  • compression.c2s - menentukan sama ada menggunakan pemampatan untuk aliran data ke arah pelanggan-pelayan. Nilai yang tersedia adalah zlib dan tidak ada yang kedua adalah lalai

Penting untuk menutup sesi dan saluran SFTP setelah komunikasi dengan pelayan selesai untuk mengelakkan kebocoran memori .

3. Apache MINA SSHD

Apache MINA SSHD menyediakan sokongan SSH untuk aplikasi berbasis Java. Perpustakaan ini didasarkan pada Apache MINA, perpustakaan IO asinkron berprestasi tinggi dan berskala tinggi.

Mari tambah pergantungan Apache Mina SSHD Maven:

 org.apache.sshd sshd-core 2.5.1 

3.1. Pelaksanaan

Mari lihat contoh kod penyambungan ke pelayan 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(); } }

Semasa bekerja dengan Apache MINA SSHD, kami mempunyai rentetan peristiwa yang hampir sama dengan JSch. Pertama, kami membuat sambungan ke pelayan SSH menggunakan contoh kelas SshClient . Sekiranya kita menginisialisasi dengan SshClient.setupDefaultClient (), kita akan dapat bekerja dengan contoh yang mempunyai konfigurasi lalai yang sesuai untuk kebanyakan kes penggunaan. Ini termasuk cipher, pemampatan, MAC, pertukaran kunci, dan tandatangan.

Selepas itu, kami akan membuat ClientChannel dan melampirkan ByteArrayOutputStream kepadanya, supaya kami menggunakannya sebagai aliran tindak balas. Seperti yang kita lihat, SSHD memerlukan waktu tunggu yang ditentukan untuk setiap operasi. Ini juga memungkinkan kita untuk menentukan berapa lama ia akan menunggu tindak balas pelayan setelah perintah itu diteruskan dengan menggunakan kaedah Channel.waitFor () .

Penting untuk diperhatikan bahawa SSHD akan menulis output konsol lengkap ke dalam aliran tindak balas. JSch akan melakukannya hanya dengan hasil pelaksanaan perintah.

Dokumentasi lengkap mengenai Apache Mina SSHD boleh didapati di repositori rasmi GitHub.

4. Kesimpulan

Artikel ini menggambarkan cara menjalin sambungan SSH dengan Java menggunakan dua perpustakaan Java yang tersedia - JSch dan Apache Mina SSHD. Kami juga menunjukkan cara menyampaikan perintah ke pelayan jauh dan mendapatkan hasil pelaksanaan. Contoh kod lengkap boleh didapati di GitHub.

Bahagian bawah Java

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

>> SEMAK KURSUS