Melaksanakan arahan di mesin terpencil dari Java dengan JSCH

Melaksanakan arahan di mesin terpencil dari Java dengan JSCH

SSH adalah alat setiap hari pekerjaan pentadbiran sistem linux. Ini adalah cara yang mudah dan selamat untuk mengakses mesin jauh di rangkaian, memindahkan data dan melaksanakan arahan jauh. Selain daripada mod interaktif, terdapat banyak alat yang membolehkan automasi tugas jauh yang juga bergantung pada yang ada SSH Senibina Pelayan/Pelanggan. Untuk satu alat sedemikian, anda boleh membaca tentang Ansible di Ubuntu sebagai contoh. Anda juga boleh menemui banyak pelaksanaan klien SSH, tetapi bagaimana dengan mengakses kebolehan SSH menyediakan dari kod?

JSCH adalah projek yang melaksanakan protokol SSH di Java. Dengan bantuan itu, anda boleh membina aplikasi yang mampu menyambung dan berinteraksi dengan pelayan SSH jauh atau tempatan. Dengan cara ini, aplikasi anda mampu menguruskan sebarang aspek mesin sasaran yang dapat anda selesaikan dengan klien SSH asli anda, yang memberikan tambahan yang kuat kepada toolset Java yang sudah luas.

Dalam artikel ini, kami akan mengimport JSCH ke dalam projek Java kami, dan membangunkan kepingan kod yang diperlukan untuk membuat aplikasi yang boleh log masuk ke pelayan SSH mesin jauh, melaksanakan beberapa arahan dalam shell interaktif jauh, menutup sesi, kemudian membentangkannya pengeluaran. Permohonan ini akan menjadi minimum, bagaimanapun, ia mungkin memberi sedikit kuasa yang disediakan.

Dalam tutorial ini anda akan belajar:

  • Cara mengimport JSCH ke dalam projek Java anda
  • Cara Menyediakan Persekitaran Ujian
  • Cara Melaksanakan Antara Muka UserInfo dalam Kelas Kustom
  • Cara Menulis Aplikasi yang Memulakan Sesi SSH Interaktif
JSCH Contoh Pelaksanaan.

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Fedora 30
Perisian OpenJDK 1.8, JSCH 0.1.55, Netbeans 8.2
Yang lain Akses istimewa ke sistem linux anda sebagai akar atau melalui sudo perintah.
Konvensyen # - Memerlukan arahan Linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$ - Memerlukan arahan Linux yang diberikan sebagai pengguna yang tidak layak

Pengenalan

Dengan bantuan JSCH, kami akan membangunkan aplikasi yang akan cuba log masuk localhost melalui SSH, menggunakan nama pengguna ujian dan kata laluan ujian. Kami akan menganggap port lalai 22 Pelayan SSH mendengar, dan akan menerima cap jari pelayan tanpa menyemak kesahihannya. Pada Log masuk yang berjaya, kami akan melaksanakan beberapa arahan yang boleh kami keluarkan dalam shell jauh, log keluar, kemudian mencetak semua output yang diterima.

Amaran
Kod sumber berikut adalah untuk tujuan demonstrasi sahaja; Jangan sekali -kali menggunakan kod tersebut dalam pengeluaran! Hanya untuk menamakan dua perangkap, Jangan mempercayai sebarang cap jari pelayan secara lalai, dan mengendalikan pengecualian dengan betul.

Alat kami akan terdiri daripada desktop fedora (baik sebagai klien dan pelayan), IDE NetBeans baru -baru ini, dan (pada masa penulisan) JSCH terbaru. Perhatikan bagaimanapun, bahawa ini hanya alat pilihan. Java adalah platform bebas, dan pelayan sasaran boleh berada di seberang planet ini, dan boleh menjadi sistem operasi yang berjalan pelayan SSH.

Menyediakan persekitaran ujian

Kami memerlukan kelayakan di atas untuk diusahakan localhost. Dalam contoh kami yang bermaksud kami memerlukan pengguna bernama "ujian", dengan kata laluan "ujian". Kami juga memerlukan pelayan SSH yang sedang berjalan.

Menambah pengguna ujian

Kami akan melaksanakan useradd sebagai akar:

# Ujian UserAdd

Dan tetapkan kata laluan pengguna baru:

# Ujian Passwd

Di sini kita perlu memberikan kata laluan di atas dua kali. Ini sesuai dalam persekitaran ujian yang sementara dan juga tidak dapat dicapai dari dunia luar, tetapi jangan gunakan kata laluan yang mudah ditebak apabila mungkin ada sedikit peluang untuk akses yang tidak terkawal.

Memeriksa pelayan SSH

Kita boleh menyemak status pelayan SSH dengan sistemd:

# Systemctl Status SSHD

Dan mulakannya jika ia tidak berjalan:

