VIM: "sudo vim bad_idea"?

20

Ein IRC-Benutzer in #Vim forderte mich auf, Sudo nicht mit Vim zu verwenden, wie:

sudo vim bad_idea

Wenn ich Dinge an Orten wie / var / www / mache, kann ich nicht ohne sie schreiben. Die Nichtverwendung von sudo wird somit zu einem Problem. Natürlich könnte ich Änderungen an verschiedenen Stellen wie / tmp / vornehmen und dann die Verzeichnisse nach / var / www kopieren. Ich spüre jedoch einen einfacheren Weg.

  1. Wenn Sie nicht "sudo Vim", warum?
  2. Wenn ja, wie umgehen Sie Probleme, sudo nicht zu verwenden?
Léo Léopold Hertz 준영
quelle

Antworten:

35

Ich falle in die erste Kategorie: sudo vim /var/www/html/some_fileist eine schlechte Idee; Es ermöglicht Shell-Escapes, die nicht protokolliert werden. Verwenden Sie stattdessen sudoedit /var/www/html/some_file; das hat den gleichen effekt.

Kevin M
quelle
5
Was sind "Shell-Escapes, die nicht protokolliert wurden"? und warum spielt das nicht nur in / var / www eine rolle?
hasen
6
vim kann andere Befehle in einer Befehlszeile ausführen. Da vim jedoch über sudo gestartet wurde und daher als root ausgeführt wird, wird jeder dieser Befehle mit root-Berechtigungen ausgeführt. Diese Befehle werden als "Shell-Escape" bezeichnet und nicht wie andere Aufrufe von sudo protokolliert. Und es ist nicht nur auf / var / www beschränkt; Es ist überall, wo ich es benutzen würde. Ich habe sogar "sudo vi" in "sudoedit" in meiner bashrc-Datei gefiltert.
Kevin M
Ich sehe, worauf du hinaus willst und will zustimmen, aber klarstellen. Wir haben keine Ahnung, ob seine normalen su- und sudo-root-Aktivitäten protokolliert werden oder nicht. "sudo vim" erlaubt das Ausführen einer Subshell als root - so viel ist korrekt; Innerhalb dieser Shell wird "sudo" nicht kontrollieren, was root kann und was nicht.
pbr
3
Kevin, wie hast du es geschafft, "sudo vi" als "sudoedit" zu bezeichnen? Aus dem Bash-Handbuch ... "Die Zeichen /, $,` und = und alle oben aufgeführten Shell-Metazeichen oder Anführungszeichen werden möglicherweise nicht in einem Aliasnamen angezeigt. " ... Space ist eines der Metazeichen, von denen es spricht.
pbr
9
OK, es ist also kein Alias ​​per se, aber es hat den gleichen Effekt: 'function sudo () {[[$ 1 == vi]] && shift && sudoedit "$ @" || Befehl sudo "$ @"; } '
Kevin M
10

Siehe: /programming/1005/getting-root-permissions-on-a-file-inside-of-vi :

% wird durch den aktuellen Dateinamen ersetzt, daher können Sie Folgendes verwenden:

: w! sudo tee%

Hyperslug
quelle
Wenn Sie tee verwenden möchten, würde ich vorschlagen: ': w! Sudo tee%> / dev / null', damit nicht die gesamte Datei an Sie zurückgesendet wird. Ich verwende stattdessen normalerweise ': w! Dd of =%', da es schneller zu tippen ist und dasselbe erreicht. Natürlich nur, wenn ich vergessen habe, sudoedit / sudo -e zu verwenden.
Jamessan
7

Mit vim können Benutzer beliebige Shell-Befehle ausführen. Daher erlauben viele Systemadministratoren nicht, dass vim mit sudo verwendet wird.

rvim ist in vim enthalten. Es ist eine eingeschränkte Version, die keine Shell-Befehle erlaubt. (Oder Sie können vim aus den gleichen Gründen aussetzen.)

Ob Sie auf eigene Faust an diese Extreme gehen müssen, ist umstritten.

Richard Hoskins
quelle
1
+1. Stimme voll und ganz zu. sudo vimDann geben :!bashSie ein und Sie haben eine Shell als root - genau warum rvimexistiert
dbr
3
Tatsächlich, wenn Sie sudo vim können, können Sie wahrscheinlich sudo bashoder sudo su -richtig?
Dlamblin
@diamblin Privilegien können mit feineren Details herausgesucht werden, also nicht unbedingt. Deshalb wird rvim benötigt. "sudo vim" ist in jeder Hinsicht dasselbe wie "sudo su -". Auf einer Debian-Bitty-Box, bei der der eine Benutzer der Systemadministrator ist, ist dies alles akademisch.
Richard Hoskins
Wie geht Ubuntu mit diesem Problem um? Auf CentOS vistartet vimaber als root vistartet vi. Auf Ubuntu vimwird in beiden Fällen verwendet und sudo vistartet auch vim...
CWD
6

Wenn Sie systemweite Konfigurationsdateien bearbeiten, ist dies völlig in Ordnung. Denken Sie jedoch immer daran, dass Sie als Root angemeldet sind und über die volle Leistung verfügen. Löschen Sie diese Berechtigungen, sobald Sie sie nicht mehr benötigen.

