一个用户将文件复制到不同用户拥有的目录中的 shell 脚本

一个用户将文件复制到不同用户拥有的目录中的 shell 脚本

我在 Unix 中有两个用户和组:user1:user1user2: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

的权限groupmydirectory影响您在该目录中删除或创建文件的方式。

首先user1运行以下命令:

chmod g+w mydirectory

答案3

如果是需要写入的用户,即您要复制的用户,那就更好了,运行脚本。这样,您就不必授予目标目录特殊的写入权限。

另外,测试

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

有故障。该-f测试采用一个参数,但如果模式与多个文件匹配,则需要传递多个参数。既然你想清空myDirectory压缩tar档案的目录,那么就足够了

rm -f /myDirectory/*.tar.gz

如果没有要删除的文件,标记 to 将导致它不会出错-frm

答案4

好吧,我看到很多错误:

  1. 不允许您写入myDirectory。只user2允许在那里写入。
  2. 您将绝对路径与相对路径混淆了。/myDirectory是与 不同的目录myDirectory。这也可能导致权限被拒绝错误,因为您的脚本正在尝试将其复制到文件系统根文件夹中myDirectory。如果myDirectory是相对于当前命令行路径(在其中调用脚本的上下文)的路径,那么./myDirectory就是正确的。否则请考虑向我们提供更详细的信息,了解其myDirectory真正所在的位置。这很重要,因为相对路径的范围myDirectory可以在几个方面有所不同。在不了解您的具体情况的情况下,与此相关的答案只能是一般性答案,可能不适用于您的具体情况。
  3. [and条件]表达式仅适用于Bash,不适用于Shell。的定义Shell还取决于您当前工作的 UNIX 系统。通常,在 Linux 中它指向Bash,因为 Linux 没有直接Shell实现,BSD 也没有。只有Mac有自己的直接Shell实现。因此,Shell这只是一个理论上的 UNIX 标准,如今该理论文档有许多不同的方言和解释,这实际上取决于您当前运行的 UNIX 系统。所以,直接使用更好Bash。这在大多数 UNIX 平台上 100% 有效。我不知道有哪个 UNIX 系统中 Bash 是不可用的。

其他一些需要考虑的有趣点:您可能想要添加多个组,它们是user1user2。然后您可以将主文件夹组更改myDirectory为该组。据我所知,这是常见的方法。

您还可以通过 shebang 命令使用 Bash /usr/bin/env,这可确保您真正进入任何 Bash:

#!/usr/bin/env bash

对于其他脚本语言(如 perl、php 等)来说,这也是一个很好的方法。

相关内容