SSH kapcsolat ami Netbeans (JAVA SE) alatt megy Eclipse (Android) alatt nem

Fórumok

Szükségem volna egy kis segítségre.
A problémám a következő:
Írnom kell egy olyan alkalmazást, ami SSH-val képes feljelentkezni egy szerverre.
A lényeg az volna, hogy létrejöjjön a kapcsolat, és tudjak parancsokat küldeni egy linux szervernek.
Tehát az, hogy lássak egy shellt nem lényeg... a lényeg az hogy elmenjen egy parancs a szervernek és visszakapjam a választ.

Gondolom ehhez SSL socketet kell használnom.
De önmagában ez nem elég az autentikációhoz.
Ha jól tudom publikus kulcs csere után enged be a szerver.
Esetleg el tudná ennél kicsit részletesebben magyarázni valaki a folyamatot, hogy mit vár a szerver, milyen formátumban, és milyen választ küld vissza milyen formátumban stb...

Amire még kíváncsi volnék, hogy létezik e JAVA-ban egy osztálynak olyan metódusa, ami pl. képes legenerálni a publikus és a privát kulcsot SSH-hoz... vagy ez nekem kell leprogramoznom?

előre is köszi a segítséget!

Hozzászólások

A gond az, hogy szakdolgozathoz kellene a fejlesztés
tehát az ollózás nem a legszerencsésebb dolog

ennyire bonyolult dolog írni SSH-hoz egy klienst?:)
nyilván kell egy kulcs amit el kell küldeni, ez nem lenne gond
a gond a kulcs generálása, bár még ezt is meg lehetne oldani
(pl. Linux szerverrel legeneráltatom aztán átmásolom magamnak egy fileba)

de jó az úgy ha a publikus kulcsot átadom egy String változónak, és SSL socketen keresztül ennek a változónak a tartalmát átküldöm a megadott IP 22-es portjára?

SSL socket nem alkalmas az adatok átküldésére?

Nem. Az SSH, az nem SSL. Az SSL, az nem SSH. Igen-igen kevés közük van egymáshoz.

Vagy használod az ssh binárist, vagy használsz egy libssh-szerű külső library-t, vagy megírod az egész ssh protokollt magad - ez utóbbi bőven meghaladja egy szakdolgozat szintjét.

Megtévesztő az elnevezése (Secure Socket layer) elsőre az ugrott be, hogy biztos ezt kell használni sima TCP socket helyett.

szóval használjak binárist, vagy külső library-t
tehát ha jól értem akkor a JAVA-nak nincs erre osztálya ill. metódusa
és a kódolás miatt igen bonyolult lenne egy saját osztályt írnom ehhez

hát ez elszomorító
az SSH egy eléggé általános protokoll
és nem a múlt héten jelent meg :)

igazán írhattak volna egy osztályt ami String értéket fogad el és kódolt üzenetet ad vissza ami egy ssh socket-el át is küldhető lenne :)

én is látom amit látok,
hogy csak beszólni jöttél fel :)
ezért kár volt :)
amúgy hidd el hogy sokan még ott sem tartanak mint én :)
ez az igazán szomorú :)
én legalább telepítettem egy céges Zabbix monitorozó rendszert Linuxra
és most ehhez készülök androidra írni egy kliensprogramot
de persze fel is találhatnám a teleportot :)
az látványosabb lenne :)

"tehát ha jól értem akkor a JAVA-nak nincs erre osztálya ill. metódusa
és a kódolás miatt igen bonyolult lenne egy saját osztályt írnom ehhez"

Nem beszólni jöttem. De ilyen kijelentések után nem tudtam megállni, sorry... Nem érdekel, hogy vannak akik még ott sem tartanak mint te, ez nem kifogás. Nem kell akkor ezzel a szakmával foglalkozni, ennyire egyszerű.
--
HUPbeszolas FF extension

akkor elmondom amire tettem már utalást
nem vagyok és nem is leszek programozó!
viszont enélkül nem fogadják el a szakdolgozatom
szóval megerőltetem magam és valami olyasmit csinálok most amit nem is akartam és amihez kevésbé értek :)
nyugodtan szidhatsz, hogy rossz programozó lennék...
ez így van!
mivel nem is vagyok és leszek az :)
más kérdés?

