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

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

user1:user1Unix にはと という2 つのユーザーとグループがありますuser2:user2

以下の詳細を含むディレクトリがありますmyDirectoryls -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

フラグ-fを設定すると、rm削除するファイルがない場合でもエラーは発生しません。

答え4

そうですね、多くの間違いが見られます:

  1. に書き込むことはできませんmyDirectory。 のみuser2に書き込むことができます。
  2. 絶対パスと相対パスを混同しています。/myDirectoryは とは異なるディレクトリですmyDirectory。スクリプトが をファイルシステムのルート フォルダ にコピーしようとしているため、これもアクセス許可拒否エラーの原因となる可能性があります。が現在のコマンド ライン パス (スクリプトが呼び出されるコンテキスト) からのパスに対して相対的であるmyDirectory場合は、が正しいことになります。それ以外の場合は、 が実際に配置されている場所のより詳細な情報を提供することを検討してください。 への相対パスのスコープはいくつかの方法で異なる可能性があるため、これは重要です。具体的なケースがわからないと、これに関連する回答は一般的な回答のみになり、特定のケースには適用できない可能性があります。myDirectory./myDirectorymyDirectorymyDirectory
  3. [and条件式]は でのみ使用可能でありBash、 では使用できませんShell。 の定義は、Shell現在動作している UNIX システムによっても異なります。通常、Linux では を指しますBash。Linux には直接実装がなくShell、BSD にもないためです。Mac だけが独自の直接Shell実装を持っています。したがって、Shellは単なる理論上の UNIX 標準であり、今日ではその理論文書のさまざまな方言や解釈にまで至っていますが、それは現在動作している UNIX システムによって大きく異なります。したがって、代わりに better を直接使用してくださいBash。これは、ほとんどの UNIX プラットフォームで 100 % 動作します。Bash が使用できない UNIX システムを私は知りません。

考慮すべき他の興味深い点: と という複数のグループを追加したい場合がありますuser1user2次に、 のプライマリ フォルダー グループをmyDirectoryそのグループに変更できます。これが、私が知る限り、そのための一般的なアプローチです。

また、shebang コマンド経由で Bash を使用することもできます/usr/bin/env。これにより、実際に任意の Bash に移動できるようになります。

#!/usr/bin/env bash

これは、perl、php などの他のスクリプト言語にも適したアプローチです。

関連情報