Mengeksekusi perintah pada mesin jarak jauh dari java dengan jsch

Mengeksekusi perintah pada mesin jarak jauh dari java dengan jsch

SSH adalah alat setiap hari dari pekerjaan administrasi sistem Linux. Ini adalah cara yang mudah dan aman untuk mengakses mesin jarak jauh di jaringan, mentransfer data dan menjalankan perintah jarak jauh. Terlepas dari mode interaktif, ada banyak alat yang memungkinkan otomatisasi tugas jarak jauh yang juga bergantung pada yang ada ssh Server/Arsitektur Klien. Untuk satu alat seperti itu, Anda dapat membaca tentang Ansible di Ubuntu misalnya. Anda juga dapat menemukan banyak implementasi klien SSH, tetapi bagaimana dengan mengakses kemampuan yang disediakan SSH dari kode?

JSCH adalah proyek yang mengimplementasikan protokol SSH di Java. Dengan bantuannya, Anda dapat membangun aplikasi yang mampu terhubung dan berinteraksi dengan server SSH jarak jauh atau lokal. Dengan cara ini aplikasi Anda mampu mengelola segala aspek dari mesin target yang dapat Anda selesaikan dengan klien SSH asli Anda, yang memberikan tambahan kuat lain untuk alat Java yang sudah luas.

Dalam artikel ini kami akan mengimpor JSCH ke proyek Java kami, dan mengembangkan potongan kode minimal yang diperlukan untuk membuat aplikasi yang dapat masuk ke server SSH mesin jarak jauh, menjalankan beberapa perintah dalam shell interaktif jarak jauh, menutup sesi, kemudian menyajikan keluaran. Aplikasi ini akan minimal, namun, mungkin memberikan petunjuk tentang kekuatan yang disediakannya.

Dalam tutorial ini Anda akan belajar:

  • Cara mengimpor JSCH ke proyek Java Anda
  • Cara mengatur lingkungan pengujian
  • Cara mengimplementasikan antarmuka userInfo di kelas khusus
  • Cara menulis aplikasi yang memulai sesi ssh interaktif
Eksekusi contoh JSCH.

Persyaratan dan konvensi perangkat lunak yang digunakan

Persyaratan Perangkat Lunak dan Konvensi Baris Perintah Linux
Kategori Persyaratan, konvensi atau versi perangkat lunak yang digunakan
Sistem Fedora 30
Perangkat lunak OpenJDK 1.8, jsch 0.1.55, Netbeans 8.2
Lainnya Akses istimewa ke sistem Linux Anda sebagai root atau melalui sudo memerintah.
Konvensi # - mensyaratkan perintah linux yang diberikan untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah
$ - mensyaratkan perintah Linux yang diberikan untuk dieksekusi sebagai pengguna biasa

Perkenalan

Dengan bantuan JSCH, kami akan mengembangkan aplikasi yang akan berusaha masuk localhost melalui ssh, menggunakan nama pengguna tes dan kata sandi tes. Kami akan mengasumsikan port default 22 Server SSH mendengarkan, dan akan menerima sidik jari server tanpa memeriksa validitasnya. Pada login yang berhasil, kami akan menjalankan beberapa perintah yang dapat kami keluarkan dalam shell jarak jauh, keluar, lalu cetak semua output yang diterima.

PERINGATAN
Kode sumber berikut hanya untuk tujuan demonstrasi; Jangan pernah menggunakan kode tersebut dalam produksi! Hanya untuk menyebutkan dua jebakan, Jangan mempercayai sidik jari server secara default, dan menangani pengecualian dengan benar.

Alat kami akan terdiri dari desktop fedora (baik sebagai klien maupun server), IDE NetBeans baru -baru ini, dan (pada saat penulisan) stabil terbaru JSCH. Namun perhatikan bahwa ini hanya alat pilihan. Java tidak tergantung pada platform, dan server target bisa berada di sisi lain planet ini, dan bisa berupa sistem operasi apa pun yang menjalankan yang tepat server ssh.

Menyiapkan Lingkungan Uji

Kita akan membutuhkan kredensial di atas untuk dikerjakan localhost. Dalam contoh kami itu berarti kami membutuhkan pengguna bernama "tes", dengan kata sandi "tes". Kami juga membutuhkan server SSH yang sedang berjalan.

Menambahkan Pengguna Uji

Kami akan mengeksekusi useradd sebagai akar:

# UserAdd Test

Dan atur kata sandi pengguna baru:

# tes passwd

Di sini kita perlu memberikan kata sandi di atas dua kali. Ini cocok di lingkungan pengujian yang bersifat sementara dan juga tidak terjangkau dari dunia luar, tetapi jangan gunakan kata sandi yang mudah ditebak ketika mungkin ada peluang sedikit pun untuk akses yang tidak terkendali.

Memeriksa server SSH

Kita dapat memeriksa status server ssh dengan Systemd:

# Systemctl Status SSHD

Dan mulai jika tidak berjalan:

# Systemctl Mulai SSHD

Langkah ini mungkin diperlukan pada instalasi desktop, karena beberapa pengaturan ini tidak menjalankan server SSH secara default.

