Führen Sie ein Shell-Skript als ein anderer Benutzer ohne Kennwort aus

245

Ich möchte ein Skript von der Ubuntu-Haupt-Shell als ein anderer Benutzer ausführen, der kein Passwort hat.

Ich habe volle Sudo-Rechte und habe folgendes ausprobiert:

sudo su -c "Your command right here" -s /bin/sh otheruser

Dann muss ich mein Passwort eingeben, bin mir aber nicht sicher, ob das Skript nun wirklich unter diesem Benutzer ausgeführt wird.

Wie kann ich bestätigen, dass das Skript jetzt wirklich unter diesem Benutzer ausgeführt wird?

rubo77
quelle

Antworten:

354

Sie können dies mit suoder tun sudo, ohne dass Sie beides benötigen.

sudo -H -u otheruser bash -c 'echo "I am $USER, with uid $UID"' 

Die relevanten Teile von man sudo:

-H   The -H (HOME) option requests that the security policy set
     the HOME environment variable to the home directory of the
     target user (root by default) as specified by the password
     database.  Depending on the policy, this may be the default
     behavior.
-u user     The -u (user) option causes sudo to run the specified
      command as a user other than root.  To specify a uid
      instead of a user name, use #uid.  When running commands as
      a uid, many shells require that the '#' be escaped with a
      backslash ('\').  Security policies may restrict uids to
      those listed in the password database.  The sudoers policy
      allows uids that are not in the password database as long
      as the targetpw option is not set.  Other security policies
      may not support this.

suBenutzer kann nur ohne Angabe eines Kennworts gewechselt werden, wenn Sie als Root angemeldet sind. Siehe Calebs Antwort

Sie können die /etc/pam.d/suDatei ändern , um sie suohne Kennwort zuzulassen . Siehe diese Antwort .

Wenn Sie Ihre Auth - Datei in dem folgenden geändert, jeder Benutzer, war Teil der Gruppe somegroupkonnte suzu , otheruserohne ein Passwort.

auth       sufficient pam_rootok.so
auth       [success=ignore default=1] pam_succeed_if.so user = otheruser
auth       sufficient   pam_succeed_if.so use_uid user ingroup somegroup

Dann vom Terminal aus testen

rubo77@local$ su otheruser -c 'echo "hello from $USER"'
hello from otheruser
geirha
quelle
4
Können Sie bitte hinzufügen, wie es einfach suauch geht?
Rubo77
2
Dies fragt mich nach einem Passwort :-(
IanVaughan
1
@IanVaughan, Bei der Standardkonfiguration (von sudo) werden Sie nach einem Kennwort gefragt, es sei denn, Sie führen es als root aus. Sie können sudo so konfigurieren, dass Benutzer A Cmd C als Benutzer B ausführen kann, ohne dass ein Kennwort erforderlich ist. Siehe help.ubuntu.com/community/Sudoers
geirha
1
Ich werde aufgefordert, ein Passwort einzugeben, wenn ich dies als root ausführen möchte. Irgendwelche Vorschläge?
Nate
1
@NamGVU Beachten Sie, dass die Reihenfolge wichtig ist. Wenn Ihre Sudoer eine weiter unten stehende Regel haben, die andere Berechtigungen für Ihren Benutzer oder eine Gruppe festlegt, der Sie angehören, überschreibt dies Ihre NOPASSWD-Regel.
Geirha
100

Wenn Sie su anstelle von sudo verwenden möchten, können Sie meines Erachtens Folgendes verwenden:

su - <username> -c "<commands>"
  • - simuliert ein Login des angegebenen Benutzers
  • -c teilt mit, dass Sie einen Befehl ausführen möchten

ps. Leider kann ich Ruby mit rvm mit dieser Methode nicht installieren, aber das hängt wahrscheinlich nicht zusammen.

Caleb
quelle
5
Ich musste sudoam Anfang hinzufügen , da ich sonst nach meinem Passwort gefragt wurde.
IanVaughan
2
Ohne geht das definitiv nicht sudo. mit sudo funktioniert es zum beispiel: sudo su - www-data -c "touch /tmp/test"erfolgreich eine datei als www-daten erstellt
rubo77 24.09.16
Um "su" zu verwenden, benötigen Sie das root-Passwort. Der Punkt von "sudo" ist, dies zu vermeiden. Wenn Sie das root-Passwort haben, sollte die Verwendung von "su" wie oben beschrieben funktionieren.
Samuel Åslund
6

Die Antworten oben sind wirklich nützlich für mich, aber um die eigentliche Frage zu beantworten ...

Wie kann ich bestätigen, dass das Skript jetzt wirklich unter diesem Benutzer ausgeführt wird?

Verwenden:

ps -ef | grep <command-name>

Die Ausgabe sollte Ihr Skript und den tatsächlichen Benutzer enthalten, der es ausführt. Leute auf BSD-ähnlichen Systemen, zB MAC, können ähnliche Informationen finden mit:

ps aux | grep <command-name>
Samuel Åslund
quelle
Linux-Benutzer können ps aux verwenden.
Dean Howell
@DeanHowell; Richtig, aber MAC-Benutzer können "ps -ef" nicht verwenden und "ps aux" ist eine BSD-Option, die nur als Kompatibilitätsfunktion verfügbar ist, während "ps -ef" standardisierte Unix / POSIX-Optionen sind.
Samuel Åslund
2

Ich hatte das gleiche problem Geben Sie einfach den Befehl screen -dmS testscreenein, mit dem ein getrennter Bildschirm in Ihrem Nicht-Sudo-Benutzerkonto erstellt wird. Anschließend können Sie ihn protokollieren und überprüfen, ob dieser Bildschirm vorhanden ist screen -ls.

liime
quelle