egyébként lehet hogy rosszul fogalmaztam meg, de igazam van
a JAVA jelentős időráfordítással képes csak SSH kapcsolatra, RSA kódolással kulcsgenerálásra, ill. üzenetek küldésére és fogadására SSH kapcsolaton keresztül.
Egy teljesen saját kliens leprogramozása nekem túl sokáig tartana.

De ha az Oracle vette volna a fáradtságot és írt volna egy csomagot amiben szerepelt volna néhány osztály és metódus ami lehetővé teszi az ssh kapcsolat gyors felépítését és az üzenetek küldését akkor nem lennék most itt :)

tehát miért is vagyok annyira sötét?:)

nyilván képes a JAVA ssh kapcsolat létrehozására, ezt nem is vitattam, de nem olyan egyszerűen mint ahogy egy TCP socket segítségével át lehet küldeni a hálózaton mondjuk egy String változó értékét egy folyamon keresztül.

Egy ingyenes open source monitorozó rendszerről a Zabbixról írom a szakdolgozatom.
Debian Linuxra telepítettem fel a szervert postgresql adatbázissal.
Maga a konfigurálás és a funkciók bemutatása ill. néhány script megírása nem elég
Ki kellett találnom valamit ami saját fejlesztés.
Így jött képbe az Android és a JAVA.
A zabbixnak van egy Zabbix_get nevű futtatható és paraméterezhető állománya, ami minden monitorozott hostról bármilyen információt vissza tud adni.
Tehát a cél egy olyan androidos alkalmazás megírása ami SSH-n keresztül el tudja küldeni ezeket a lekérdezéseket a szervernek, és megjeleníti a visszatérési értékeket.

a parancsok valahogy így néznek ki: zabbix_get -s IP cím -k "parancs"

ezeket kell majd átküldeni a hálózaton és ezek adnak majd információkat a hostokról

tulajdonképpen a onnantól kezdve, hogy jönnek vissza értékek ezekből akár diákat is lehetne csinálni

amennyire lesz időm, próbálok majd egy minél jobb és minél könnyebben használható programot írni
kb. erről van szó

valamiről írni kell...
és ez az ami tetszett is, és hasznosnak is találtam

a fejlesztés nem a jelentős része :D
csak a telepítés 10 oldal
és a funkciókról még nem is írtam semmit

Linuxon nem "next, next, finish" típusú telepítések vannak :)
pláne ha az ember időt szán a jogosultságok beállítására
(ráadásul konzolos Linuxról beszélgetünk...)
és a Zabbix szerverhez csináltam saját e-mail szervert is
az sem "next next finish" bonyolultságú

Elmondta, hogy nem programozó, nem tud programozni, nem is akar programozni, és sose lesz belőle programozó. Megkérdeztem, hogy akkor miért kell programot írnia a szakdolgozatához, és milyen szakdoga az, amihez ilyen programot kell írni. Azzal foglalkozik amivel akar, én nem tiltottam meg neki semmit, hogy is tehettem volna, nem vagyok az anyja.
Azt pedig nem tudtam, hogy itt csak konstruktívan lehet hozzászólni, azt meg pláne nem, hogy te mondod meg mi a konstruktív, és mi nem.
--
HUPbeszolas FF extension

azt áruld el, hogy mi bajod van?:)
szerintem a szakdolgozatommal a világon semmi baj nincs...
ismerek olyanokat akik weblapot dobtak össze
aztán a világon senki sem használta a weboldalt

én legalább valami olyat csinálok, ami használható

szerintem tanulj meg elismerni másokat
(nem magamra gondoltam...)

Én azt látom, hogy a minden szakdolgozathoz kötelező konzulens nevű funkcióhalmaz mintha hiányosan fejtené ki a kötelező tevékenységeit.

Sem át nem látja, hogy mi is a feladatod, és azt hogyan is kéne tudnod megcsinálni a te tudásszinteddel, sem pedig nem segít ki az erdőből, amikor sikeresen benavigáltad magadat oda, majd utána eltévedtél.

Szóval itt és most a konzulens mintha nem is létezne.
Szerintem.

Köszi szépen! működik az autentikáció :)
még a parancsküldéssel szenvedek sajnos

private Session sess;
private String command="mkdir /home/xyz";

sess.startshell();
sess.execCommand(command);

ez a rész még valamiért nem működik
mit rontok el?

a Linux szerverem auth.log filejában azt írja hogy beengedte a klienst

Oct 17 13:33:23 debian sshd[10807]: Accepted password for root...
Oct 17 13:33:23 debian sshd[10807]: pam_unix(sshd:session): session opened for...

