web-dev-qa-db-ja.com

コマンドラインからバイナリファイルのアクセス許可を取得するにはどうすればよいですか?

stat -c "%a %n" *を使用することで、8進モード(755など)でファイル許可を取得しています。バイナリモード(111 101 101など)でファイル許可を確認する方法はありますか?

2
sourav

単一ファイルの場合:

stat -c "%a" filename.txt | xargs -I PERM echo "obase=2; ibase=8; PERM" | bc

そして、1つのファイルのそれ以上のためのより明確なスクリプトとして:

#!/bin/bash
for file in *
do
  perm=$(stat -c "%a" "$file")
  bin=$(echo "obase=2; ibase=8; $perm" | bc)
  echo "$bin $file"
done

出力:

110110100 baz
110110100 foo
110110101 bar

ノート

  • まず、for file in *を使用してすべてのファイルとディレクトリをループします。
  • stat -c "%aを使用して、ファイル許可を8進数で収集してから、
  • echoを使用して、他の必要な詳細をpermissionに追加し、bcに追加します。
  • 最後にbcが変換を行い、結果とファイル名を出力します。
  • obase = 2;出力はバイナリでなければならないことを意味し、ibase = 8は入力が8進数であり、$ permが664のような8進数のファイル許可であることを意味します。
6
Ravexina

Perl stat モジュールを使用してこれを行うことができます。与えられた

$ stat -c '%a %n' *
600 other file
775 somedir
664 somefile

それから

$ Perl -MFile::stat -e 'printf "%b %s\n", (stat $_)->[2] & 07777, $_ for @ARGV' *
110000000 other file
111111101 somedir
110110100 somefile
1
steeldriver

Python

$ python -c 'import sys,os;[ sys.stdout.write( " ".join([bin(os.stat( i ).st_mode)[-9:],i,"\n"]) ) for i in sys.argv[1:] ]' /etc/passwd
110100100 /etc/passwd 

ジョブは、os.stat()関数を介して実行されます。この関数は、10進数形式のisst_modeファイル属性のタプルを返します。次に、それをバイナリに変換し、最後の9桁を抽出します。

すべてがリスト内包内で実行され、コマンドラインで指定されたすべてのファイルを操作します(したがって、複数のファイルを提供したり、globstarを使用したりできます)。

スクリプトとして

#!/usr/bin/env python2

import sys, os

for filename in sys.argv[1:]:
    perms = os.stat(filename).st_mode
    print bin(perms)[-9:], filename
0

visualizeバイナリのファイル許可だけが必要な場合は、ls -lの最初の列を使用できます。

$ ls -ld /bin
drwxr-xr-x 2 root root 4096 mai 18 05:38 /bin

ここで、rwxr-xr-x111101101に対応していることがわかります。

0
wjandrea