Скрипт оболочки одного пользователя для копирования файла в каталог, принадлежащий другому пользователю

Скрипт оболочки одного пользователя для копирования файла в каталог, принадлежащий другому пользователю

У меня есть два пользователя и группы в 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

Ну, я вижу много ошибок:

  1. Вам не разрешено писать в myDirectory. Только user2разрешено писать там.
  2. Вы путаете абсолютные и относительные пути. /myDirectory— это другой каталог, чем myDirectory. Это также может вызвать ошибку отказа в доступе, поскольку ваш скрипт пытается скопировать его в корневую папку файловой системы myDirectory. Если myDirectoryэто относительно пути из текущего пути командной строки (в контексте которого вызывается скрипт), то это ./myDirectoryбудет правильно. В противном случае рассмотрите возможность предоставить нам более подробную информацию о том, где myDirectoryна самом деле находится. Это важно, поскольку область действия относительного пути myDirectoryможет отличаться несколькими способами. Не зная вашего явного случая, ответ, связанный с этим, будет только общим ответом, который может быть неприменим к вашему конкретному случаю.
  3. Выражение условия [и ]доступно только в 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 и т. д.

Связанный контент