Datenträgerbelegung für jeden Benutzer abrufen

871
kg98

Wenn ich tippe, sudo du -sh ~student1bekomme ich die erwartete Ausgabe (siehe Screenshot). Wenn ich jedoch versuche, das folgende Skript zu verwenden:

#!/bin/bash  for user in "$@"; do sudo du -sh ~$user done 

Um das Gleiche zu tun, erhalte ich die Fehlermeldung, dass das Verzeichnis nicht existiert. Hier ist ein Screenshot.

(Ich weiß, dass ich das kann sudo du -sh student1 student2..., und dass das bash-Skript unbrauchbar ist, aber ich verstehe immer noch nicht, warum es nicht funktioniert.)

Ich habe mir die Gesamtdatenträgerverwendung für einen bestimmten Benutzer angesehen, aber es war nicht genau das, wonach ich suchte.

5

1 Antwort auf die Frage

4
AFH

Die Shell führt beim Erweitern von Parametern einen einzigen Durchlauf durch, wird also $usererweitert, der vorherige ~wird jedoch nicht erweitert. Um die Eingabezeile zu reparieren, verwenden Sie eval:

... eval sudo du -sh ~$user ... 
Wahr. Dies liegt daran, dass die Erweiterung der Tilde vor der variablen Erweiterung in `bash` erfolgt. Dann erweitern weder Sudo noch Du die Tilde. Kamil Maciorowski vor 7 Jahren 1
Beachten Sie, dass `~` in der Benutzer-Shell erweitert wird. Wenn also Berechtigungen die Erweiterung eines bestimmten Benutzers hier verhindern, wird dies durch die Verwendung von `sudo` nicht überschrieben. AFH vor 7 Jahren 0
Warum "eval" verwenden, wenn Sie "/ home / $ user" direkt verwenden können? Eine andere Möglichkeit ist, Sudo nicht innerhalb des Skripts zu verwenden, sondern das Skript mit Sudo aufzurufen, was IMHO viel sauberer ist ... xenoid vor 7 Jahren 0
@xenoid - Die Standardoption für das Home-Verzeichnis eines Benutzers lautet zwar `/ home / $ user`. Dies kann jedoch beim Erstellen des Kontos überschrieben oder später geändert werden. Es ist auch nicht der Standard für `root ', zumindest nicht für Ubuntu und (vermutlich) andere von Debian abgeleitete Distributionen. Wenn Sie `sudo` außerhalb des Skripts verwenden, werden Sie in einer anderen Umgebung als der aufrufenden Shell ausgeführt, was andere Auswirkungen hat: Beispielsweise befindet sich das Skript möglicherweise nicht im` $ PATH`, das `sudo` verwendet. AFH vor 7 Jahren 1
Alles ist besser als "eval". Es ist ein Skript, Pfadprobleme können verwaltet werden. Und wenn Sie pingelig sein wollen, gibt es auf Ubuntu viele Benutzer-IDs ohne ein wahres / home (keine oder merkwürdige wie `/ usr / sbin '. Aber da das Skript ohnehin reguläre Benutzer prüfen soll ... xenoid vor 7 Jahren 0
Ich habe keine Annahmen über die Benutzerdefinitionen gemacht und Sie sollten auch nicht. Sogenannte "reguläre" Benutzer müssen das Standardverzeichnis "adduser" dennoch nicht verwenden: Es gibt viele Gründe, warum ein Systemadministrator dies nicht verwenden möchte, und der Fragesteller ist absolut korrekt, die Erweiterung "~" zu verwenden. Woher wissen Sie eigentlich, dass der Fragesteller "root" nicht in seinen Bericht aufnehmen möchte? Was ist los mit "eval"? Warum ist etwas besser als es? Es war genau für diese Art von Verwendung gedacht. AFH vor 7 Jahren 0
`thescript" innocuous_user; echo eval ist gefährlich "` (Ich werde es Ihrer Phantasie überlassen, den Befehl "echo" durch alles zu ersetzen, was wirklich unangenehm sein kann, wenn er mit Root-Privilegien ausgeführt wird). xenoid vor 7 Jahren 0
@xenoid - Nicht wahr: Das Semikolon im Parameter begrenzt den Befehl `sudo`, und der Rest des Befehls wird mit Benutzerrechten ausgeführt. Ich bin bereit zu akzeptieren, dass es Orte gibt, an denen "eval" unbeabsichtigte Folgen haben kann, aber dies ist keine davon. In jedem Fall muss ein Benutzer, der über sudo-Privilegien verfügt, nicht so etwas Unverständliches verwenden, um gefährliche Dinge zu tun, und Benutzer mit `sudo`, die den Zugriff verweigert haben, können das Skript sowieso nicht ausführen. AFH vor 7 Jahren 1
Weil Sie das Skript "innocuous_user; sudo id" nicht probiert haben ... xenoid vor 7 Jahren 0
Ich verstehe Ihren Kommentar nicht ("sudo id"?). Was ich versucht habe, war das Skript "innocuous_user; whoami" AFH vor 7 Jahren 0
Wenn der "extra" -Befehl "sudo etwas" ist, erhalten Sie die root-Privilegien erneut, um "etwas" auszuführen (und es wird kein Kennwort abgefragt, da Sie sich noch in der Kulanzperiode für kennwortloses Sudo befinden). xenoid vor 7 Jahren 0
Ich sehe das Problem nicht. Wenn "sudo" zulässig ist, ist es egal, ob Sie es in derselben Zeile in einem Skript oder als separaten Befehl ausführen. Ich habe jeden Ihrer Kommentare beantwortet und Sie haben keine praktikable Alternative vorgeschlagen. Dieses Gespräch kommt nicht weiter, also werde ich es nicht fortsetzen. Vielen Dank für Ihre Kommentare, aber wir müssen uns einigen, um etwas anderes zu sagen. AFH vor 7 Jahren 1