Essere Root nello script shell Linux

 

Esiste la necessità che alcuni script siano eseguiti come root, per prima cosa controlliamo che l’utente sia effettivamente root.

 

#!/usr/bin/sh

#

echo "Programma passaggio alla versione Tumbleweed per OpenSUSE"

ROOT_UID=0  ​​​​ # Root ha $UID 0.

 

if [ "$UID" -eq "$ROOT_UID" ]

then

 ​​​​ echo "Sei root."

else

 ​​​​ echo "Sei un utente normale e non puoi continuare ."

fi

 

 

Di sistemi di controllo esistono diversi, io preferisco questo.

Se non è utente root sarebbe bello farlo diventare, peccato che essendo root un utente diverso lo script non può continuare e quindi abbiamo diversi trucchetti.

1) Eseguire il singolo comando come root

2) Chiamare uno script come root

3) Eseguire una parte come root

4) Richiamare lo stesso script dopo esser root.

 

Come esempio generale vedremo uno script (da eseguire come root) per passare da Leap al ​​ Tumbleweed (tum-up.sh).

 

#!/usr/bin/sh

#

echo "Programma passaggio alla versione Tumbleweed per OpenSUSE"

echo "Creazione nuovi repo"

sudo mkdir /etc/zypp/repos.d/old

