Wykonanie poleceń na zdalnej maszynie z Java z JSCH

Wykonanie poleceń na zdalnej maszynie z Java z JSCH

SSH to codzienne narzędzie każdego zadania administracyjnego systemu Linux. Jest to łatwy i bezpieczny sposób dostępu do zdalnych maszyn w sieci, przesyłanie danych i wykonanie zdalnych poleceń. Oprócz trybu interaktywnego istnieje wiele narzędzi, które umożliwiają automatyzację zadań zdalnych, które również polegają na istniejącym ssh architektura serwera/klienta. W przypadku jednego takiego narzędzia możesz na przykład przeczytać o Ansible na Ubuntu. Możesz także znaleźć wiele implementacji klienta SSH, ale co z dostępem do umiejętności dostarczanych przez SSH?

JSCH to projekt, który implementuje protokół SSH w Javie. Dzięki swojej pomocy możesz budować aplikacje, które są w stanie łączyć się i interakcja z zdalnym lub lokalnym serwerem SSH. W ten sposób aplikacja jest w stanie zarządzać dowolnym aspektem komputera docelowego, który mógłbyś kompletny z natywnym klientem SSH, co daje jeszcze jeden potężny dodatek do już ogromnego zestawu narzędzi Java.

W tym artykule zaimportujemy JSCH do naszego projektu Java i opracujemy minimalne niezbędne elementy kodu, aby utworzyć aplikację, która może zalogować się na serwerze SSH maszyny zdalnego, wykonać niektóre polecenia w zdalnej interaktywnej powładzie, zamyka sesję, a następnie przedstawia sesję, a następnie przedstawia sesję, a następnie przedstawia sesję, a następnie przedstawia sesję, a następnie przedstawia sesję, a następnie przedstawia sesję wyjście. Ta aplikacja będzie minimalna, może jednak dać wskazówkę o dostarczanej mocy.

W tym samouczku nauczysz się:

  • Jak zaimportować JSCH do projektu Java
  • Jak skonfigurować środowisko testowe
  • Jak zaimplementować interfejs UserInfo w klasie niestandardowej
  • Jak napisać aplikację, która inicjuje interaktywną sesję SSH
Przykładowe wykonanie JSCH.

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
Kategoria Wymagania, konwencje lub wersja oprogramowania
System Fedora 30
Oprogramowanie OpenJdk 1.8, JSCH 0.1.55, NetBeans 8.2
Inny Uprzywilejowany dostęp do systemu Linux jako root lub za pośrednictwem sudo Komenda.
Konwencje # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Wstęp

Z pomocą JSCH opracujemy aplikację, która będzie próbowała się zalogować Lokalny Gospodarz przez ssh, Korzystanie z nazwy użytkownika test i hasło test. Zakładamy domyślny port 22 Serwer SSH słucha się i zaakceptuje odcisk palca serwera bez sprawdzania jego ważności. Po udanym logowaniu wykonamy kilka poleceń, które moglibyśmy wydać w zdalnej powładzie, wylogować się, a następnie wydrukować wszystkie otrzymane dane wyjściowe.

OSTRZEŻENIE
Poniższy kod źródłowy służy wyłącznie celom demonstracyjnym; Nigdy nie używaj takiego kodu w produkcji! Żeby wymienić dwie pułapki, Domyślnie nie ufaj odciskom palców serwerów, i prawidłowo obsłużyć wyjątki.

Nasze narzędzia będą składać się z pulpitu Fedora (zarówno jako klienta, jak i serwera), najnowszego IDE NetBean i (w momencie pisania) najnowszego stabilnego JSCH. Należy jednak zauważyć, że są to tylko wybrane narzędzia. Java jest niezależna od platformy, a docelowy serwer może znajdować się po drugiej stronie planety i może być dowolnym systemem operacyjnym, który działa właściwy serwer SSH.

Konfigurowanie środowiska testowego

Potrzebujemy powyższych poświadczeń, nad którymi do pracy Lokalny Gospodarz. W naszym przykładzie oznacza to, że potrzebujemy użytkownika o nazwie „test”, z hasłem „test”. Potrzebujemy również uruchomionego serwera SSH.

Dodanie użytkownika testu

Wykonamy UserAdd Jak źródło:

# Test użytkownika

I ustaw hasło nowego użytkownika:

# test passwd

Tutaj musimy dwukrotnie podać powyższe hasło. Jest to odpowiednie w środowisku testowym, które jest tymczasowe, a także nieosiągalne ze świata zewnętrznego, ale nie używaj łatwych do zgady haseł, gdy może istnieć najmniejsza szansa na niekontrolowany dostęp.

Sprawdzanie serwera SSH

Możemy sprawdzić status serwer SSH z Systemd:

# status SystemCtl SSHD

I zacznij, jeśli nie działa:

# Systemctl Start Sshd

Ten krok może być konieczny na instalacjach stacjonarnych, ponieważ niektóre z tych konfiguracji domyślnie nie uruchamiają serwera SSH.

