Wie führe ich einen Befehl mit Administratorrechten und Zugriff auf Dateien des angemeldeten Benutzers aus?

7

Ich habe einige Probleme beim Verstehen sudo. Ich bin an einem Terminal als Nicht-Administrator / Nicht-Root-Benutzer angemeldet. Dieser "normale" Benutzer befindet sich nicht in der sudoers-Datei (und sollte meiner Meinung nach auch nicht sein).

Jetzt versuche ich, einen Befehl auszuführen, der Administrator- / Root-Rechte und auch Zugriff auf Verzeichnisse meines normalen Benutzers erfordert - daher bin ich nicht in der Lage zu einfach su in einen Admin- oder Root-Benutzer.

Nach meinem Verständnis sudo -u root sollte aber den Trick machen Es akzeptiert das Passwort für nicht root (oder admin wenn ich es mit meinem normalen probiere admin user). Es akzeptiert nur das Passwort des "normalen" Benutzers, wie es scheint um anzuzeigen, dass die -u username Option funktioniert nicht so, wie ich es erwarte Arbeit.

Meine Erwartung ist das sudo -u root some_command ausführt some_command mit den Rechten von root und fragt daher auch nach dem Passwort von root. Offensichtlich nicht.

TL; DR: Wie führe ich einen Befehl aus, der einen Administrator erfordert? Privilegien UND hat Zugriff auf die Dateien des "angemeldeten (normalen) Benutzers" ohne Hinzufügen des normalen Benutzers zur sudoers-Datei?

Ich habe den Root-Benutzer unter Mac OS X 10.7 aktiviert.

robertj
quelle

Antworten:

13

sudo erfordert immer das Kennwort des ausführenden Benutzers (und erfordert, dass Sie dazu über bestimmte Berechtigungen verfügen, d. h sudoers ).

su erfordert das Passwort des Zielkontos ( root Standardmäßig, aber das Root-Konto hat unter OS X standardmäßig kein Kennwort. Wenn du benutzt su Stattdessen können Sie das Kennwort des Zielkontos eingeben und einen Befehl mit den Berechtigungen dieses Benutzers ausführen.

su -c some_cmd # as root
su username -c some_cmd # as username

Dies funktioniert, indem alle Argumente nach dem Benutzernamen an die Anmeldeshell des Zielkontos übergeben werden. Muscheln unterstützen normalerweise -c <commands> Argumente. In GNU Coreutils suEs gibt eine tatsächliche -c command Argument zu su Das kann vor dem Benutzernamen stehen.


Sie können su zu einem anderen Benutzerkonto (unter Verwendung des Kennworts des anderen Benutzerkontos) und sudo von dort aus, sofern es sich bei dem anderen Konto um ein sudoer.

Wenn Sie weder das Passwort eines anderen Kontos eingeben noch Ihr reguläres Konto angeben möchten sudoers Berechtigungen haben Sie so gut wie keine Optionen, es sei denn, Sie ziehen SSH mit Schlüsselauthentifizierung oder Ähnlichem in Betracht.

Daniel Beck
quelle
Hallo, danke für die Antwort. Ich bin nicht sicher, ob ich Sie richtig verstehe. Soweit ich wissen kann, ob ich mich als root anmelde, verliere ich den Zugriff auf die Dateien des ursprünglich angemeldeten Benutzers - genau das benötige ich jedoch. Lassen Sie mich konkreter sein: Ich verwende npm (Node Package Manager), um ein selbst geschriebenes Paket in die globale Paketregistrierung auf meinem Computer zu installieren. Dazu brauche ich Zugriff auf "/ usr / local / lib / node_modules / ...", die der angemeldete Benutzer (sagen wir "robert") nicht hat. Das Paket befindet sich in "~ / my_package". su hilft nicht, da es keinen Zugriff auf diesen Ordner hat (nächster Kommentar)
robertj
und das hinzufügen von "robert" zur sudoers-datei scheint mir total übertrieben.
robertj
@robertj Root kann auf alle Benutzerdateien zugreifen. Also wenn du su ohne Angabe eines Benutzers sind Sie gut.
Daniel Beck
Ich verwende OS X 10.8.3 und 'su -c' wird für mich nicht als gültige Option erkannt ...: "su: illegale Option - c"
Daps0l
@ Daps0l Behoben, versuche den geänderten Befehl.
Daniel Beck
5

Wenn Sie unter Mac OS X nicht wirklich einen separaten Root-Benutzer "brauchen", ist es oft viel einfacher, einfach eine Root-Shell zu verwenden sudo -s

In Ihrem Fall sind Benutzer ohne Administratorrechte nicht in / etc / sudoers enthalten. Sie müssten also die Benutzer / Gruppen, die sudo akzeptieren soll, manuell hinzufügen.

# User privilege specification
root    ALL=(ALL) ALL
%admin  ALL=(ALL) ALL

Sobald dies erledigt ist, erbt sudo fast alle netten Dinge von Ihrer Shell, wie PATH und andere Variablen, erhöht aber Ihren Nicht-Administrator-Benutzer sofort auf root. Der Nachteil beim Aktivieren von root ist die Zeit und das Sicherheitsrisiko, dass sich jemand lokal oder remote als root anmeldet.

Merken Sie sich, sudo fragt nach dem Passwort des Benutzers, der sich im Anmeldefenster angemeldet hat. su - will das Passwort des root-Accounts, sudo -s Verwendet die Eskalation von Berechtigungen, um das Kennwort des aktuellen Benutzers zu verwenden, um root zu werden, ohne eines zu benötigen (oder in Ihrem Fall die tatsächliche ) root-Passwort.

bmike
quelle
2

Wenn Sie ein Standardkonto verwenden (normalerweise aus Sicherheitsgründen) und einen Administrator-Benutzernamen und ein Kennwort kennen, können Sie dies tun su -l admin_user. Nachdem Sie das Passwort eingegeben haben, sind Sie nun für alle Effekte der Administrator. Dann kannst du sudo nach Herzenslust. Jetzt gerade logout um zu Ihrem ursprünglichen normalen Konto zurückzukehren.

Erik Neves
quelle
0

Meine ausführbare Terminal-Datei kann nicht das erreichen, was sie selbst will, aber indem sie diese nervige Operation ausführt:

Öffnen Sie App & gt; Dienstprogramm & gt; Terminal.app.

~ Benutzer $ sudo / PATH_TO_TERMINAL_EXEC

Administratorrechte erhalten;

Erledigt.

... das ist es, was in terminal_executable steckt

#!/bin/bash

echo PATCHING HOSTS FILE...!
echo  >> /etc/hosts
echo \# IsPatched >> /etc/hosts
echo 127.0.0.1 somewebsite.com >> /etc/hosts

... was ich schon ausprobiert habe ist

#!/bin/bash

tmpvar=$(whoami)
echo TRYING!
su $tmpvar echo 127.0.0.1 somesite.com >> /etc/hosts

oder

su cuskus -c sudo -s echo 127.0.0.1 somesite.com >> /etc/hosts

Ich habe gerade das Fenster #! / bin / bash erhalten, nachdem ich nach dem Passwort gefragt habe, kann aber aufgrund von Berechtigungen keinen Code ausführen.

cuskus
quelle
Dies löste mein Problem: superuser.com/a/1021174/622740
cuskus