2010-08-06 6 views
21

kann ich/su Benutzer mitten in einem Skript ändern?kann ich 'su' mitten in einem Bash-Skript ausführen?

+0

möglich Duplikat [Wie verwende ich so den Rest der Bash-Skript als dieser Benutzer ausführen?] (Http://stackoverflow.com/questions/1988249/how-do- ich-benutze-su-um-den-Rest-des-Bash-Skript-als-das-Benutzer auszuführen) –

Antwort

37

Sie können, aber bash wird nicht die nachfolgenden Befehle als Postgres ausführen. Stattdessen tun:

su postgres -c 'dropdb $user' 

Die -c Flagge führt einen Befehl als Benutzer (siehe man su).

+0

danke @Mark Trapp – Radek

+6

Sie möchten doppelte Anführungszeichen verwenden dort: 'su postgres -c "dropdb $ user" ' –

+1

Sie können mehrere Zeilen einfügen, wenn das Schlussangebot in einer anderen Zeile steht. Zitieren Sie in diesem Fall. –

4

Nein, du kannst nicht. Oder atleast ... Sie können su, aber su wird zu diesem Zeitpunkt einfach eine neue Shell öffnen und wenn es fertig ist, wird es mit dem Rest des Skripts fortfahren.

Ein Weg, um es ist su -c 'some command'

9

zu verwenden, nicht so. su ruft einen Prozess auf, der standardmäßig auf eine Shell verweist. In der Befehlszeile ist diese Shell interaktiv, sodass Sie Befehle eingeben können. Im Kontext eines Skripts wird die Shell sofort beendet (weil sie nichts zu tun hat).

Mit

su user -c command 

command wird als user ausgeführt werden - wenn die su erfolgreich ist, was der Fall mit einem Passwort weniger Nutzer in der Regel nur ist oder wenn das Skript als root ausgeführt wird.

Verwenden Sie sudo für einen besseren und feinkörnigeren Ansatz.

2

Eine weitere interessante Idee, die ich heute gehört habe, ist ein rekursiver Aufruf des Skripts, wenn Sie als root ausgeführt werden und das Skript als ein anderer Benutzer ausführen möchten. Siehe nachstehendes Beispiel:

Ich betreiben Skript „my_script“ als „root“ und will das Skript als Benutzer ausführen „raamee“


#!/bin/bash 

#Script name is: my_script 

user=`whoami` 

if [ "$user" == "root" ]; then 
    # As suggested by glenn jackman. Since I don't have anything to run once 
    # switching the user, I can modify the next line to: 
    # exec sudo -u raamee my_script and reuse the same process 
    sudo -u raamee my_script 
fi 

if [ "$user" == "raamee" ]; then 
    #put here the commands you want to perform 
    do_command_1 
    do_command_2 
    do_command_3 
fi 
+1

Wenn Sie nichts zu tun haben, nachdem "raamee" funktioniert, dann können Sie: 'exec sudo -u raamee my_script' - das den aktuellen Prozess ersetzt, anstatt es herumzuhängen. –

+0

Clever, aber ein hier Dokument ist einfacher (siehe meine Antwort). –

+0

Eine Sache, die dabei zu beachten ist, ist, dass der Benutzer sudo'd (wenn nicht root) Berechtigungen zum Ausführen des Skripts selbst haben muss. –

13

Sie ein here document mehr einbetten können su in Ihrem Skriptbefehle:

if [ "$user" == "" ]; then 
    echo "Enter the table name"; 
    read user 
fi 

gunzip * 
chown postgres * 
su postgres <<EOSU 
dropdb $user 
psql -c "create database $user with encoding 'unicode';" -U dbname template1 
psql -d $user -f *.sql 
EOSU 
+0

Seien Sie vorsichtig, ich denke, dass einige Zeichen, wie Backtick, geflüchtet werden müssen, wenn Sie sie in ein hier Dokument einfügen. –

1

zu Antworten in Frage unten siehe,

Sie können zwischen < < EOF und EOF wie in den Antworten erwähnt schreiben.

#!/bin/bash 
whoami 
sudo -u someuser bash << EOF 
echo "In" 
whoami 
EOF 
echo "Out" 
whoami 

How do I use su to execute the rest of the bash script as that user?

+0

Fügen Sie -si zu sudo hinzu, um die Umgebung eines Benutzers zu erhalten. –

Verwandte Themen