Hallo, ich habe folgendes Problem. Auf dem Android 8.0 NVIDIA SHIELD TV habe ich x-plore file Manager und BusyBox installiert. Die Shield ist gerootet. Mein Ziel ist mit einem Programm ein Skript.sh auszuführen. Das Programm führt den Befehl zu einem gewissen Zeitpunkt mit „command:///storage/emulated/0/Download/Befehle/Skript.sh“ aus. Das Programm sagt mir beim ausführen des Skripts aber „Permission Denied“. „Ich habe einen Ordner mit dem Namen „Befehle „im Ordner „Download“ erstellt der genaue Pfad ist: „/storage/emulated/0/Download/Befehle.skript.sh Wenn ich im File Manager in dem Pfad das Script direkt ausführe, funktioniert es tadellos. Im File Explorer gibt es 2 Bereiche: sdcard = /Storage (interner gemeinsamer Speicher) Und /root... Unter Root kann ich der Datei „Skript.sh“ schreib, lese und ausführende Rechte geben. Unter Storage ist es nicht möglich. Leider habe ich von den Erlaubniss Rechten und der Android Verzeichnissstruktur keine Ahnung. Gibt es einen Ordner/Pfad wo das Programm beim gerooteten SHIELD TV die Rechte hat das Skript auszuführen oder gibt es eine Android App, welche dem Ausführenden Programm Superuser Rechte gibt, und würde dies überhaupt helfen?
Aus sicherheitsgründen (da dort keine Zugriffsrechte existieren) ist der gemeinsame Speicher als noexec gemountet. Dies ließe sich möglicherweise mit einem remount (was root braucht) verändern, würde ich aber nicht empfehlen, das hat schon seine Gründe wieso das normalerweise nicht geht, außerdem dürfte es etwas schwierig werden, das ganze automatisch zuverlässig zu remounten. Besser dürfte es sein, wenn du dein Skript einfach in den App Data Ordner (Meist unter /data/data/[Package Name] zu finden), dafür bräuchte man nicht Mal root, um das dorthin zu packen (das ginge per adb). Ansonsten gäbe es noch /data/local das wird oft für sowas in die Richtung benutzt und da sollte es normalerweise nicht mit irgendetwas ins Gehege kommen. Dafür braucht die App die das ganze ausführen soll, aber root rechte.
Danke vorab schon mal. Also ich habe jetzt mein file: "flat.sh" in den root Ordner:" /data/data/org.xbmc.kodi" verschoben. Das File hat schreib, lese und execute Rechte für alle. Direkt in dem Ordner ausgeführt läuft es super. In dem Programm so ausgeführt:"command:///data/data/org.xbmc.kodi/flat.sh" bekomme ich die Meldung: "no such file or directory!" Das File sieht so aus: #!/bin/ash echo -ne "POPLP 02\r\n" | tee | nc 192.168.188.52 1002 und wird mit BusyBox ausgeführt deswegen #!/bin/ash. Funktioniert wie gesagt im x-plore file Manager tadellos. Könnte es sein, das die Pfadangabe zum root falsch ist? Kann ich denn überhaupt direkt dahin verweisen? Habe im Anhang mal die Übersicht. Ich schnall das nicht. Bin schon 2 Wochen am verzweifeln mit diesem Android
Beitrag #5908133 wurde vom Autor gelöscht.
Kurzer Nachtrag: Unter "/data/local" das gleiche Ergebnis: "no such file or directory!" Zusammenfassend kann ich sagen: 1. Führe ich das Skript aus dem "Internen gemeinsamen Speicher" aus, bekomme ich die Meldung: Permission Denied, da ich die Erlaubnisse -lesen, schreiben, ausführen- nicht einstellen kann. 2. Führe ich das Skript aus "Root" aus, bekomme ich die Meldung: "no such file or directory!" Hier kann ich die Erlaubnisse - lesen, schreiben, ausführen- zwar setzen, das auszuführende Programm scheint aber den Pfad "/data/data/org.xbmc.kodi/flat.sh" nicht zu finden. Aber es muss doch irgendwie gehen. Ich wüsste auch nicht wie man dem Programm Superuser Rechte vergibt, da weder die APP "Superuser" noch "SuperSU" auf der Shield laufen. im Anhang noch einmal ein Screenshot wie der File Explorer das Skript funktionsfähig ausführt! Vielleicht hilft das ja weiter
Jens schrieb: > Unter "/data/local" das gleiche Ergebnis: "no such file or directory!" Liegt das vielleicht daran, dass dein file explorer das Programm mit "sh" ausführt, du es per shebang aber mit "/bin/ash" starten möchtest? Schau mal nach, ob dein android überhaupt ein "/bin/ash" hat, und überleg, ob du das brauchst oder ob's ein '#!/bin/sh' nicht auch tut.
Wobei #!/bin/ash ja auch Quatsch ist. Da steht /bin/ash bestimmt nicht. Eher /system/bin/ash. Protipp: Einfach das #!-Gedoehns ganz weglassen und durch eine Leerzeile ersetzen.
... schrieb: > Da steht /bin/ash bestimmt nicht. Jens schrieb: > Das File sieht so aus: > > #!/bin/ash
> ... schrieb: >> Da steht /bin/ash bestimmt nicht. > Jens schrieb: >> Das File sieht so aus: >> >> #!/bin/ash Du kannst vielleicht lesen, aber scheinbar nicht verstehen. Gibt es kein utube-Video fuer dich? Unter Android gibt es keine /bin/ash. Hoechstens eine /system/bin/ash. Ein #!/bin/sh wird immer fehlschlagen. Ausser das "ausfuehrende Organ" sourced das Shellskript. Da ist der missleitende Kommentar dann natuerlich egal. Aber den Unterschied kennst du wohl auch nicht.
Unter der Annahme, dass '...' und '$$$' dieselbe Person sind: Ich versuch's nochmal langsam in einfachen Sätzen: 1) Du behauptest: "Da steht /bin/ash bestimmt nicht." {umformuliert} ==> Im Programm von Jens steht kein "/bin/ash" 2) Ich kopiere dir den Quelltext-Ausschnitt, den Jens bereitgestellt hat, in dem eben doch "/bin/ash" verwendet wird. 3) Ich packe beide Info-schnipsel zum besseren Verständnis kurz hintereinander, ablenkungsfrei in einem Post. 4) Mein Android hat ein '/bin/sh', aber kein '/bin/ash' oder '/bin/bash'. Ist nicht gerootet, stock Motorola. Für Jens: der shebang bewirkt nicht, dass der Dateiinhalt "gesourced" wird. Der eigene Dateiname wird als Parameter übergeben. Ein Test-Programm mit '#!/bin/cat' und eins mit '#!/bin/echo' hilft, den Mechanismus zu verstehen. Im Screenshot wo "es funktioniert", machst du (bzw. dein Filemanager) genau das. Er ruft "sh" auf (aus dem $PATH) und übergibt das Script als Parameter. Such, wo dein Android sein "sh" executable hat, und trag das in deinen Quelltext in der ersten Zeile ein. Wenn dein Android sowohl "/bin/sh" als auch "/system/bin/sh" hat, würde ich das erste bevorzugen (Geschmackssache), weil das Script dann auch mit einem Desktop-Linux kompatibel bleibt.
:
Bearbeitet durch User
Erst mal vielen Dank für die Hilfe. Hier nun mein aktueller Stand: Mein Skript liegt an folgendem Ort: /data/data/org.xbmc.kodi/flat.sh Das Skript hat in der ersten Zeile folgendes stehen: #!/system/bin/sh Das Skript wird jetzt beim ausführen ohne Fehler im Programm angezeigt (siehe Anhang), aber der Befehl wird nicht ausgeführt. Meine Frage: Wie finde ich denn mein „sh“ executable? Was ich komisch finde ist das daß Skript irgendwie nicht ausgeführt wird, aber kein Fehler im Programm angezeigt wird. Im Explorer ist es nach wie vor ausführbar und funktioniert.
Wenn du das "#!/system/bin/sh" durch "#!/system/bin/sh -x" ersetzt, oder alternativ darunter "set -x" hinschreibst, sollte es jedes Kommando, das es ausführt, anzeigen. Zumindest sofern die Ausgabe überhaupt irgendwo hin geht. Gib auch eventuell mal die "$PATH" variable aus, die gibt an, wo die shell nach den Kommandos sucht (kann man dann auch ändern). Und mit "type irgend-ein-commando" solle dir jeweils angezeigt werden, was ein kommando ist und woher es kommt.
Hallo ich habe mit „$PATH“ hinter dem Befehl folgendes angezeigt bekommen (siehe Anhang). Leider kann ich damit nicht viel anfangen. Das „Type irgend-ein-commando“ verstehe ich leider auch nicht. Kann jemand etwas mit dem Anhang anfangen oder hat noch eine Idee? Ich weiß auch immer noch mit wie ich herausfinden kann wo mein Android sein“.sh“ executable hat oder wie dieses zu finden ist
Der Sinn der Sache ist, dort wo es nicht geht, herauszufinden, was
anders ist, warum es nicht geht, und schlussendlich, was geändert werden
muss damit es geht. (also debugging).
Das ausgeben der $PATH variable kann man z.B. mit dem Kommando "echo
$PATH" machen. Das gibt irgendetwas in die Richtung "/bin:/usr/bin" oder
so aus, und dann weiss man, die Shell würde in den Verzeichnissen /bin
und in /usr/bin nach Kommandos suchen.
Bezüglich des "type irgend-ein-commando", "type" ist ein builtin
Kommando das jede sh shell hat, oder zumindest haben sollte. Schreibst
du z.B. das Kommando "type nc", dann sollte es etwas in die Richtung "nc
is /usr/bin/nc" ausgeben. Schreibst du "type printf", gibt es vermutlich
"printf is a shell builtin" aus.
Die Idee ist, dass du dort wo es ging nachsehen kannst, wo die Kommandos
gefunden wurden, und dort, wo es nicht ging, ob es dort nicht gefunden
wurde, und ob man eventuell die PATH variable anpassen muss, damit es
gefunden wird. Mit dem "set -x" siehst du, was ausgeführt wird. Mit "set
-ex" bricht es zusätzlich beim ersten Fehler ab, dann sieht man, wo als
erstes was schief lief.
Damit das geht, muss man aber die Ausgabe des scriptes sehen. Falls man
das dort wo es nicht geht nicht kann, könnte man versuchen die Ausgabe
der Shell in eine Datei umzuleiten, mit "exec
>/pfad/zu/datei/in/die/alles/reingeschrieben/werden/soll.txt 2>&1"
Ich hoffe die Ausführung habe ich richtig gemacht. Ich habe mich mit Putty auf meinem Android eingeloggt also die Befehle nicht direkt auf dem Android ausgegeben. Das Kommando "echo $PATH" gibt bei mir folgendes aus. /data/data/0/com.arachnoid.sshelper/bin:/sbin:/system/sbin:/system/bin:S ystem/xbin:/vendor/bin:/vendor/xbin:/odm/bin Kommando "type nc": nc is /data/user/0/com.arachnoid.sshelper/bin/nc Kommando "type printf": + type printf printf is a shell builtin Set -x habe ich im Anhang gemacht. Kann man damit evtl. schon eine Aussage machen?
Zitat:
[Damit das geht, muss man aber die Ausgabe des scriptes sehen. Falls man
das dort wo es nicht geht nicht kann, könnte man versuchen die Ausgabe
der Shell in eine Datei umzuleiten, mit "exec
>/pfad/zu/datei/in/die/alles/reingeschrieben/werden/soll.txt 2>&1"]
In dem Programm was das ganze nicht ausführt kann ich das wirklich nicht
so eingeben. Die Sache mit der Umleitung ist mir leider nicht ganz klar
trotz der ausführlichen Beschreibung sorry
Soll ich: 1. #!/bin/sh echo -ne "POPLP 02\r\n" | tee | nc 192.168.188.52 1002 in eine Text datei schreiben und mit dem Programm dann den Pfad zu dem Text File so angeben?: 2.>/pfad/zu/datei/in/die/alles/reingeschrieben/werden/soll.txt 2>&1"
Ok, ich denke es gibt da 2 Sachen, die man ändern muss, damit das geht. Die sh shell ist in der regel eine POSIX kompatible shell. Das heist, das echo darin kennt die Argumente -ne nicht. Das muss man also mit printf ersetzen. Das tee ohne Argument ist sinnlos und lässt man besser weg. Das grösste Problem wird aber nc sein. Das ist in "/data/user/0/com.arachnoid.sshelper/bin/nc". Ich nehme mal an, das sshelper ding ist das, wo du dich mit ssh drauf verbindest. Wenn du das über putty machst, ist das im path. Wenn das Program, in dem es nicht geht, das aufruft, ist das dort vermutlich dann aber nicht im $PATH, und selbst wenn, kann es dann womöglich gar nicht darauf zugreifen. Passe das Script erstmal so an:
1 | #!/system/bin/sh
|
2 | export PATH="$PWD:$(dirname "$0"):/data/user/0/com.arachnoid.sshelper/bin/:$PATH" |
3 | printf 'POPLP 02\r\n' | nc 192.168.188.52 1002 |
Wenn das noch nicht geht, kopiere /data/user/0/com.arachnoid.sshelper/bin/nc mal ins gleiche Verzeichnis, in dem auch dein Script ist. Falls das dann immer noch nicht geht, müsste man noch mit stat und ldd nachschauen, ob es ein symlink ist oder noch irgendwelche Libraries braucht.
Jens schrieb: > Soll ich: > > 1. > #!/bin/sh > echo -ne "POPLP 02\r\n" | tee | nc 192.168.188.52 1002 > in eine Text datei schreiben und mit dem Programm dann den Pfad zu dem > Text File so angeben?: > > 2.>/pfad/zu/datei/in/die/alles/reingeschrieben/werden/soll.txt 2>&1" Nö, das ist so gedacht:
1 | abre2@PSTNABRE201:/mnt/c/Users/abre2$ cat test.sh |
2 | |
3 | exec >ausgabe.txt 2>&1 |
4 | set -x |
5 | |
6 | echo test |
7 | |
8 | fghjkl |
9 | abre2@PSTNABRE201:/mnt/c/Users/abre2$ ./test.sh |
10 | abre2@PSTNABRE201:/mnt/c/Users/abre2$ cat ausgabe.txt |
11 | ++ echo test |
12 | test |
13 | ++ fghjkl |
14 | ./test.sh: line 7: fghjkl: command not found |
15 | abre2@PSTNABRE201:/mnt/c/Users/abre2$ |
Mit so einer exec zeile im Script kannst du dir die Ausgabe vom script so in ne Datei schreiben lassen.
Hallo, es hat geklappt. Vielen Dank für eure Geduld und Hilfe. Ich bin total happy :-) Ich habe das Skript wie du sagtest angepasst: #!/system/bin/sh export PATH="$PWD:$(dirname "$0"):/data/user/0/com.arachnoid.sshelper/bin/:$PATH" printf 'POPLP 02\r\n' | nc 192.168.188.52 1002 Dann habe ich das Script nach "/data/user/0/com.arachnoid.sshelper/bin/nc" kopiert. Und es läuft einwandfrei. Danke DPA und alle anderen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.