Testowanie łączności z natywnym klientem

Jeśli nasz użytkownik jest ustawiony, a usługa działa, powinniśmy być w stanie zalogować się za pomocą powyższych informacji:

$ ssh test@localHost

Będziemy musieli zaakceptować odcisk palca hosta i podać hasło. Jeśli dojdziemy do powłoki, nasze środowisko testowe zostało zakończone.

Uzyskanie i importowanie JSCH do naszego projektu

Pobieranie archiwum

Będziemy musieli pobrać kod bajtowy projektu JSCH, aby użyć jego funkcjonalności. Możesz znaleźć odpowiedni link na stronie głównej JSCH. Będziemy potrzebować .słoik Archiwum Java.

Tworzenie projektu w NetBeans

Na początku tworzymy nowy, pusty projekt o nazwie sshremoteexample w Netbeans. Możemy po prostu wybrać „nowy projekt” z menu plików.



Tworzenie nowego projektu.

Wybierzemy kategorię „Java” i projekt „aplikacji Java”.

Wybór kategorii projektu.

Musimy podać nazwę projektu, w tym przypadku „SshRemoteexample”.

Nazywanie projektu.

W domyślnym układzie możemy znaleźć okno „Projekty” po lewej stronie. Tam kliknij się prawym przyciskiem myszy węzeł „biblioteki” w ramach naszego nowo utworzonego projektu i wybierz „Dodaj słoik/folder”. Otworzy się okno wyboru pliku, w którym musimy przeglądać .słoik Plik, który pobraliśmy ze strony programisty.

Dodanie słoika jako biblioteki.

Po wyborze archiwum powinno pojawić się w dołączonych bibliotekach, jeśli otworzymy węzeł „biblioteki”.

JSCH zaimportował pomyślnie.

Będziemy musieli wdrożyć Informacje użytkownika interfejs, aby użyć go w naszej aplikacji. Aby to zrobić, będziemy musieli dodać nowy Klasa Java do naszego projektu, klikając prawym przyciskiem myszy na naszym sshremoteexample Pakiet w oknie projektu wybierz „Nowy”, a następnie „klasa Java…”.

Dodanie nowej klasy Java do pakietu.

Podamy nazwę „SSHREMOTEEXAMPEMERUSERINFO” jako nazwa klasy.

Nazywanie nowej klasy Java.

Dodanie kodu źródłowego

sshremoteexampleuserinfo.Jawa

Dla naszej implementacji interfejsu rozważ następujące źródło. Tutaj ślepo akceptujemy odcisk palca celu. Nie rób tego w scenariuszu prawdziwego świata. Możesz edytować kod źródłowy, klikając klasę w oknie projektu lub jeśli jest już otwarty, przełącz go za pomocą kart u góry okna kodu źródłowego.

