it-swarm.com.de

Wie führe ich einen Sudo-Befehl in einem Skript aus?

Um einen Patch manuell auszuführen, muss ich diesen Befehl eingeben

Sudo ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  

Es gibt ein Leerzeichen kurz vor dem 09:

Sudo ./playback_delete_data_patch.sh [space] 09_delete_old_data_p.sql

Wie kann ich das in einem Skript ausführen?

Es gibt auch mehrere andere Befehle, aber dieser gibt Probleme.

81
user251948

Es ist selten eine gute Idee, Sudo in Skripten zu haben. Entfernen Sie stattdessen das Sudo aus dem Skript und führen Sie das Skript selbst mit Sudo aus:

Sudo myscript.sh

Auf diese Weise werden alle Befehle im Skript mit Root-Rechten ausgeführt, und Sie müssen das Kennwort beim Starten des Skripts nur einmal eingeben. Wenn Sie einen bestimmten Befehl innerhalb des Skripts benötigen, um ihn ohne die Berechtigung Sudo auszuführen, können Sie ihn als regulärer Benutzer ausführen (danke Lie Ryan ):

Sudo -u username command 

Das Leerzeichen ist irrelevant, es sollte nichts beeinflussen, es gibt immer ein Leerzeichen zwischen einem Befehl und seinen Argumenten.

102
terdon

Möglicherweise können Sie die Datei sudoers ändern.

Führen Sie Sudo visudo aus.

Fügen Sie einen Eintrag für Ihren Benutzernamen und das Skript hinzu, das Sie ausführen möchten, ohne nach einem Kennwort gefragt zu werden.

username ALL=(ALL) NOPASSWD: /path/to/script
39

Sie könnten versuchen, etwas wie:

echo "PASSWORD" | Sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

Dies ist nicht die sicherste Vorgehensweise, da Sie ein Sudoer-Kennwort im Nur-Text-Format schreiben. Um die Sicherheit zu erhöhen, können Sie eine Variable erstellen und das Sudo-Kennwort in die Variable einlesen. Anschließend können Sie den Befehl wie folgt ausführen:

echo $PASSWORD | Sudo -S ./playback_delete_data_patch.sh 09_delete_old_data_p.sql

Wenn Sie nichts dagegen haben, dass alle Befehle als root ausgeführt werden, können Sie Ihr Skript einfach mit Sudo ausführen, wie zuvor vorgeschlagen.

Sudo ./myscript
19
Jibbers

Diese Antwort ähnelt der von terdon Antwort . Wie ich auch vorschlagen würde, das Hauptskript mit Sudo auszuführen, damit Sie die Befehle ausführen können, ohne den Benutzer nach einem Kennwort zu fragen.

Wenn Sie jedoch einige der Befehle nicht als Rootbenutzer oder als bestimmter Systembenutzer ausführen möchten, sondern als der tatsächliche Benutzer, der den Befehl mit Sudo ausgeführt hat, können Sie nach der Variablen $Sudo_USER suchen den ursprünglichen Benutzer herauszufinden.

Dies ist ein Beispielskript, wie Sie dies erreichen können:

#!/bin/bash

# ref: https://askubuntu.com/a/30157/8698
if ! [ $(id -u) = 0 ]; then
   echo "The script need to be run as root." >&2
   exit 1
fi

if [ $Sudo_USER ]; then
    real_user=$Sudo_USER
else
    real_user=$(whoami)
fi

# Commands that you don't want run with root would be invoked
# with: Sudo -u $real_user
# So they will be ran as the user who invoked the Sudo command
# Keep in mind, if the user is using a root Shell (they're logged in as root),
# then $real_user is actually root
# Sudo -u $real_user non-root-command

# Commands that need to be ran with root would be invoked without Sudo
# root-command
9
Dan

Es gibt tatsächlich einen viel einfacheren Weg, dies zu tun. Aus Gründen der Portabilität ist dies meine Implementierung, Sie können sie jedoch jederzeit an Ihre Anforderungen anpassen.

Geben Sie Ihr Sudo-Passwort als Parameter ein, wenn Sie das Skript starten, erfassen Sie es und wiederholen Sie es mit jedem Befehl, der Sie zur Eingabe des Sudo-Passworts auffordert.

#!/bin/bash

PW=$1
echo $PW | ./playback_delete_data_patch.sh 09_delete_old_data_p.sql  
./command_wo_Sudo.sh <param>
echo $PW | ./other_command_requires_Sudo.sh <param>

Sie können wie folgt eine Eingabeaufforderung und ein Capture hinzufügen, nachdem das Skript gestartet wurde:

echo "enter the Sudo password, please"
read PW

Aber wenn jemand anderes überwacht, was auf dem Knoten läuft; hat Zugriff auf die von ihm erstellten Protokolle; oder prüft nur nach dem Zufallsprinzip, wann Sie einen Test durchführen, der die Sicherheit gefährden könnte.

Dies funktioniert auch bei der Ausführung von Befehlen/Skripten, für deren Fortsetzung ein Ja erforderlich ist:

echo $PW | yes | ./install.sh

Das Echo reagiert auf eine Eingabeaufforderung, sodass Sie alle erforderlichen Funktionen verwenden können, wenn Sie andere Skripts ausführen, die nacheinander nach dem Fortschritt fragen. Stellen Sie sicher, dass Sie diese Reihenfolge kennen, da sonst schlimme Dinge passieren können.

3
csworenx
#!/bin/bash
# this declares that current user is a sudoer
Sudo tee /etc/sudoers.d/$USER <<END
END

# write the content of your script here
Sudo npm install hexo-cli -g
mkdir Untitled
Sudo apt-get install python

# then to remove the Sudo access from the current user
Sudo /bin/rm /etc/sudoers.d/$USER
Sudo -k
3
Sanyam Jain

Sie können versuchen, den Benutzer, der das Skript ausführt, zur sudoers-Datei hinzuzufügen:

#give permissions to the file
Sudo chmod 700 /etc/sudoers.d/useradm

Sudo visudo /etc/sudoers.d/useradm

#add the following text, changing "user" but your desired user
user ALL=(ALL)NOPASSWD:ALL

#return the right permissions to the file
Sudo chmod 440 /etc/sudoers.d/useradm
0
evinhas