1

soandsoユーザーがファイルを読み取ったり編集したりできることを示すテストまたは仕様を記述できるようにしたいと考えていますsuch_and_such。最終的にはこれを RSpec に含めたいと考えていますが、Ruby の File クラスでは利用できないように見えるため、すべて Bash コマンド (もちろん、きちんと Ruby メソッドにラップされています) になると思います。私が見た他のもの。私はこれを行うために Bash で何かを探していましたが、何も見つかりません (そして、File クラスにも何も役に立たないようです)。(注: File.owned? は、任意のユーザーが編集または読み取りの権限を持っているかどうかではなく、Ruby コードを実行しているプロセスが所有者であるかどうかのみをテストするため、私が望むことを行いません。そのため、2 つの点で大きく異なります。)

Bashに組み込まれているこれを行う方法はありますか? (または、Ruby、または見逃した Ruby の宝石?) または、ファイルの所有者とグループの情報を取得し、それぞれのビットを読み取り、書き込み、実行してから、自分でシステムを構築する必要がありますか?グループのメンバー (所有者ではない場合) を確認し、所有権またはグループ メンバーシップso_and_soのいずれかを通じて目的のアクセス許可が利用できるかどうかを確認しますか?soandso

私は現在、Unix ライクなシステムでこれを行うことだけに関心がありますが、Windows でも実行される Unix シェルに依存しないものは素晴らしいボーナスになるでしょう。

また、実際のファイルをテストすることに興味があるので、FakeFS のようなものは (私が見る限り) 私には役に立ちません。私のRubyコードがファイルシステムとどのように相互作用するかをテストしようとしているのではなく、必要なすべての操作が実際のファイルとディレクトリで実行できることを確認しようとしています. soandso(繰り返しますが) が file を編集 (または読み取り) できることを指定できるようにしたいのですがsuch_and_such、ファイルが によって所有されていることを指定するのではありません。これの要点は、所有権を指定することではなく(これは実装の詳細であり、セキュリティなどの他の要件に対応するために変更する必要がある場合があるため)、アプリケーションとユーザーが実際にファイルシステムに対して/ファイルシステム内で実行できるようにする必要があることのみを指定することです.such_and_suchsoandso

4

3 に答える 3

1

Ruby スクリプトを実行しているユーザーが必要な権限を持っている場合は、特定のユーザーでsudo.

sudo -u soandso test -r such_and_such

-r読みやすさ、書きやすさをテストし-wます。戻りコードは0、テストに合格した場合です。

ところで、あなたが探している機能はスーパーユーザーしか利用できないので (他の誰かが十分な権限を持っているかどうかを判断するには、少なくとも読み取り権限が必要になるため)、それは理にかなっています。 Ruby File クラスではすぐには利用できません。

于 2012-11-13T22:21:11.670 に答える
0

File::Stat および Etc モジュールでパーミッションを解析する

これは事前にパッケージ化されたソリューションではありませんが、モード、uid、および gid 情報を取得するためにstatに十分なアクセス権がある特定のファイルを検査できるはずです。次に、 /etc/passwdおよび/etc/groupを解析して、特定のユーザーに十分な権限があるかどうかを確認できます。

構成要素には次のものがあります。

# Get the file's octal mode.
File.stat('/etc/passwd').mode.to_s(8)
#=> "100644"

# Get the group ID assigned to the file.
File.stat('/etc/passwd').gid
#=> 0

# Get the username associated with the given GID.
Etc.getpwuid(0).name
#=> "root"

idユーティリティを使用して、特定のユーザーに関する情報を取得することもできます。例えば:

%x{id root}
#=> "uid=0(root) gid=0(root) groups=0(root)\n"

しかし、 idからの出力を解析するよりも、標準ライブラリを使用する方が簡単だと思います。YMMV。

于 2012-11-13T23:03:27.593 に答える
0

試したことはありませんが、FileTest メソッドが「有効なユーザー ID」で動作すると言われているように機能するかどうかは疑問です。

File.readable?(file_name) → true or false Link
Returns true if the named file is readable by the effective user id of this process.
File.writable?(file_name) → true or false Link
Returns true if the named file is writable by the effective user id of this process.

seteuid と組み合わせるとうまくいくかもしれません。

Process::Sys.seteuid(integer) → nil Link
Set the effective user ID of the calling process to integer. Not available on all platforms.

グループ用もありsetegidます...

于 2012-11-13T22:19:31.923 に答える