# Systemctl Mula SSHD

Langkah ini mungkin diperlukan pada pemasangan desktop, kerana beberapa persediaan ini tidak menjalankan pelayan SSH secara lalai.

Menguji sambungan dengan pelanggan asli

Jika pengguna kami ditetapkan dan perkhidmatan sedang berjalan, kami harus dapat log masuk menggunakan maklumat di atas:

$ ssh test@localhost

Kita perlu menerima cap jari tuan rumah dan memberikan kata laluan. Sekiranya kita sampai ke shell, persekitaran ujian kita selesai.

Mendapatkan dan mengimport JSCH ke projek kami

Memuat turun arkib

Kita perlu memuat turun kod byte projek jsch untuk menggunakan fungsi itu. Anda boleh mencari pautan yang sesuai di halaman utama JSCH. Kami memerlukannya .balang Arkib Java.

Membuat projek di NetBeans

Pada mulanya, kami membuat projek baru yang dipanggil SSHREMOTEEXAMPLE di Netbeans. Kami hanya boleh memilih "projek baru" dari menu fail.



Mewujudkan projek baru.

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

Memilih kategori untuk projek itu.

Kita perlu memberikan nama untuk projek ini, dalam kes ini "SSHRemoteExample".

Menamakan projek.

Pada susun atur lalai, kami dapat mencari tetingkap "Projek" di sebelah kiri. Di sana kami akan klik kanan pada nod "Perpustakaan" di bawah projek kami yang baru dibuat, dan pilih "Tambah Jar/Folder". Tetingkap pemilih fail akan dibuka, di mana kita perlu melayari untuk .balang fail yang kami muat turun dari laman web pemaju.

Menambah balang sebagai perpustakaan.

Selepas pemilihan, arkib harus muncul di perpustakaan yang disertakan, jika kita membuka nod "perpustakaan".

JSCH berjaya diimport.

Kita perlu melaksanakan Maklumat Pengguna antara muka untuk menggunakannya dalam aplikasi kami. Untuk berbuat demikian, kita perlu menambah yang baru Kelas Java kepada projek kami dengan mengklik kanan kami SSHREMOTEEXAMPLE Pakej dalam tetingkap Projek, pilih "Baru", kemudian "Kelas Java ...".

Menambah Kelas Java Baru ke Pakej.

Kami akan memberikan nama "sshremoteexampleuserinfo" sebagai nama kelas.

Menamakan Kelas Java Baru.

Menambah kod sumber

SSHREMOTEEXAMPLEUSERINFO.Java

Untuk pelaksanaan antara muka kami, pertimbangkan sumber berikut. Di sinilah kita menerima cap jari sasaran secara membabi buta. Jangan buat ini dalam senario dunia sebenar. Anda boleh mengedit kod sumber dengan mengklik kelas dalam tetingkap Projek, atau jika sudah dibuka, beralih kepadanya dengan tab di bahagian atas tetingkap Kod Sumber.

