it-swarm.com.de

Wie führe ich eine Gruppe von Befehlen als anderer Benutzer in Bash aus?

Es gibt bereits einige vorhandene Fragen hier zum Ausführen von Befehlen als anderer Benutzer. Die Fragen und Antworten konzentrieren sich jedoch auf einen einzelnen Befehl anstelle einer langen Gruppe von Befehlen.

Betrachten Sie beispielsweise das folgende Skript:

#!/bin/bash
set -e

root_command -p param1  # run as root

# these commands must be run as another user
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'

Hier sind einige wichtige Punkte zu beachten:

  • Die letzten drei Befehle müssen mit su oder Sudo als anderer Benutzer ausgeführt werden. Im Beispiel gab es drei Befehle, aber nehmen wir an, dass es noch viele weitere gab ...

  • Die Befehle selbst verwenden einfache und doppelte Anführungszeichen.

Der zweite Punkt oben verhindert die Verwendung der folgenden Syntax:

su somebody -c "command"

... da die Befehle selbst Anführungszeichen enthalten.

Wie können die Befehle richtig gruppiert und unter einem anderen Benutzerkonto ausgeführt werden?

63
Nathan Osman

Versuche dies:

su somebody <<'EOF'
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'
EOF

<< führt ein here-doc ein. Das nächste Token ist das Trennzeichen, und alle Zeichen bis zu einer mit dem Trennzeichen beginnenden Zeile werden als Standardeingabe in den Befehl eingegeben. Wenn Sie das Trennzeichen in einfache Anführungszeichen setzen, wird die Variablenersetzung im Here-Doc verhindert.

144
Barmar

Ich bin nicht so gut mit bash-foo, es gibt also einen eleganteren Weg, aber ich habe dieses Problem in der Vergangenheit durch die Verwendung mehrerer Skripte und eines "Treibers" angegangen.

Z.B.

Driver

#!/bin/bash
set -e

su root script1
su somebody script2

Script1

#!/bin/bash
set -e

root_command -p param1  # run as root

Script2

#!/bin/bash
set -e

# these commands must be run as another user
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'
7
stefancarlton

Dieses Skript überprüft, ob der aktuelle Benutzer, der das Skript ausführt, der gewünschte Benutzer ist. Wenn nicht, wird das Skript mit dem gewünschten Benutzer erneut ausgeführt.

#!/usr/bin/env bash

TOKEN_USER_X=TOKEN_USER_X
USER_X=peter # other user!

SCRIPT_PATH=$(readlink -f "$BASH_SOURCE")

if [[ "[email protected]" != "$TOKEN_USER_X" ]]; then

    ###### RUN THIS PART AS the user who started the script

    echo "This script is $SCRIPT_PATH"

    echo -n "Current user: "
    echo $USER

    read -p "insert: "
    echo "got $REPLY"

    su - $USER_X -c "$SCRIPT_PATH $TOKEN_USER_X" # execute code below after else (marked #TOKEN_USER_X)

else
    #TOKEN_USER_X -- come here only if script received one parameter TOKEN_USER_X

    ###### RUN THIS PART AS USER peter

    echo
    echo "Now this script is $SCRIPT_PATH"

    echo -n "Current user: "
    echo $USER

    read -p "insert: "
    echo "got $REPLY"

    exit 0
fi

echo
echo "Back to initial user..."
echo -n "Current user: "
echo $USER
0
swift_dodo