Script ausführen

  • Gute Abend zusammen,
    ich werte zurzeit Änderungen am GPIO Pin aus. Dazu verwende ich die wiringpi Bibliothek.
    Sobald der GPIO von 1 auf 0 wechselt, möchte ich ein shell script ausführen. Dies funktioniert auch über die system() Funktion.
    Das Problem an der ganzen Sache ist nun, mein Hauptprogramm muss ich da ich wiringpi verwende als sudo ausführen. Mein shell script hingegen sollte als normaler user ausgeführt werden. Tritt nun das Ereigniss ein, wird mein shell script auch ausgeführt, allerdings also sudo.
    Gibt es hier eine Möglichkeit das zu unterbinden?

  • Ja ... über einen -> fork() <- ein Duplikat des aktuellen Prozesses erzeugen, mit -> setuid() <- im zweiten Prozess die gewünschte User- und mit -> setgid() <- die gewünschte Benutzergruppe festlegen und dann mit -> exec() <- das script ausführen.

    Aber es geht evtl. auch etwas einfacher:

    Code
    su -c scriptname <user>


    cu,
    -ds-

  • Ja habe es beim 3. mal lesen auch verstanden;)

    Code
    system (" su -c /home/pi/Dta/xy.sh pi");


    funktioniert nicht. habe es noch anders versucht.


    Code
    system (" su - |USER| /home/pi/Dta/xy.sh pi");

    |USER| entsprechend dem Benutzer bei mir pi abändern. So scheint das ganze zu Funktionieren. Ich Danke dir für die Hilfe.

    Habe nun aber noch eine andere Frage, was muss ich machen, damit mein C Script mein Raspberry nicht so auslastet?

    Einmal editiert, zuletzt von marcel (15. August 2015 um 20:05)

  • Hi,
    hm ... hatte das nur mal auf die Schnelle unter Ubuntu ausprobiert ... da klappt es

    Code
    root@saturn:~# su -c ./yy.sh user
    user
    root@saturn:~#


    in yy.sh steht nur

    Bash
    #!/bin/bash
    #
    echo $USER

    aber egal ... wenn's jetzt funktioniert.


    Habe nun aber noch eine andere Frage, was muss ich machen, damit mein C Script


    Es gibt keine C-scripts :fies:
    C ist kein Interpreter wie bash, python, php, ... sondern eine Hochsprache, die mittels Compiler in Binärcode umgewandelt wird.


    ... mein Raspberry nicht so auslastet?


    dazu müsste man jetzt eine Kristallkugel befragen, die Deinen Sourcecode anzeigt ...
    Kristallkugeln sind aber sehr teuer, und da ihr hier nichts bezahlt, müssen wir auf Glaskugeln zurückgreifen. Die zeigen aber keinen Sourcecode an ;)
    cu,
    -ds-

  • Hallo Marcel,


    Habe nun aber noch eine andere Frage, was muss ich machen, damit mein C Script mein Raspberry nicht so auslastet?

    Ich lege meine Programme, wenn sie zuviel zur Prozessorauslastung beitragen, schlafen.

    Meist reicht ein

    Code
    delay(20);

    um das Programm für 20 ms zum Schlafen zu bringen.
    Die Zeile ist am besten in der Hauptschleife / Hauptereignisschleife angebracht.

    Aber da wir Deinen Quellcode nicht kennen, ist alles Weitere pure Spekulation.


    dreamshader:
    C ist nur deshalb keine Interpretersprache, weil noch keiner einen C-Interpreter geschrieben hat. ;)

    Da fällt mir etwas dazu ein:
    Ich hatte mal einen Assembler/Disassembler für den 6502-Prozessor geschrieben.. ähem ... in der Programmiersprache BASIC. Als das Programm dann lief, habe ich noch etwas draufgesetzt, was man als Einzelschrittbearbeitung oder auch als Interpreter für Maschinencode bezeichnen kann. Wann immer auf Code gestoßen wurde, der zum Absturz führen würde, hat das Programm die Abarbeitung abgebrochen statt das gesamte System ins Nirwana zu schicken. Das hat tatsächlich funktioniert, die Abarbeitung des interpretierten Maschinencodes war aber um den Faktor 1000 langsamer als eine BASIC-Version davon. Aber zum Fehlerfinden was das genial!


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (15. August 2015 um 21:18)

  • [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]> C ist nur deshalb keine Interpretersprache, weil noch keiner einen C-Interpreter geschrieben hat.[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Diese Behauptung ist falsch.[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Es gab sogar mal einen kommerziellen Interpreter, ich glaube er hiess "C-Terp".[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Es gab auch ein paar andere Interpreter, haeufig fuer den internen Gebrauch[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]und deshalb wenig bekannt.[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Und einer ist abgedruckt in "Born to Code in C" von Herbert Schildt (1989)[/font]

    Einmal editiert, zuletzt von Tell (15. August 2015 um 21:48)

  • Autsch ... Tell ist mit Windows(?) unterwegs ??


    \[color=#333333\] \[font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif\"]>
    C ist nur deshalb keine Interpretersprache, weil noch keiner einen C-Interpreter geschrieben hat.[/font][/color]


    diese C-Interpreter ( nicht zu verwechseln mit Interpreten ;) ) kenne ich auch noch ...
    Das ist aber wohl OT hier ;)
    (Ein Fachbuch aus 1989 ... wie geil ist das denn :) ).

    cu,
    -ds-

  • Ich wollte auch per C++-Programm Shellbefehle als anderer Benutzer (nicht root) absetzen. Verwendet wird Raspbian 7.1.

    Die hier aufgeführten Übergabeparameter der Funktion system() führten nicht zum gewünschten Ergebnis. Scheinbar lag es an Feinheiten.
    Nach etwas rumprobieren kam folgende Syntax heraus:

    Code
    #include <stdlib.h>
    system ("su -c \"Befehl\" Benutzer");

    Befehl entspricht dem, was man ausführen möchte.
    Benutzer sollte klar sein ;)

    Beispiel: Im aktuellen Verzeichnis legt der Benutzer "pi" einen neuen Ordner namens "test" an.

    Code
    #include <stdlib.h>
    system (su -c \"mkdir test\" pi");


    Nun stellt sich mir noch die Frage, ob und wenn ja, wie man Variablen übergeben kann.
    Ein minimalistisches Beispiel:
    Man erstellt eine Variable, lässt den Benutzer einen Zahlenwert in die Variable schreiben und erstellt dann einen Ordner, dessen Namen dem Variablenwert entspricht. Mit dem angegebenen Quellcode wird (na klar) ein Ordner namens "ordnernummer" erstellt.

    Einmal editiert, zuletzt von Benandi (6. September 2015 um 13:55)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!