Menguji konektivitas dengan klien asli

Jika pengguna kami diatur dan layanan berjalan, kami harus dapat masuk menggunakan informasi di atas:

$ ssh tes@localhost

Kita perlu menerima sidik jari host dan memberikan kata sandi. Jika kita sampai ke shell, lingkungan pengujian kita selesai.

Memperoleh dan mengimpor JSCH ke proyek kami

Mengunduh arsip

Kita perlu mengunduh kode byte proyek JSCH untuk menggunakan fungsionalitasnya. Anda dapat menemukan tautan yang sesuai di halaman beranda JSCH. Kita akan membutuhkannya .stoples Java Archive.

Membuat Proyek di NetBeans

Pada awalnya, kami membuat proyek baru dan kosong yang disebut SShremoteExample di NetBeans. Kami cukup memilih "proyek baru" dari menu file.



Membuat proyek baru.

Kami akan memilih kategori "Java", dan proyek "Aplikasi Java".

Memilih Kategori untuk Proyek.

Kita perlu memberikan nama untuk proyek, dalam hal ini "SshremoteExample".

Menamai proyek tersebut.

Pada tata letak default, kita dapat menemukan jendela "Proyek" di sebelah kiri. Di sana kami akan mengklik kanan pada simpul "Perpustakaan" di bawah proyek kami yang baru dibuat, dan pilih "Tambahkan Jar/Folder". Jendela pemilih file akan terbuka, di mana kita perlu menjelajahi .stoples File yang kami unduh dari situs pengembang.

Menambahkan toples sebagai perpustakaan.

Setelah pemilihan, arsip harus muncul di perpustakaan yang disertakan, jika kita membuka simpul "Perpustakaan".

JSCH berhasil diimpor.

Kita perlu menerapkan Info Pengguna antarmuka untuk menggunakannya di aplikasi kami. Untuk melakukannya, kita perlu menambahkan yang baru Kelas Java ke proyek kami dengan mengklik kanan kami SShremoteExample Paket di jendela proyek, pilih "baru", lalu "Kelas Java ...".

Menambahkan kelas Java baru ke paket.

Kami akan memberikan nama "SShremoteExampleSerInfo" sebagai nama kelas.

Menamai kelas Java baru.

Menambahkan kode sumber

sshremoteexampleuserinfo.Jawa

Untuk implementasi antarmuka kami, pertimbangkan sumber berikut. Di sinilah kami menerima sidik jari target secara membabi buta. Jangan lakukan ini dalam skenario dunia nyata. Anda dapat mengedit kode sumber dengan mengklik kelas di jendela proyek, atau jika sudah terbuka, beralihlah dengan tab di bagian atas jendela kode sumber.