In dem speziellen Fall /var/www/, dh bei Webserverseiten, sollten Sie überlegen, ob Sie einige Eigentümer / Gruppen / Berechtigungen ändern möchten. Ob und wie stark dies von Ihrem jeweiligen Setup abhängt (Einzel- / Mehrbenutzer, echter Webserver / nur lokaler Host, dynamisch) / statisch usw.)

balpha
quelle
6
+1 in der Tat - das ist die beste Art, mit Webserverseiten umzugehen. Stellen Sie sicher, dass Sie Zugriff darauf haben, anstatt Ihre Berechtigungen zu erhöhen.
Bedwyr
1
-1 Es gibt keinen Grund, vim mit erhöhten Rechten auszuführen, wenn sudoedit denselben Job ausführt.
sml
4

Eine solche Frage lässt mich auf die Stirn schlagen. Ich bin auf der anderen Seite der Sicherheit: "Sicherheit sollte die Benutzererfahrung nicht beeinträchtigen, es sei denn, es wird erwartet oder verlangt, dass die durchschnittliche Person keine böswilligen Aktivitäten ausführt."

Das Verhindern des sudo-Gebrauchs von vim ist nur ein Pflaster. Wie bereits erwähnt, kann jemand einfach Folgendes verwenden:

sudo su -

Oder

sudo /bin/bash

Oder

sudo nano file

Oder

sudo my_exectuable_text_editor file

ect

Wenn Sie sich wirklich Sorgen machen, dass jemand etwas Bösartiges an der Box tut, geben Sie ihm nicht die Berechtigung sudo (oder natürlich root password). Es gibt keine Splitterkugel, die böswillige Aktivitäten mit sudo verhindert, und Sie werden nur verrückt, wenn Sie alle "Korrekturen" anwenden, um sicherzustellen, dass eine Person nichts Bösartiges tun kann.

Jemand erwähnte einen Eigentümerwechsel / Gruppenwechsel. Dies ist ein schwerwiegendes Problem, da der Webserver als ein anderer Benutzer ausgeführt wird und Sie die Berechtigungen für die Datei ändern, sodass Ihre Site plötzlich nicht mehr funktioniert. Nun, das wird dir offensichtlich nicht helfen. Sie können sich der Gruppe hinzufügen, auf der der Webserver ausgeführt wird. Wenn die Gruppe jedoch keinen Schreibzugriff auf die Dateien hat, müssen Sie chmod -R g + w * (oder chmod einzelne Dateien) ausführen, was möglicherweise nicht der Fall ist was Sie wollen und ein Ärger sein kann, wenn Sie jede Datei chmod müssen.

Einige Leute schlugen sogar vor, rvim zu verwenden. Sicher, man könnte einfach eine Zeile in / etc / sudoers einfügen, um nur bestimmten Benutzern das Ausführen von sudo rvim zu ermöglichen. Es ist jedoch logisch, dass es möglicherweise besser ist, einen webbasierten Dateimanager zu implementieren, wenn Sie diesen Weg einschlagen müssen. Auf diese Weise wird es als der Benutzer ausgeführt, unter dem der Webserver ausgeführt wird, sodass keine Dateiberechtigungsprobleme auftreten und Sie weiterhin eine differenzierte Kontrolle darüber haben können, wer welche Dateien bearbeitet.

Meine zwei Cent sowieso.

Natalie Adams
quelle
2

Beim Ausführen sudo vimwird das $HOMEVerzeichnis nicht geändert , sodass Sie Vim mit Root-Berechtigungen ausführen, aber $HOMEweiterhin auf Ihren normalen Benutzer verweisen.

Wenn Sie Vim zum ersten Mal ausführen, wird die ~/.viminfoDatei möglicherweise in Ihrem normalen Benutzerverzeichnis erstellt, jedoch mit Root-Berechtigungen.

Denilson Sá Maia
quelle
1
Kommt auf das Sudo an. Auf meinem Laptop sudo vim -c '!echo $HOME' -c qgibt es meinen Home-Ordner, aber auf meinem Server gibt es /root. Ich muss mir vielleicht ansehen, warum das so ist, könnte daran liegen, dass das eine OS X ist, während das andere Gentoo ist, oder könnte etwas damit zu tun haben, wie es eingerichtet /etc/sudoersist.
Nemo157
Aha! Sie haben Recht - ich habe mich hier gefragt, warum meine .viminfonur root-zugänglich war.
Ayrat
1

WENN DAS IHR EIGENER COMPUTER IST ... Ich verstehe keinen Grund, warum Sie "sudo vim" nicht verwenden können, außer dem von Denilson notierten Randfall, dass es Ihr ~ / .viminfo-Eigentum von root erstellen könnte.

Wenn nicht - wenn ein Systemadministrator einschränkt, was Sie können und was nicht -, können Sie mit "man sudo": "auf den meisten Systemen Shell-Escapes mit der noexec-Funktionalität von sudo verhindern. Weitere Informationen finden Sie im sudoers (5) -Handbuch. "

Wenn Ihr Systemadministrator also Bedenken hat, ob Sie Subshells als Root aus vim heraus ausführen könnten, können diese die noexec-Funktion verwenden. Aber ... zurück zum Ausgangsfall - wenn dies IHR Computer ist, sind Sie verdammt sicher, wenn Sie "sudo vim" ausführen.

pbr
quelle