Shell-Skript eines Benutzers zum Kopieren einer Datei in ein Verzeichnis, das einem anderen Benutzer gehört

Shell-Skript eines Benutzers zum Kopieren einer Datei in ein Verzeichnis, das einem anderen Benutzer gehört

Ich habe zwei Benutzer und Gruppen in Unix: user1:user1und user2:user2.

Ich habe ein Verzeichnis myDirectorymit 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.shals 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 groupBerechtigungen mydirectorystehen Ihnen beim Entfernen oder Erstellen einer Datei in diesem Verzeichnis im Weg.

Führen Sie user1zuerst 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 -fleeren möchten , reicht es aus,myDirectorytar

rm -f /myDirectory/*.tar.gz

Das -fFlag rmsorgt dafür, dass kein Fehler ausgegeben wird, wenn keine zu löschenden Dateien vorhanden sind.

Antwort4

Nun, ich sehe viele Fehler:

  1. Sie dürfen nicht in schreiben myDirectory. Nur user2darf dort schreiben.
  2. Sie verwechseln absolute mit relativen Pfaden. /myDirectoryist ein anderes Verzeichnis als myDirectory. Dies könnte auch den Fehler „Zugriff verweigert“ verursachen, da Ihr Skript versucht, es in den Stammordner des Dateisystems zu kopieren myDirectory. Wenn myDirectoryrelativ zum Pfad vom aktuellen Befehlszeilenpfad ist (in welchem ​​Kontext das Skript aufgerufen wird), dann ./myDirectorywäre es richtig. Andernfalls sollten Sie uns genauere Informationen geben, wo myDirectorysich wirklich befindet. Dies ist wichtig, da der Umfang des relativen Pfads myDirectoryin 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.
  3. 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.]BashShellShellBashShellShellShellBash

Einige weitere interessante Punkte, über die Sie nachdenken sollten: Möglicherweise möchten Sie mehrere Gruppen hinzufügen, nämlich user1und user2. Dann können Sie die primäre Ordnergruppe von myDirectoryin diese Gruppe ändern. Soweit ich weiß, ist das der übliche Ansatz dafür.

Alternativ kannst du die Bash auch über den /usr/bin/envShebang-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.

verwandte Informationen