paket sshremoteexample; Impor com.Jcraft.jsch.*; kelas publik sshremoteexampleuserInfo mengimplementasikan userInfo private final string pwd; publik sshremoteexampleuserInfo (nama pengguna string, kata sandi string) pwd = kata sandi;  @Override public string getPassphrase () throw new UnsupportedOperationException ("getPassphrase belum didukung."); @Override Public String getPassword () return pwd; @Override public boolean promptpassword (string string)  /*mod* / return true; @Override public boolean promptpassphrase (string string) throw new unsupportedOperationEcception (" promptpassphrase belum didukung."); @Override public boolean promptyesno (string string)  /*mod* / return true; @Override public void showMessage (string string)  
Menyalin

SShremoteExample.Jawa

Kelas utama kami adalah SShremoteExample kelas dengan sumber berikut:

paket sshremoteexample; Impor com.Jcraft.jsch.*; Impor Java.io.BytearrayInputStream; Impor Java.io.IoException; Impor Java.io.Inputstream; Impor Java.nio.Charset.Standardcharsets; kelas publik sshremoteexample public static void main (string [] args) string host = "localhost"; String user = "test"; String password = "test"; Command string = "hostname \ ndf -h \ nexit \ n"; coba jsch jsch = jsch baru (); Sesi sesi = jsch.getsession (pengguna, host, 22); sidang.setUserInfo (SShremoteExampleUserInfo baru (pengguna, kata sandi)); sidang.Menghubung(); Saluran saluran = sesi.OpenChannel ("Shell"); saluran.setInputStream (new BytearRayInputStream (perintah.GetBytes (Standardcharsets.UTF_8))); saluran.SetOutputStream (Sistem.keluar); Inputstream in = saluran.getInputStream (); StringBuilder outbuff = new StringBuilder (); int exitstatus = -1; saluran.Menghubung(); while (true) for (int c; ((c = in.baca ())> = 0);) outbuff.append ((char) c);  if (saluran.isclosed ()) if (in.tersedia ()> 0) lanjutkan; ExitStatus = saluran.getExitstatus (); merusak;   saluran.memutuskan(); sidang.memutuskan(); // Cetak sistem konten buffer.keluar.Cetak (Outbuff.tostring ()); // Cetak Sistem Status Keluar.keluar.print ("Status Keluar dari Eksekusi:" + Exitstatus); if (exitstatus == 0) sistem.keluar.print ("(ok) \ n");  else System.keluar.print ("(nok) \ n");  catch (ioException | jsChexception ioex) System.berbuat salah.println (ioex.tostring ());  
Menyalin

Perhatikan bahwa dalam contoh ini kita kode keras setiap detail yang diperlukan untuk koneksi: nama host target, nama pengguna/kata sandi, dan string perintah yang akan dieksekusi dalam sesi jarak jauh. Ini bukan contoh kehidupan nyata, tetapi melayani tujuan demonstrasi.

Kami dapat mengubah target dan kredensial untuk menjalankan perintah pada host jarak jauh. Perhatikan juga bahwa sesi jarak jauh akan memiliki hak istimewa pengguna yang masuk. Saya tidak akan menyarankan untuk menggunakan pengguna dengan hak istimewa yang tinggi - seperti akar - Untuk pengujian, jika mesin target memang berisi data atau layanan yang berharga.

Menjalankan aplikasi

Kami dapat menjalankan aplikasi kami langsung dari IDE dengan mengklik "Jalankan Proyek (SShremoteExample)" di menu "Jalankan", yang akan memberikan output di jendela output di bawah kode sumber. Kami juga dapat memilih "Proyek Bersih dan Bangun (SShremoteExample)" dari menu yang sama, dalam hal ini IDE akan menghasilkan .stoples Java Archive dapat dieksekusi tanpa IDE.

Output yang disediakan akan menunjukkan jalur ke arsip, mirip dengan yang berikut (jalur yang tepat dapat bervariasi tergantung pada pengaturan IDE Anda):

Untuk menjalankan aplikasi ini dari baris perintah tanpa semut, coba: java -jar "/var/proyek/sshremoteexample/disshremoteExample.stoples" 

Seperti yang dapat ditebak, kita dapat menjalankan aplikasi yang dibangun dari baris perintah, dan jika semuanya berjalan dengan baik, itu akan memberikan output yang mirip dengan yang berikut ini.

$ java -jar "/var/proyek/sshshellexample/disshellexample/sshshellexample/.JAR "Last Login: Mon 29 Jul 14:27:08 2019 dari 127.0.0.1 nama host df -h keluar [test@test1 ~] $ hostname test1.LinuxConfig.org [test@test1 ~] $ df -H ukuran sistem file digunakan tersedia digunakan% dipasang pada devtmpfs 3,9g 0 3,9g 0% /dev tmpfs 3,9g 127m 3.8g 4% /dev /shm tmpfs 3.9g 1 , 7m 3,9g 1% /Jalankan TMPFS 3,9g 0 3.9g 0% /sys /fs /cgroup /dev /mapper /fedora_localhost-live-root 49g 15g 32g 32% /tmpfs 3,9g 6,1m 3 , 9g 1% /tmp /dev /sdb1 275g 121g 140g 47% /mnt /hdd_open /dev /sda2 976m 198m 711m 22% /boot /dev /mapper /fedora_localhost-home-home 60g 50g 6,9g 88% /rumah /dev/sda1 200m 18m 182m 9%/boot/efi tmpfs 789m 9,7m 779m 2%/run/user/1000 tmpfs 789m 0 789m 0%/run/user/1001 [test@test1 ~] $ keluar status Keluar dari keluar Eksekusi: 0 (OK)

Perhatikan bahwa output Anda kemungkinan akan berbeda, jika tidak ada yang lain, dalam nama host, nama volume dan ukuran - tetapi secara umum, Anda akan melihat lengkap df -h output yang akan Anda dapatkan di sesi SSH.

Pikiran terakhir

Contoh sederhana ini dimaksudkan untuk menunjukkan kekuatan proyek JSCH, jika dengan cara yang agak terlalu disederhanakan. Dengan akses ke mesin uji dan klien yang tepat, perintah sederhana berikut akan memberikan informasi yang sama:

$ ssh tes@localhost "nama host; df -h"

Dan juga tidak akan membuat sesi interaktif. Fungsi yang sama disediakan oleh JSCH jika Anda membuka saluran dalam mode perintah:

Saluran saluran = sesi.OpenChannel ("Command");

Dengan cara ini Anda tidak perlu menangani menutup sesi dengan KELUAR Perintah Shell.

Kekuatan sebenarnya dari proyek ini terletak pada kemampuan untuk terhubung dan berinteraksi dengan mesin jarak jauh melalui perintah shell asli, memproses output, dan memutuskan tindakan berikutnya secara terprogram. Bayangkan aplikasi multi-threaded yang mengelola mungkin ratusan server dengan sendirinya, dan Anda akan mendapatkan fotonya.

Tutorial Linux Terkait:

  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Tutorial ansible untuk pemula di linux
  • Instalasi Oracle Java di Ubuntu 20.04 FOSSA FOSSA Linux
  • Cara menginstal java di manjaro linux
  • Linux: Instal Java
  • Bagaimana melakukan operasi administrasi dengan ansible…
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Menguasai loop skrip bash
  • Tutorial Vault Ansible