FileNotFoundException bei Referenzierung auf RAW-Ordner

  • Antworten:3
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 4

16.01.2017, 14:35:08 via Website

Hallo Liebe Community,

ich schreibe derzeit eine Android App, um mein Raspberry Pi mit SSH-Befehlen zu steuern. Dabei würde ich gerne mit meinem generierten Key die Verbindung herstellen. Um diesen Key hinzuzufügen benöte ich die Funktion addIdentity. Leider verstehe ich nicht, wie ich diesen Key der Funktion hinzufügen kann. Aktuell sieht mein Quellcode so aus:

public ArrayList<String> sshBefehl(String nutzername, String ip, int port) throws Exception {
    try{
        JSch jsch = new JSch();

        String privateKey = ".raw/id_rsa";

        jsch.addIdentity(privateKey);

        byte[] buffer = new byte[1024];
        ArrayList<String> lines = new ArrayList<>();

        Session session = jsch.getSession(nutzername, ip, port);

        Properties prop = new Properties();
        prop.put("StrictHostKeyChecking", "no");
        session.setConfig(prop);

        session.connect();

        ChannelExec channelssh = (ChannelExec) session.openChannel("exec");
        Log.e("command",currentCommand);
        channelssh.setCommand(currentCommand);
        channelssh.connect();
        try {
            InputStream in = channelssh.getInputStream();
            String line = "";

            while (true) {

                while (in.available() > 0) {
                    int j;
                    j = in.read(buffer, 0, 1024);
                    if (j < 0) {
                        break;
                    }
                    line = new String(buffer, 0, j);
                    lines.add(line);
                }
                if (line.contains("logout")) {
                    break;
                }
                if (channelssh.isClosed()) {
                    break;
                }
                try {
                    Thread.sleep(1000);
                } catch (Exception ee) {
                }
            }
        } catch (Exception e) {
        }
        channelssh.disconnect();
        session.disconnect();

        return lines;
    }
    catch (Exception ex)
    {
        throw new RuntimeException("SSH connection failed: " + ex.getMessage(), ex);
    }

}

Quelle: stackoverflow.com/questions/49…h-key-based-communication

Dabei liegt die Key Datei in dem Ordner app/src/main/res/raw/id_rsa.ppk

Ich bekomme die Fehlermeldung:

SSH connection failed: java.io.FileNotFoundException: .raw/id_rsa: open failed: ENOENT (No such file or directory)

Das Programm findet die Datei wohl nicht.

Ich hoffe jemand kann mir bei meinem Problem helfen

Gruß
KronSii

— geändert am 16.01.2017, 15:05:41 durch Moderator

Antworten
Ludy
  • Mod
  • Blogger
  • Forum-Beiträge: 7.163

16.01.2017, 15:05:18 via Website

Hallo KronSii,

herzlich willkommen bei uns im Forum (*)

dein Titel war nicht ganz aussagekräftig, daher haben ich diesen etwas angepasst.

Bitte versuche, das nächste Mal, einen aussagekräftigeren Threadtitel zu wählen - lies dir dazu diesen Thread durch.


Deine raw-File Einbindung ist falsch - schau mal hier http://stackoverflow.com/questions/9752417/how-to-reference-a-file-in-raw-folder-in-android

oder

http://stackoverflow.com/questions/4087674/android-read-text-raw-resource-file

oder

http://www.41post.com/3985/programming/android-loading-files-from-the-assets-and-raw-folders

— geändert am 16.01.2017, 15:09:38

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

swa00

Antworten
  • Forum-Beiträge: 2.902

16.01.2017, 15:11:06 via Website

Hallo Kron,

Dein problem liegt ja sehrwahrscheinlich hier

JSch jsch = new JSch();
String privateKey = ".raw/id_rsa";
jsch.addIdentity(privateKey);

.raw/id_rsa ist natürlich kein File, also müsste die Bibiliothek was dort machen , was man aus deinem Code nicht
ersehen kann und die Bibliothek selbst kenne ich nicht .

[EDIT]
Sehe eben erst durch Ludy, dass das sehrwahrscheinlich im raw ist

Wenn deine Bibliothek aber ein physisches file benötigt , dann musst du es vorher erst auslagern
(Assets -> Storage)

— geändert am 16.01.2017, 15:17:07

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 4

17.01.2017, 15:30:59 via Website

Hallo,

vielen Dank für die schnellen Antworten.
Ich lese die Dateien nun in ein ByteArray ein und schicke diese an das Pi. Klappt wunderbar. :)

        InputStream privateKeyByteStream = getResources().openRawResource(R.raw.id_rsa);
        ByteArrayOutputStream byteArrayOutputStreamprivate = new ByteArrayOutputStream();

        int i;
        try
        {
            i = privateKeyByteStream.read();
            while (i != -1)
            {
                byteArrayOutputStreamprivate.write(i);
                i = privateKeyByteStream.read();
            }
            privateKeyByteStream.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        InputStream publickeyByteStream = getResources().openRawResource(R.raw.id_rsapub);
        ByteArrayOutputStream byteArrayOutputStreampublic = new ByteArrayOutputStream();

        int k;
        try
        {
            k = publickeyByteStream.read();
            while (k != -1)
            {
                byteArrayOutputStreampublic.write(k);
                k = publickeyByteStream.read();
            }
            publickeyByteStream.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        JSch jsch = new JSch();
                  jsch.addIdentity("rsa_id",byteArrayOutputStreamprivate.toByteArray(),byteArrayOutputStreampublic.toByteArray(),null);

Gruß KronSii

Antworten

Empfohlene Artikel