あるユーザーが別のユーザーが所有するディレクトリにファイルをコピーするシェルスクリプト

あるユーザーが別のユーザーが所有するディレクトリにファイルをコピーするシェルスクリプト

user1:user1Unixには2人のユーザーとグループがあります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

これを行うには、グループ権限を使用できます。ユーザーグループを作成し、2人のユーザーを追加し、ターゲットディレクトリのグループ所有権を変更する必要があります。まず、グループを作成します。

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では1つのパラメータを使用しますが、パターンが複数のファイルと一致する場合は、複数のパラメータを渡す必要があります。myDirectory圧縮されたアーカイブのディレクトリを空にしたい場合はtar十分です。

rm -f /myDirectory/*.tar.gz

削除するファイルがない場合を表示してもエラーは発生しません-frm

答え4

まあ、エラーがたくさん見えます。

  1. あなたは書くことができませんmyDirectory。そこでは、書き込みのみがuser2許可されます。
  2. 絶対パスと相対パスを混同しています。/myDirectory別のディレクトリですmyDirectory。スクリプトがファイルシステムのルートフォルダにコピーしようとしているため、権限拒否エラーが発生する可能性がありますmyDirectorymyDirectoryパスが現在のコマンドラインパス(スクリプトが呼び出されたコンテキスト)に相対的な場合、これは./myDirectory正しいです。そうでない場合は、実際の場所に関する詳細情報を提供してくださいmyDirectory。相対パスの範囲はmyDirectoryさまざまな方法で異なる可能性があるため、これは重要です。あなたの特定の状況を知らない限り、これに関連する回答は一般的なものであり、特定の状況には適用されない可能性があります。
  3. [条件]式はのみ適用され、適用されBashませんShell。の定義は、Shell現在作業しているUNIXシステムによって異なります。一般に、LinuxではBashLinuxが直接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などの他のスクリプト言語にも良いアプローチです。

関連情報