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
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
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.
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:
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:
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.