de a parancsot nem hajtja végre

NullPointerException...

Akkor most gondold vegig, hol rontod el. Utana ird le, mire jutottal.

Valamint probalj meg informaciokat atadni nekunk, hogy segithessunk. Java eseteben hasznos lenne egy stacktrace (Pastebin!!!!), es a te kododbol a stacktrace-ben jegyzett kodreszlet.

Es legyszives, legkozelebb a kerdesben ird le a problemadat, mert senki nem fog veled belemenni egy kitalalosdiba. Minel tobb informaciot irsz le a problemadrol, annal pontosabb valaszokat fogsz kapni.

--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

rendben :)

itt a forrás:

package teszt;

import ch.ethz.ssh2.*;
import java.io.IOException;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Teszt {

private Connection conn;
private String ipcim="192.168.0.1";
private int port=22;
private String username="root", pass="password";
private Session sess;
public static void main(String[] args)
{
new Teszt().run(args);

}
public void run(String[] args)
{
try {
conn=new Connection(ipcim, port);
conn.connect();
conn.authenticateWithPassword(username, pass);
command="mkdir /tmp/xyz";
System.out.println("Kapcsolat létrejött? : "+conn.isAuthenticationComplete());
conn.openSession();
sess.execCommand(command);
sess.close();
conn.close();
} catch (IOException ex) {
Logger.getLogger(Teszt.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

hibaüzenet:
Kapcsolat létrejött?: true
Exception in thread "main" java.lang.NullPointerException
at teszt.Teszt.run(Teszt.java:35)
at teszt.Teszt.main(Teszt.java:19)
Java Result: 1

19. sor: new Teszt().run(args);
35. sor: sess.execCommand(command);

azt szeretném, hogy egy könyvtár létrejöjjön a szerver /tmp mappájában xyz néven
ha ez megtörténne látnám azt, hogy a parancs amit elküldtem ténylegesen el lett küldve és végre is lett hajtva

sajnos valamiért ez nem történik meg

ezt a libraryt használtam fel: http://www.cleondris.ch/ssh2/ganymed-ssh2-build251beta1.zip
ezek alapján: http://www.cleondris.ch/opensource/ssh2/javadoc/ (bal oldalon connection fül)

biztos hogy nagyon amatőr hibám van
de sajnos nem csináltam még ilyet, így nem jövök rá hogy mi a probléma

Jo tanacs: notepad elfelejt, Eclipse, Netbeans hasznalatba vesz. Inkabb Netbeans, az alahuzza az inicializalatlan valtozokat.
Ja, es az ilyen jelzeseket nem kikapcsolni, hanem elolvasni, hogy mit szeretne az IDE, megerteni, es megoldani.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

A gond az, hogy szakdolgozathoz kellene a fejlesztés
tehát az ollózás nem a legszerencsésebb dolog

Ha nem az a szakdolgozat címe, hogy: libssl implementáció Java-ban, akkor a legjobban teszed, ha felhasználsz egy meglévő lib-et. Mindent újraimplementálni egyáltalán nem szép mérnöki szempontból.

Én kb úgy csinálnám - talán ez a legegyszerűbb - feltéve, hogy nem kell több különböző platformon működni, hogy a Process p=Runtime.getRuntime().exec(...) hívással indítanék egy ssh klienst, és a p.getOutputStream() hívással kapott csatornába (vagy eleve a parancssorba) írnám azt amit küldeni akarok, illetve analóg módon olvasnám a kimenetet. Előnyök:

* nem kell natív illesztőt írni - használni. Ezekkel van a legtöbb gond Java alatt
* Nem kell egyedi implementációt karbantartani - pl egy security bugot fixálnak a protokollban, akkor csak frissíted az oprendszert, és a te programod is egyből biztonságos lesz.

A kulcs alapú autentikációt lehet parancssorból intézni, csak ki kell olvasgatni a manualból, meg password nélküli kulcsfájl kell, hogy a processz hozzáférjen user interakció nélkül a kulcshoz. Persze így kérdéses a biztonság (ha megtörik a gépet, azonnal oda a kulcs), de valamit valamiért.

Android fórumra feltettem ezt a témát, de mivel egyre sürgősebb a probléma megoldása ezért kiteszem ide is a linket

http://hup.hu/node/108017

Előre is köszi ha valaki tud segíteni!