pakej sshremoteexample; Import com.jcraft.JSCH.*; kelas awam sshremoteexampleuserinfo melaksanakan userInfo private final string pwd; awam sShRemoteExampleUserInfo (Nama Pengguna String, Kata Laluan String) pwd = password;  @Override public string getpassphrase () lemparkan baru tidak disokongOperationException ("getpassphrase belum disokong lagi."); @Override public string getpassword () return pwd; @Override public boolean promptPassword (string string)  /*mod* / return true; @Override public boolean promptpassphrase (String string) kata laluan segera belum disokong."); @Override public boolean promptesno (string string)  /*mod* / return true; @Override public void showMessage (String String)  
Salinan

SSHREMOTEEXAMPLE.Java

Kelas utama kami akan menjadi SSHREMOTEEXAMPLE kelas dengan sumber berikut:

pakej sshremoteexample; Import com.jcraft.JSCH.*; Import Java.io.ByteArrayInputStream; Import Java.io.IoException; Import Java.io.Inputstream; Import Java.nio.Charset.StandardCharsets; kelas awam sShRemoteExample public static void main (string [] args) string host = "localhost"; String user = "test"; String password = "Test"; String Command = "HostName \ ndf -H \ nexit \ n"; cuba jsch jsch = new jsch (); Sesi Sesi = JSCH.getession (pengguna, tuan rumah, 22); sesi.setUserInfo (SSHRemoteExampleUserInfo baru (pengguna, kata laluan)); sesi.sambung (); Saluran saluran = sesi.OpenChannel ("Shell"); saluran.SetInputStream (ByteArrayInputStream baru (perintah.getBytes (StandardCharsets.Utf_8))); saluran.setOutputStream (sistem.keluar); InputStream In = Channel.getInputStream (); StringBuilder Outbuff = New StringBuilder (); int exitstatus = -1; saluran.sambung (); sementara (benar) untuk (int c; ((c = in.baca ())> = 0);) outbuff.tambah ((char) c);  jika (saluran.isclosed ()) if (in inci.Tersedia ()> 0) Teruskan; ExitStatus = Saluran.getExitStatus (); rehat;  saluran.putuskan sambungan (); sesi.putuskan sambungan (); // Cetak sistem kandungan penampan.keluar.Cetak (Outbuff.menjalin()); // Cetak sistem status keluar.keluar.cetak ("Status keluar pelaksanaan:" + exitstatus); jika (ExitStatus == 0) Sistem.keluar.cetak ("(ok) \ n");  else System.keluar.cetak ("(nok) \ n");  tangkapan (ioException | JSChexception ioex) System.err.println (ioex.menjalin());  
Salinan

Perhatikan bahawa dalam contoh ini kita kod keras setiap butiran yang diperlukan untuk sambungan: Nama hos sasaran, nama pengguna/kata laluan, dan rentetan arahan yang akan dilaksanakan dalam sesi terpencil. Ini bukan contoh kehidupan sebenar, tetapi ia berfungsi dengan tujuan demonstrasi.

Kami boleh mengubah sasaran dan kelayakan untuk melaksanakan arahan pada tuan rumah terpencil. Perhatikan juga bahawa sesi terpencil akan mempunyai keistimewaan pengguna yang log masuk. Saya tidak akan menasihatkan untuk menggunakan pengguna dengan keistimewaan yang tinggi - seperti akar - Untuk ujian, jika mesin sasaran tidak mengandungi data atau perkhidmatan yang berharga.

Menjalankan aplikasi

Kami boleh menjalankan aplikasi kami terus dari IDE dengan mengklik pada "Projek Run (SSHRemoteExample)" dalam menu "Run", yang akan memberikan output dalam tetingkap output di bawah kod sumber. Kami juga boleh memilih "Projek Bersih dan Bina (SSHRemoteExample)" dari menu yang sama, di mana IDE akan menghasilkan .balang Arkib Java boleh dilaksanakan tanpa IDE.

Output yang disediakan akan menunjukkan jalan ke arkib, sama seperti yang berikut (jalan tepat mungkin berbeza bergantung pada tetapan IDE anda):

Untuk menjalankan aplikasi ini dari baris arahan tanpa semut, cuba: java -jar "/var/projek/sshremoteexample/dist/sshremoteexample.balang " 

Seperti yang dapat ditebak, kami dapat menjalankan aplikasi kami yang dibina dari baris arahan, dan jika semuanya berjalan lancar, ia akan memberikan output yang serupa dengan yang berikut.

$ java -jar "/var/projek/sshshellexample/dist/sshshellexample.Jar "Login Terakhir: Mon Jul 29 14:27:08 2019 dari 127.0.0.1 nama hostname df -h keluar [test@test1 ~] $ hostname test1.Linuxconfig.org [test@test1 ~] $ df -h -h saiz sistem fail yang digunakan digunakan dengan mudah 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% /run 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 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 6,9g 88% / /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@test ~] $ exit status status Pelaksanaan: 0 (OK)

Perhatikan bahawa output anda mungkin berbeza, jika tidak ada yang lain, dalam nama hos, nama volume dan saiz - tetapi secara umum, anda harus melihat lengkap df -h output yang akan anda dapatkan dalam sesi SSH.

Pemikiran terakhir

Contoh mudah ini dimaksudkan untuk menunjukkan kekuatan projek JSCH, jika dengan cara yang agak terlalu banyak dimanfaatkan. Dengan akses kepada mesin ujian dan pelanggan yang betul, perintah mudah berikut akan memberikan maklumat yang sama:

$ ssh test@localhost "hostname; df -h"

Dan juga tidak akan membuat sesi interaktif. Fungsi yang sama disediakan oleh JSCH jika anda membuka saluran dalam mod arahan:

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

Dengan cara ini anda tidak perlu mengendalikan menutup sesi dengan keluar perintah shell.

Kekuatan sebenar projek ini terletak pada keupayaan untuk menyambung dan berinteraksi dengan perintah shell asli mesin jauh, memproses output, dan memutuskan tindakan seterusnya secara pemrograman. Bayangkan aplikasi pelbagai threaded yang menguruskan beratus-ratus pelayan dengan sendirinya, dan anda akan mendapat gambar.

Tutorial Linux Berkaitan:

  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Tutorial Ansible untuk Pemula di Linux
  • Pemasangan Oracle Java di Ubuntu 20.04 Focal Fossa Linux
  • Cara Memasang Java di Manjaro Linux
  • Linux: Pasang Java
  • Cara Melaksanakan Operasi Pentadbiran dengan Ansible ..
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Menguasai Gelung Skrip Bash
  • Tutorial Vault Ansible