Ausführen einer Funktion als Root im Shell-Skript


4

Ich möchte ein Skript erstellen und dieses einem Shortcut-Launcher hinzufügen ...
Wenn ich auf das Symbol doppelklicke, wird ein Terminalfenster geöffnet (fertig)

Im Terminal wird zuerst nach dem Root-Passwort gefragt und dann einige Dinge mit Root-Rechten ausgeführt (ich möchte es als Funktion erstellen).

Danach schließt es am Ende des Skripts das Fenster wie "Drücken Sie eine beliebige Taste, um das Fenster zu schließen" (ich kann es tun)

#!/bin/sh
touchpad(){
    whoami
}
sudo -S touchpad # but it return error "command not found"

Wie führe ich eine Funktion als Root-Benutzer aus oder gibt es eine andere Möglichkeit, dies zu erreichen?

BEARBEITEN:
Ich habe es versucht#! / bin / bash

sudo ./main2.sh #this did not work when I made it as a launcher
exit 

Dies ist mein aktueller Code (nach dem Googeln):

#!/bin/bash

gksudo -m "Input Password" clear
sudo whoami
#sudo bla bla bla
read -n 1 -p "Press any key to close window"

Dies ist, was ich will, aber es ist ein Fehler aufgetreten, wenn ich dreimal das falsche Passwort eingebe.Wie erzwinge ich das Verlassen des Hauptfensters, wenn gksudo fehlschlägt?

0

what about using gksudo instead? It will prompt user for entering password. Then it should work with just sudo.


1

You can't. To do it, you need to put the function in another script, and run that script with sudo.

Sudo only runs commands, it cannot access functions inside your script, as it runs in a separate process. If you insist on running a function in your script, you could run the script again with sudo, but pass it an argument with $1 that runs the function directly.


2

Test the return value of gksudo:

if ! gksudo -m "Input Password" clear ; then
    echo Bad password
    exit 1
fi

1

IMHO ... Simplest way to run the entire script as root without having to remember that it needs to be run as root It seems like it should work for what you are trying to accomplish

#!/bin/bash
dScript=$0
if [[ ${UID} -gt 0 ]] ; then
    sudo ${dScript}
    exit
fi
### the rest of your script

0

You actually can do that:

Assuming that you are logged in as a root user and you want to run a function for a different user other than root, you can use export -f option in your script for that function. For example:

#!/usr/local/bin/bash

user="${SUDO_USER:-$USER}"
whomomlikes(){
   echo "Hello!! $(whoami)";
}
main()
{
  export -f whomomlikes;
  su $user -c "bash -c whomomlikes";
}
main;

Not that it would only work for the exported function, if you have variables declared in other functions then you have to export them similarly and then run them accordingly.