Как получить число разрешения строкой:-rw-r - r--

Одинарные левые кавычки означают замену команды: результат расширения `pidof transmission-gtk` вывод от выполнения команды pidof transmission-gtk. Альтернативный способ записать `pidof transmission-gtk` $(pidof transmission-gtk), и тот альтернативный путь рекомендуется (он не имеет никаких оборотных сторон, и он избегает проблем, когда команда в одинарных левых кавычках сама содержит кавычки).

Двойные кавычки вокруг этого препятствуют тому, чтобы результат замены команды был разделен на отдельные слова и интерпретирован как подстановочные шаблоны. Если Вы только запускаете со сценариев оболочки, не волнуйтесь об этом, просто не забудьте всегда помещать двойные кавычки вокруг замен команды. То же идет для подстановок переменных, например, всегда пишите "$foo", никогда плоскость $foo.

Этот отрывок, как записано не имеет никакого смысла: тест содержит отдельное слово, которое будет чем-то как =0 (если нет никакого выполнения transmission-gtk процесс) или 1234=0 (если существует процесс соответствия), или 123 456=0 (отдельное слово в терминологии оболочки, даже если это, оказывается, содержит пространство). Отдельное слово в тесте всегда считают верным. Чтобы протестировать, равна ли строка другой строке, записать [ "string1" = "string2" ] (должно быть пространство на каждой стороне скобок, и на каждой стороне оператора). Для тестирования на числовое равенство используйте -eq оператор, например. [ 1 -eq 01 ] верно.

Здесь, существует два эквивалентных способа протестировать, существует ли выполнение transmission-gtk процесс:

  • Тест, пуст ли вывод:

    if [ -z "$(pidof transmission-gtk)" ]; then …
    
  • Тест, ли статус возврата pidof является ненулевым, указывая на отказ. Так как вывод команды не используется, перенаправьте его к /dev/null (большая пустота).

    if ! pidof transmission-gtk >/dev/null; then
    

55
31.05.2012, 07:31
7 ответов

Проверьте stat вывод:

# stat .xsession-errors 
  File: ‘.xsession-errors’
  Size: 839123          Blocks: 1648       IO Block: 4096   regular file
Device: 816h/2070d      Inode: 3539028     Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/     lik)   Gid: ( 1000/     lik)
Access: 2012-05-30 23:11:48.053999289 +0300
Modify: 2012-05-31 07:53:26.912690288 +0300
Change: 2012-05-31 07:53:26.912690288 +0300
 Birth: -
53
27.01.2020, 19:33
  • 1
    stat -c %a /path/to/file волшебный прием, в котором Вы нуждаетесь. –  fromnaboo 09.08.2012, 16:05
  • 2
    и ответ находятся в блоке Доступа там выше. Файлу, который он использовал в примере, установили другой доступ затем тот в вопросе. тот в вопросе показал бы Доступ: (0644/rwr - r-) –  nycynik 10.07.2014, 00:54
r=4
w=2
x=1

в каждой группе. Ваш пример 6 (r+w=4+2) 4 (r=4) 4 (r=4).

67
27.01.2020, 19:33

Число режима полных полномочий является 4-разрядным восьмеричным числом, хотя большую часть времени, Вы только используете 3 младших значащих цифры. Сложите каждую группу в строке полномочий, беря r=4, w=2, x=1. Например:

 421421421
-rwxr-xr--
 \_/        -- r+w+x = 4+2+1 = 7
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+_ = 4+0+0 = 4     => 0754

Теперь, иногда Вы будете видеть нечетный modestring как это:

-rwsr-xr-T

Четвертая цифра перегружается на x биты в modestring. Если Вы видите букву кроме x там, затем это означает, что один из этих "специальных" четырех-разрядных битов установлен, и если буква является нижним регистром, то x поскольку то положение также установлено. Таким образом, перевод для этого:

   4  2  1
 421421421
-rwsr-xr-T
   +  +  +  -- s+_+T = 4+0+1 = 5  
 \_/        -- r+w+s = 4+2+1 = 7  (s is lowercase, so 1)
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+T = 4+0+0 = 4  (T is uppercase, so 0)   => 05754

Стандартный UNIX способ показать, что число является восьмеричным, должен запустить его с нуля. GNU chmod примет режим, который Вы даете ему, является восьмеричным так или иначе, но является самым безопасным предварительно ожидать нуль.

Наконец, если Вы видите a + в конце modestring:

-rwxr-xr-x+

затем это означает, что файл расширил полномочия, и Вам будут нужны больше, чем chmod. Изучите setfacl и getfacl команды, для начинающих.

26
27.01.2020, 19:33

Это может быть прямо

-bash-3.2$ stat --format=%a sample_file
755
10
27.01.2020, 19:33

Получите список файлов с их строковыми и шестнадцатеричными значениями разрешений. Ввод% N в конце, чтобы вывод можно было легко перенести в Excel.

stat -c "%A %a %N" *

-rw-r--r-- 644 `file2.txt'
-rw-r--r-- 644 `file3.txt'
-rw-r--r-- 644 `file4.txt'
-rw-r--r-- 644 `file.txt'
drwxr-xr-x 755 `hsperfdata_root'
-rw-r--r-- 644 `junk.txt'
drwx------ 700 `vmware-root'

Это найдет все файлы с определенным шестнадцатеричным разрешением.

find /tmp1 -user root -perm 644
0
27.01.2020, 19:33

Для всех параллельных файлов в каталоге

-bash-4.1$ chmod -R 640 *

Для всех файлов

-bash-4.1$ chmod 640 *
-2
27.01.2020, 19:33

Разрешения — это просто строковое представление двоичного числа.
0в основном представлено -, остальные буквы.

базовый

Для базовых разрешений:

Преобразуйте все -и заглавные буквы Sили Tв 0, остальные должны представлять 1.
Результирующее двоичное число, построенное таким образом, должно быть напечатано как восьмеричное :

.
$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644

В одну строку:

$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644

Исправление ошибок и обнаружение остальных 3 битов 1000, 2000или 4000требуют дополнительного кода:

#!/bin/bash

Say     (){ printf '%s\n' "$@"; }
SayError(){ a=$1; shift; printf '%s\n' "$@" >&2; exit "$a"; }

e1="Permission strings should have 10 characters or less"
e2="Assuming first character is the file type"
e3="Permission strings must have at least 9 characters"
e4="Permission strings could only contain 'rwxsStT-'"

a=$1

((${#a}>10))  &&   SayError 1 "$e1"
((${#a}==10)) && { Say        "$e2"; a=${a#?}; }
((${#a}<9))   &&   SayError 2 "$e3"
a=${a//[^rwxsStT-]}
((${#a}<9))   &&   SayError 3 "e4"
b=${a//[ST-]/0}; b=${b//[!0]/1}; c=0
[[ $a =~ [sS]......$ ]] && c=$((c|4)) 
[[ $a =~    [sS]...$ ]] && c=$((c|2)) 
[[ $a =~       [tT]$ ]] && c=$((c|1))

printf '%04o\n' "$((2#$b|c<<9))"
5
27.01.2020, 19:33

Теги

Похожие вопросы