user1:user1
Unix에는 두 명의 사용자와 그룹 이 있습니다 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
글쎄요, 저는 많은 실수를 봅니다:
- 에 글을 쓰실 수 없습니다
myDirectory
. 거기 에만user2
쓸 수 있습니다. - 절대 경로와 상대 경로를 혼동하고 있습니다.
/myDirectory
은(는) 와 다른 디렉토리입니다myDirectory
. 스크립트가 파일 시스템 루트 폴더에 복사하려고 하기 때문에 권한 거부 오류가 발생할 수도 있습니다myDirectory
.myDirectory
현재 명령줄 경로(스크립트가 호출되는 컨텍스트)의 경로에 상대적인 경우에는./myDirectory
옳습니다. 그렇지 않으면myDirectory
실제 위치가 어디에 있는지 더 자세한 정보를 제공해 주시기 바랍니다 . 상대 경로의 범위는myDirectory
여러 면에서 다를 수 있으므로 이는 중요합니다. 귀하의 명시적인 사례를 알지 못하는 경우 이와 관련된 답변은 일반적인 답변일 뿐이며 귀하의 특정 사례에는 적용되지 않을 수 있습니다. [
and 조건]
표현식은 에서만 사용할 수Bash
있으며 에서는 사용할 수 없습니다Shell
. 정의는Shell
현재 작동 중인 UNIX 시스템에 따라 달라집니다. 일반적으로 Linux에서는Bash
Linux에 직접적인 구현이 없고Shell
BSD에도 없기 때문에 를 가리킵니다 . 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 등과 같은 다른 스크립트 언어에도 좋은 접근 방식입니다.