sudo mv /etc/zypp/repos.d/*.repo /etc/zypp/repos.d/old

### repository Tumbleweed

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/oss repo-oss

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/debug repo-debug

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/non-oss repo-non-oss

zypper ar -f -c http://download.opensuse.org/update/tumbleweed/ repo-update

#### repository Tumbleweed aggiuntivi

zypper ar -f -d -c http://download.opensuse.org/tumbleweed/repo/src-non-oss repo-src-non-oss

zypper ar -f -d -c http://download.opensuse.org/tumbleweed/repo/src-oss repo-src-oss

# Aggiornamento

echo "Attendere Aggiornamento"

zypper dup

if [ !"$?" = 0 ​​ ]; then

 ​​​​ echo "Miglioramento necessario"

 ​​ ​​ ​​​​ zypper refresh --force

 ​​ ​​ ​​​​ zypper dist-upgrade

fi;

Echo "Finito"

 

1) Eseguire il singolo comando come root

 

Abbiamo il comando sudo per far questo e quindi

Basta usare il comando sudo prima di eseguire quella riga.

#!/usr/bin/sh

#

echo "Programma passaggio alla versione Tumbleweed per OpenSUSE"

echo "Creazione nuovi repo"

sudo mkdir /etc/zypp/repos.d/old

sudo mv /etc/zypp/repos.d/*.repo /etc/zypp/repos.d/old

### repository Tumbleweed

sudo zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/oss repo-oss

sudo zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/debug repo-debug

sudo zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/non-oss repo-non-oss

sudo zypper ar -f -c http://download.opensuse.org/update/tumbleweed/ repo-update

#### repository Tumbleweed aggiuntivi

sudo ​​ zypper ar -f -d -c http://download.opensuse.org/tumbleweed/repo/src-non-oss repo-src-non-oss

sudo ​​ zypper ar -f -d -c http://download.opensuse.org/tumbleweed/repo/src-oss repo-src-oss

# Aggiornamento

echo "Attendere Aggiornamento"

sudo zypper dup

if [ !"$?" = 0 ​​ ]; then

 ​​​​ echo "Miglioramento necessario"

 ​​​​ sudo zypper refresh --force

 ​​​​ sudo zypper dist-upgrade

fi;

Echo "Finito"

 

La password verrà chiesta solo la prima volta e successivamente si intende accettata, peccato che la cosa sia poco elegante.

 

2) Chiamare uno script come root

 

In questo caso abbiamo bisogno di un altro file (lancio.sh):

#!/usr/bin/sh

#

echo "mio"

# dbus-launch ./lancio2.sh ​​ -qwindowtitle

/usr/bin/xdg-su -c ./tub-up.sh

 

Il comando xdg-su chiama non solo il comando per divenire root ma se in ambiente grafico attiva pure un box (GUI) dove introdurla.

Poi grazie all’opzione “-c”, se la password è corretta, ​​ lancerà il file scelto come utente root.

 

3) Eseguire una parte come root

 

#!/usr/bin/sh

#

echo "Programma passaggio alla versione Tumbleweed per OpenSUSE"

echo "Creazione nuovi repo"

if [ "$UID" -eq "$ROOT_UID" ]

then

 ​​​​ echo "Sei root. Adesso continui la modifica"

else

 ​​​​ echo "Sei un utente normale e devi autenticarti"

​​ su -c 'sh -s' <<EOF

# list of root commands

 

mkdir /etc/zypp/repos.d/old

mv /etc/zypp/repos.d/*.repo /etc/zypp/repos.d/old

### repository Tumbleweed

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/oss repo-oss

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/debug repo-debug

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/non-oss repo-non-oss

zypper ar -f -c http://download.opensuse.org/update/tumbleweed/ repo-update

#### repository Tumbleweed aggiuntivi

zypper ar -f -d -c http://download.opensuse.org/tumbleweed/repo/src-non-oss repo-src-non-oss

zypper ar -f -d -c http://download.opensuse.org/tumbleweed/repo/src-oss repo-src-oss

# Aggiornamento

echo "Attendere Aggiornamento"

zypper dup

if [ !"$?" = 0 ​​ ]; then

 ​​ ​​ ​​ ​​​​ echo "Miglioramento necessario"

 ​​ ​​ ​​ ​​​​ zypper refresh --force

 ​​ ​​ ​​ ​​​​ zypper dist-upgrade

fi;

EOF

exit

fi

 

mkdir /etc/zypp/repos.d/old

mv /etc/zypp/repos.d/*.repo /etc/zypp/repos.d/old

### repository Tumbleweed

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/oss repo-oss

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/debug repo-debug

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/non-oss repo-non-oss

zypper ar -f -c http://download.opensuse.org/update/tumbleweed/ repo-update

#### repository Tumbleweed aggiuntivi

​​ zypper ar -f -d -c http://download.opensuse.org/tumbleweed/repo/src-non-oss repo-src-non-oss

​​ zypper ar -f -d -c http://download.opensuse.org/tumbleweed/repo/src-oss repo-src-oss

# Aggiornamento

echo "Attendere Aggiornamento"

zypper dup

if [ !"$?" = 0 ​​ ]; then

 ​​ ​​ ​​ ​​​​ echo "Miglioramento necessario"

 ​​ ​​ ​​ ​​​​ zypper refresh --force

 ​​ ​​ ​​ ​​​​ zypper dist-upgrade

fi;

Echo "Finito"

 

In questo caso grazie al comando “su -c 'sh -s' <<” se la password è corretta eseguirà una parte dello script, nel caso quello tra il primo EOF e l’ultimo EOF.

Nell’esempio illustrato non è comodo in quanto bisogna riproporre le due versioni, ma esistono diversi casi in cui è più comodo da usare.

 

4) Richiamare lo stesso script dopo esser root.

​​ 

#!/usr/bin/sh

#

echo "Programma passaggio alla versione Tumbleweed per OpenSUSE"

ROOT_UID=0  ​​​​ # Root ha $UID 0.

 

if [ "$UID" -eq "$ROOT_UID" ]

then

 ​​​​ echo "Sei root. Adesso continui la modifica"

else

 ​​​​ echo "Sei un utente normale e non puoi continuare (allora ripeti)."

if [ "$(whoami)" != "root" ]

then

 ​​ ​​​​ su -s "$0"

 ​​ ​​​​ exit

fi

fi

echo "Creazione nuovi repo"

 

mkdir /etc/zypp/repos.d/old

mv /etc/zypp/repos.d/*.repo /etc/zypp/repos.d/old

### repository Tumbleweed

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/oss repo-oss

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/debug repo-debug

zypper ar -f -c http://download.opensuse.org/tumbleweed/repo/non-oss repo-non-oss

zypper ar -f -c http://download.opensuse.org/update/tumbleweed/ repo-update

#### repository Tumbleweed aggiuntivi

​​ zypper ar -f -d -c http://download.opensuse.org/tumbleweed/repo/src-non-oss repo-src-non-oss

​​ zypper ar -f -d -c http://download.opensuse.org/tumbleweed/repo/src-oss repo-src-oss

# Aggiornamento

echo "Attendere Aggiornamento"

zypper dup

if [ !"$?" = 0 ​​ ]; then

 ​​​​ echo "Miglioramento necessario"

 ​​​​ zypper refresh --force

 ​​​​ zypper dist-upgrade

fi;

Echo "Finito"

 

In questo caso controlla prima se è root e se non lo è esegue il comando “su” per autenticare come root ed esegue lo script “$0”, che poi è una variabile speciale che indica lo stesso script in esecuzione e quindi (se la password è corretta) ripeterà lo stesso script, in questo caso passerà il controllo di utente root e quindi esegue i comandi successivi, in caso contrario incontra il comando exit che gli dice di uscire.

Volendo potete usare anche

if [ "$(whoami)" != "root" ]

then

 ​​ ​​ ​​​​ sudo su -s "$0"

 ​​ ​​ ​​​​ exit

fi

 

ma solo per Ubunto e Linux in cui è configurato il “sudo” ma non il “su” (non OpenSUSE).

​​ 

Altro

Avete visto nella soluzione “2) Chiamare uno script come root” il potente xdg-su che permette non solo di divenire root ma anche di introdurre la password in una comoda box GUI. (qui è quella del KDE\Plasma)

 

 

 

 

 

 

Infatti xdg-su è un complesso script (in /usr/bin/) che permette di riconoscere se esiste una istanza grafica (come Xorg o Wayland) e se Si, che tipo di WM\DE (che “desktop”) utilizza e quindi richiamare la propria GUI di richiesta password.

Volendo potete bypassarla richiamando direttamente

WM/DE

Comando

Base

xterm -geom 60x5 -T

KDE / TDE

kdesu

Gnome / Mate

gnomesu

Lxqt

lxqtsu

Enlightenment

terminology

 

​​ E che esistono tools per fare GUI attraverso gli script Bash, tipo dialog, xdialog, kdialog, ecc.. Tra cui le richieste password.

Esempio in kdialog:

​​ password= 'kdialog --password "Please enter the server access code:"'

 

if [ $? = 0 ]; then

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ echo " Selezionato: OK"

else

 ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​ ​​​​ echo " Selezionato: Annullato o altro"

fi

echo $password

# uso della password, poi è meglio cancellarla

unset password

 

 

 

 

 

altri sono il basilare su ogni Linux da terminale:

read -p "Password di sedi-direzioni: " -s pw

 

oppure GUI Xdialog

#!/bin/bash

# getpasswd2.sh - A sample shell script to read users password.

# password storage

data=$(tempfile 2>/dev/null)

# dialog --inputbox "Enter your name:" 8 40 2>answer

 

# trap it

trap "rm -f $data" 0 1 2 5 15

 

# get password with the --insecure option

Xdialog --title "Password" \

--clear \

--insecure \

--passwordbox "Enter your password" 10 30 2 > datamio

 

ret=$?

 

# make decison

case $ret in

 ​​​​ 0)

 ​​ ​​ ​​​​ echo "Password is $(cat $datamio)";;

 ​​​​ 1)

 ​​ ​​ ​​​​ echo "Cancel pressed.";;

 ​​​​ 255)

 ​​ ​​ ​​​​ [ -s $data ] && ​​ cat $datamio || echo "ESC pressed.";;

esac

 

 

Oppure GUI Dialog:

#!/bin/bash

 

# get password with the --insecure option

dialog --title "Password" \

--clear \

--insecure \

--passwordbox "Enter your password" 10 30 2 > datamio

 

ret=$?

 ​​ ​​ ​​​​ echo "Password is $(cat $datamio)"

 

Ecc. ecc. esiste anche Zenity, Whiptail, Xmessage, Gtkdialog, Yad, Uidialog, PythonDialog, ...

Ovvio che maggiori informazioni le trovate nei rispettivi siti.

 

Conclusioni

 

Come potete vedere sono script di esempio e quindi potete mischiare le varie soluzioni per trovare quella più adatta al vostro problema.

Se poi avete dei suggerimenti, metteteli nei commenti.

 

Ciaooooooooooooooooooooooooooooooooooooooo

 

Precedente Desktop Wayland su OpenSUSE Successivo Telnet su OpenSUSE