У меня есть два пользователя и группы в Unix: user1:user1
и 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
может отличаться несколькими способами. Не зная вашего явного случая, ответ, связанный с этим, будет только общим ответом, который может быть неприменим к вашему конкретному случаю. - Выражение условия
[
и]
доступно только вBash
, но не вShell
. ОпределениеShell
также зависит от вашей текущей работающей системы UNIX. Обычно в Linux оно указывает наBash
, поскольку Linux не имеет прямойShell
реализации, как и BSD. Только Mac имеет свою собственную прямуюShell
реализацию. Таким образом,Shell
является просто теоретическим стандартом UNIX, который в настоящее время оказывается во многих различных диалектах и интерпретациях этого теоретического документа, который действительно зависит от вашей текущей работающей системы UNIX. Поэтому используйте better напрямуюBash
вместо этого. Это работает на 100 % на большинстве платформ UNIX. Я не знаю ни одной системы UNIX, в которой Bash не был бы доступен.
Вот еще несколько интересных моментов для размышления: вы можете захотеть добавить несколько групп, которые являются user1
и user2
. Затем вы можете изменить основную группу папок myDirectory
на эту группу. Насколько я знаю, это общепринятый подход для этого.
Вы также можете использовать Bash с помощью /usr/bin/env
команды shebang, которая гарантирует, что вы действительно окажетесь в любом Bash:
#!/usr/bin/env bash
Это также хороший подход для других языков сценариев, таких как perl, php и т. д.