pakiet sshRemoteexample; import com.Jcraft.Jsch.*; Klasa publiczna sshremoteexampleUserInfo implementuje userInfo prywatny ciąg końcowy pwd; public sshremoteexampleUserInfo (String Username, String hasło) pwd = hasło;  @Override public String getPassPhrase () rzuć nową UnsupportedoperationException („GetPassPhrase jeszcze nie jest obsługiwany."); @Override public String getPassword () return pwd; @Override public boolean montPassword (String String)  /*mod* / return true; @Override public boolean inccasPhrase (string string) wyrzuć nowy UnsportedOperationException (" SzybkaPhraza jeszcze nie obsługiwana."); @Override public boolean wspomagający się (string string)  /*mod* / return true; @override public void showMessage (string string)  
Kopiuj

Sshremoteexample.Jawa

Naszą główną klasą będzie sshremoteexample klasa z następującym źródłem:

pakiet sshRemoteexample; import com.Jcraft.Jsch.*; Importuj Java.io.ByteArrayInputStream; Importuj Java.io.IoException; Importuj Java.io.Strumień wejściowy; Importuj Java.nio.znak.StandardCharSets; public class sshremoteexample public static void main (string [] args) string host = "localHost"; String user = "test"; String hasło = "test"; String Command = "nazwa hosta \ ndf -h \ nexit \ n"; spróbuj jsch jsch = new jsch (); Sesja sesji = JSCH.GetSession (Użytkownik, host, 22); sesja.seciuserinfo (nowy sshRemoteexampleUserInfo (użytkownik, hasło)); sesja.łączyć(); Channel Channel = Session.OpenChannel („Shell”); kanał.setInputStream (nowy bajteArrayInputStream (polecenie.GetBytes (StandardCharSets.Utf_8))); kanał.setoutputstream (system.na zewnątrz); InputStream in = kanał.getInputStream (); StringBuilder outBuff = new StringBuilder (); int exitstatus = -1; kanał.łączyć(); while (true) for (int c; ((c = in w.read ())> = 0);) OutBuff.append ((char) c);  if (kanał.isclosed ()) if (in.dostępny ()> 0) kontynuuj; exitstatus = kanał.getExitstatus (); przerwa;   kanał.rozłączyć się(); sesja.rozłączyć się(); // Wydrukuj system treści bufora.na zewnątrz.Wydrukuj (Outboff.ToString ()); // Wydrukuj system statusu wyjścia.na zewnątrz.print („Status wyjścia wykonania:” + exitstatus); if (exitstatus == 0) System.na zewnątrz.print ("(OK) \ n");  else System.na zewnątrz.print ("(nok) \ n");  catch (ioException | jschException ioex) System.błądzić.println (IOEX.ToString ());  
Kopiuj

Zauważ, że w tym przykładzie kodowaliśmy każdy szczegół potrzebny dla połączenia: nazwa hosta docelowego, nazwa użytkownika/hasło i ciąg polecenia, który ma zostać wykonany w sesji zdalnej. To nie jest prawdziwy przykład, ale służy celom demonstracyjnym.

Możemy zmienić cel i poświadczenia, aby wykonać polecenie na zdalnym hoście. Należy również pamiętać, że sesja zdalna będzie miała uprawnienia użytkownika, który loguje się. Nie radziłbym używać użytkownika o wysokich uprawnieniach - takich jak źródło - Do testowania, jeśli maszyna docelowa zawiera cenne dane lub usługi.

Uruchamianie aplikacji

Możemy uruchomić naszą aplikację bezpośrednio z IDE, klikając „Uruchom Project (SshRemoteexample)” w menu „Uruchom”, który zapewni wyjście w oknie wyjściowego poniżej kodu źródłowego. Możemy również wybrać „Clean and Build Project (sshRemoteexample)” z tego samego menu, w którym to przypadku IDE wytworzy .słoik Archiwum Java można wykonać bez IDE.

Dostarczone dane wyjściowe pokaże ścieżkę do archiwum, podobna do następujących (dokładna ścieżka może się różnić w zależności od ustawień IDE):

Aby uruchomić tę aplikację z wiersza poleceń bez mrówki, spróbuj: java -jar "/var/projekty/sshremoteexample/dist/sshRemoteexample.słoik" 

Jak można się domyślać, możemy uruchomić naszą aplikację zbudowaną z wiersza poleceń, a jeśli wszystko pójdzie dobrze, zapewni ona wyjście podobne do następujących.

$ java -jar "/var/projekty/sshshellexample/dist/sshshellexample.JAR "Ostatni login: pon. 29 lipca 14:27:08 2019 od 127.0.0.1 nazwa hosta df -h exit [test@test1 ~] $ hostName Test1.Linuxconfig.ORG [test@test1 ~] $ df -h Rozmiar systemu plików używany Używany% zamontowany na devTMPFS 3,9G 0 3,9G 0% /dev TMPFS 3,9G 127M 3,8G 4% /dev /sHM TMPFS 3,9G 1 , 7m 3,9 g 1% /uruchom 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-live-home 60g 50g 6,9g 88% /home home /Dev/SDA1 200m 18m 182m 9%/boot/efi tmpfs 789m 9,7m 779m 2%/Użytkownik/użytkownik/1000 TMPFS 789m 0 789m 0%/uruchom/użytkownik/1001 [test@test1 ~] $ Status wyprostowania wyciągu wyciągnięcia wyciąg wykonania: 0 (OK)

Zauważ, że twoje wyjście prawdopodobnie będzie się różnić, jeśli nic więcej, w nazwie hosta, nazwach woluminów i rozmiarach - ale ogólnie rzecz biorąc, powinieneś zobaczyć kompletne df -h Wyjście, które uzyskasz w sesji SSH.

Końcowe przemyślenia

Ten prosty przykład miał pokazać moc projektu JSCH, jeśli w nieco uproszczony sposób. Dzięki dostępowi do komputera testowego i odpowiedniego klienta, następujące proste polecenie dostarczyłoby te same informacje:

$ ssh test@localhost "nazwa hosta; df -h"

I nie stworzyłby również interaktywnej sesji. Ta sama funkcjonalność jest dostarczana przez JSCH, jeśli otworzysz kanał w trybie poleceń:

Channel Channel = Session.OpenChannel („Command”);

W ten sposób nie musisz obsługiwać zamknięcia sesji z Wyjście polecenie powłoki.

Prawdziwa moc tego projektu polega na możliwości łączenia się i wchodzenia w interakcje z zdalniejnymi poleceniami koryta natywnego, przetwarzania danych wyjściowych i decydowania o następnej akcji programowo. Wyobraź sobie wielowątkową aplikację, która sama w sobie zarządza setkami serwerów, a dostaniesz zdjęcie.

Powiązane samouczki Linux:

  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Samouczek ansible dla początkujących w Linux
  • Instalacja Oracle Java na Ubuntu 20.04 Focal Fossa Linux
  • Jak zainstalować Java na Manjaro Linux
  • Linux: Zainstaluj Java
  • Jak wykonywać operacje administracyjne z Ansible…
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Mastering Bash Script Loops
  • Samouczek Ansible Vault