user1:user1
Unix にはと という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
フラグ-f
を設定すると、rm
削除するファイルがない場合でもエラーは発生しません。
答え4
そうですね、多くの間違いが見られます:
- に書き込むことはできません
myDirectory
。 のみuser2
に書き込むことができます。 - 絶対パスと相対パスを混同しています。
/myDirectory
は とは異なるディレクトリですmyDirectory
。スクリプトが をファイルシステムのルート フォルダ にコピーしようとしているため、これもアクセス許可拒否エラーの原因となる可能性があります。が現在のコマンド ライン パス (スクリプトが呼び出されるコンテキスト) からのパスに対して相対的であるmyDirectory
場合は、が正しいことになります。それ以外の場合は、 が実際に配置されている場所のより詳細な情報を提供することを検討してください。 への相対パスのスコープはいくつかの方法で異なる可能性があるため、これは重要です。具体的なケースがわからないと、これに関連する回答は一般的な回答のみになり、特定のケースには適用できない可能性があります。myDirectory
./myDirectory
myDirectory
myDirectory
[
and条件式]
は でのみ使用可能でありBash
、 では使用できませんShell
。 の定義は、Shell
現在動作している UNIX システムによっても異なります。通常、Linux では を指しますBash
。Linux には直接実装がなくShell
、BSD にもないためです。Mac だけが独自の直接Shell
実装を持っています。したがって、Shell
は単なる理論上の UNIX 標準であり、今日ではその理論文書のさまざまな方言や解釈にまで至っていますが、それは現在動作している UNIX システムによって大きく異なります。したがって、代わりに better を直接使用してくださいBash
。これは、ほとんどの UNIX プラットフォームで 100 % 動作します。Bash が使用できない UNIX システムを私は知りません。
考慮すべき他の興味深い点: と という複数のグループを追加したい場合がありますuser1
。user2
次に、 のプライマリ フォルダー グループをmyDirectory
そのグループに変更できます。これが、私が知る限り、そのための一般的なアプローチです。
また、shebang コマンド経由で Bash を使用することもできます/usr/bin/env
。これにより、実際に任意の Bash に移動できるようになります。
#!/usr/bin/env bash
これは、perl、php などの他のスクリプト言語にも適したアプローチです。