Forum: PC-Programmierung Android Problem mit Berechtigung


von Jens (Gast)


Lesenswert?

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?

von Jan B. (do9jhb)


Lesenswert?

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.

von Jens (Gast)


Angehängte Dateien:

Lesenswert?

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.
von Jens (Gast)


Angehängte Dateien:

Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

... schrieb:
> Da steht /bin/ash bestimmt nicht.

Jens schrieb:
> Das File sieht so aus:
>
> #!/bin/ash

von $$$ (Gast)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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
von Jens (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Daniel A. (daniel-a)


Lesenswert?

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.

von Jens (Gast)


Angehängte Dateien:

Lesenswert?

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

von DPA (Gast)


Lesenswert?

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"

von Jens (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Jens (Gast)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

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"

von DPA (Gast)


Lesenswert?

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.

von DPA (Gast)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.