
Ich habe zwei Benutzer und Gruppen in Unix: user1:user1
und user2:user2
.
Ich habe ein Verzeichnis myDirectory
mit den folgenden Details ( ls -ltr
)
drwxr-xr-x. 4 user2 user2 35 Apr 27 10:16 myDirectory
Jetzt führe ich ein Skript aus, myScript.sh
als user1
:
#!/bin/sh
whoami
if [ -f /myDirectory/*.tar.gz ]
then
rm -f /myDirectory/*.tar.gz
fi
cp -f someDirectory/*.tar.gz /myDirectory/
Ich erhalte jedoch die folgende Fehlermeldung:
cp: cannot create regular file ‘/myDirectory/myTar.tar.gz’: Permission denied
Was mache ich falsch? Wie kann ich das beheben?
Antwort1
Dies können Sie mit Gruppenberechtigungen tun. Sie müssen eine Benutzergruppe erstellen, die beiden Benutzer hinzufügen und den Gruppenbesitz des Zielverzeichnisses ändern. Erstellen Sie zunächst eine Gruppe:
groupadd newusergroup
Fügen Sie dann die Benutzer hinzu:
usermod -G newusergroup user1
usermod -G newusergroup user2
Ändern Sie dann die Berechtigungen für das Zielverzeichnis:
chgrp newusergroup /myDirectory
Dies alles setzt voraus, dass Sie beiden Benutzern Zugriff auf das Verzeichnis gewähren möchten. Wenn Sie nur Benutzer1 Zugriff gewähren möchten, ändern Sie die Berechtigungen einfach wie folgt:
chown user1.user1 /myDirectory
Antwort2
Die group
Berechtigungen mydirectory
stehen Ihnen beim Entfernen oder Erstellen einer Datei in diesem Verzeichnis im Weg.
Führen Sie user1
zuerst den folgenden Befehl aus:
chmod g+w mydirectory
Antwort3
Es wäre besser, wenn der Benutzer, der das Schreiben durchführen muss, also der Benutzer, den Sie kopieren,Zu, hat das Skript ausgeführt. Auf diese Weise müssen Sie keine speziellen Schreibberechtigungen für das Zielverzeichnis erteilen.
Auch der Test
if [ -f /myDirectory/*.tar.gz ]
ist fehlerhaft. Der Test nimmt ein Argument an, aber wenn das Muster auf mehrere Dateien zutrifft, übergeben Sie mehrere Argumente. Da Sie das Verzeichnis der komprimierten Archive -f
leeren möchten , reicht es aus,myDirectory
tar
rm -f /myDirectory/*.tar.gz
Das -f
Flag rm
sorgt dafür, dass kein Fehler ausgegeben wird, wenn keine zu löschenden Dateien vorhanden sind.
Antwort4
Nun, ich sehe viele Fehler:
- Sie dürfen nicht in schreiben
myDirectory
. Nuruser2
darf dort schreiben. - Sie verwechseln absolute mit relativen Pfaden.
/myDirectory
ist ein anderes Verzeichnis alsmyDirectory
. Dies könnte auch den Fehler „Zugriff verweigert“ verursachen, da Ihr Skript versucht, es in den Stammordner des Dateisystems zu kopierenmyDirectory
. WennmyDirectory
relativ zum Pfad vom aktuellen Befehlszeilenpfad ist (in welchem Kontext das Skript aufgerufen wird), dann./myDirectory
wäre es richtig. Andernfalls sollten Sie uns genauere Informationen geben, womyDirectory
sich wirklich befindet. Dies ist wichtig, da der Umfang des relativen PfadsmyDirectory
in vielerlei Hinsicht unterschiedlich sein kann. Ohne Ihren konkreten Fall zu kennen, wäre eine diesbezügliche Antwort nur eine allgemeine Antwort, die möglicherweise nicht auf Ihren speziellen Fall zutrifft. - Der Bedingungsausdruck
[
und ist nur in verfügbar , nicht in . Die Definition von hängt auch von Ihrem aktuell laufenden UNIX-System ab. Unter Linux zeigt es normalerweise auf , da Linux und BSD keine direkte Implementierung haben . Nur Mac hat seine eigene direkte Implementierung. Daher ist nur ein theoretischer UNIX-Standard, der heutzutage in vielen verschiedenen Dialekten und Interpretationen dieses theoretischen Dokuments endet, was wirklich von Ihrem aktuell laufenden UNIX-System abhängt. Verwenden Sie also stattdessen besser direkt. Dies funktioniert auf den meisten UNIX-Plattformen zu 100 %. Ich kenne kein UNIX-System, in dem die Bash nicht verfügbar ist.]
Bash
Shell
Shell
Bash
Shell
Shell
Shell
Bash
Einige weitere interessante Punkte, über die Sie nachdenken sollten: Möglicherweise möchten Sie mehrere Gruppen hinzufügen, nämlich user1
und user2
. Dann können Sie die primäre Ordnergruppe von myDirectory
in diese Gruppe ändern. Soweit ich weiß, ist das der übliche Ansatz dafür.
Alternativ kannst du die Bash auch über den /usr/bin/env
Shebang-Befehl aufrufen, der dafür sorgt, dass du auch wirklich in einer beliebigen Bash landest:
#!/usr/bin/env bash
Dies ist auch ein guter Ansatz für andere Skriptsprachen wie Perl, PHP usw.