한 사용자가 다른 사용자가 소유한 디렉토리에 파일을 복사하는 쉘 스크립트

한 사용자가 다른 사용자가 소유한 디렉토리에 파일을 복사하는 쉘 스크립트

user1:user1Unix에는 두 명의 사용자와 그룹 이 있습니다 user2:user2.

myDirectory아래 세부정보가 포함된 디렉터리가 있습니다 ( ls -ltr).

drwxr-xr-x.  4 user2 user2   35 Apr 27 10:16 myDirectory

이제 myScript.sh다음과 같이 스크립트를 실행하고 있습니다 user1.

#!/bin/sh

whoami

if [ -f /myDirectory/*.tar.gz ]
then
    rm -f /myDirectory/*.tar.gz
fi

cp -f someDirectory/*.tar.gz /myDirectory/

그러나 다음과 같은 오류가 발생합니다.

cp: cannot create regular file ‘/myDirectory/myTar.tar.gz’: Permission denied

내가 도대체 ​​뭘 잘못하고있는 겁니까? 이 문제를 어떻게 해결할 수 있나요?

답변1

그룹 권한으로 이 작업을 수행할 수 있습니다. 사용자 그룹을 생성하고, 두 사용자를 추가하고, 대상 디렉터리의 그룹 소유권을 변경해야 합니다. 먼저 그룹을 만듭니다.

groupadd newusergroup

그런 다음 사용자를 추가합니다.

usermod -G newusergroup user1
usermod -G newusergroup user2

그런 다음 대상 디렉터리에 대한 권한을 변경합니다.

chgrp newusergroup /myDirectory

이는 두 사용자가 모두 디렉토리에 액세스할 수 있기를 원한다고 가정한 것입니다. user1에게만 액세스 권한을 부여하려면 다음과 같이 권한을 변경하면 됩니다.

chown user1.user1 /myDirectory

답변2

해당 디렉터리에서 파일을 제거하거나 생성하는 데 권한이 방해가 됩니다 group.mydirectory

user1먼저 다음 명령을 실행하십시오 .

chmod g+w mydirectory

답변3

글을 작성해야 하는 사용자, 즉 복사하고 있는 사용자가 있으면 더 좋을 것 같습니다.에게, 스크립트를 실행했습니다. 이렇게 하면 대상 디렉터리에 특별한 쓰기 권한을 부여할 필요가 없습니다.

또한, 시험

if [ -f /myDirectory/*.tar.gz ]

결함이 있습니다. 테스트 -f에서는 하나의 인수를 사용하지만 패턴이 여러 파일과 일치하는 경우 여러 인수를 전달합니다. myDirectory압축된 아카이브의 디렉토리를 비우고 싶기 때문에 tar다음과 같이 하면 충분합니다.

rm -f /myDirectory/*.tar.gz

플래그 -f를 사용하면 rm삭제할 파일이 없어도 오류가 발생하지 않습니다.

답변4

글쎄요, 저는 많은 실수를 봅니다:

  1. 에 글을 쓰실 수 없습니다 myDirectory. 거기 에만 user2쓸 수 있습니다.
  2. 절대 경로와 상대 경로를 혼동하고 있습니다. /myDirectory은(는) 와 다른 디렉토리입니다 myDirectory. 스크립트가 파일 시스템 루트 폴더에 복사하려고 하기 때문에 권한 거부 오류가 발생할 수도 있습니다 myDirectory. myDirectory현재 명령줄 경로(스크립트가 호출되는 컨텍스트)의 경로에 상대적인 경우에는 ./myDirectory옳습니다. 그렇지 않으면 myDirectory실제 위치가 어디에 있는지 더 자세한 정보를 제공해 주시기 바랍니다 . 상대 경로의 범위는 myDirectory여러 면에서 다를 수 있으므로 이는 중요합니다. 귀하의 명시적인 사례를 알지 못하는 경우 이와 관련된 답변은 일반적인 답변일 뿐이며 귀하의 특정 사례에는 적용되지 않을 수 있습니다.
  3. [and 조건 ]표현식은 에서만 사용할 수 Bash있으며 에서는 사용할 수 없습니다 Shell. 정의는 Shell현재 작동 중인 UNIX 시스템에 따라 달라집니다. 일반적으로 Linux에서는 BashLinux에 직접적인 구현이 없고 ShellBSD에도 없기 때문에 를 가리킵니다 . Mac에서만 자체적으로 직접 Shell구현이 가능합니다. 따라서 은 Shell이론적인 UNIX 표준일 뿐이며 오늘날에는 현재 실행 중인 UNIX 시스템에 따라 이론적인 문서에 대한 다양한 방언과 해석이 나옵니다. 따라서 Bash대신 직접 사용하는 것이 좋습니다. 이는 대부분의 UNIX 플랫폼에서 100% 작동합니다. 나는 Bash를 사용할 수 없는 UNIX 시스템을 모릅니다.

생각해 볼 만한 다른 흥미로운 점: user1및 과 같은 여러 그룹을 추가할 수 있습니다 user2. 그런 다음 기본 폴더 그룹을 myDirectory해당 그룹으로 변경할 수 있습니다. 그것은 내가 그것에 대한 일반적인 접근 방식을 아는 한입니다.

Shebang 명령을 통해 Bash를 사용할 수도 있습니다 /usr/bin/env. 그러면 실제로 어떤 Bash에서도 종료될 수 있습니다.

#!/usr/bin/env bash

이는 Perl, PHP 등과 같은 다른 스크립트 언어에도 좋은 접근 방식입니다.

관련 정보