一個使用者將檔案複製到不同使用者擁有的目錄中的 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 等)來說,這也是一個很好的方法。

相關內容