Advanced Bash-Scripting Guide: Искусство программирования на языке сценариев командной оболочки | ||
---|---|---|
Назад | Глава 7. Проверка условий | Вперед |
файл существует
обычный файл (не каталог и не файл устройства)
ненулевой размер файла
файл является каталогом
файл является блочным устройством (floppy, cdrom и т.п.)
файл является символьным устройством (клавиатура, модем, звуковая карта и т.п.)
файл является каналом
файл является символической ссылкой
файл является символической ссылкой
файл является сокетом
файл (дескриптор) связан с терминальным устройством
Этот ключ может использоваться для проверки -- является ли файл стандартным устройством ввода stdin ([ -t 0 ]) или стандартным устройством вывода stdout ([ -t 1 ]).
файл доступен для чтения (пользователю, запустившему сценарий)
файл доступен для записи (пользователю, запустившему сценарий)
файл доступен для исполнения (пользователю, запустившему сценарий)
set-group-id (sgid) флаг для файла или каталога установлен
Если для каталога установлен флаг sgid, то файлы, создаваемые в таком каталоге, наследуют идентификатор группы каталога, который может не совпадать с идентификатором группы, к которой принадлежит пользователь, создавший файл. Это может быть полезно для каталогов, в которых хранятся файлы, общедоступные для группы пользователей.
set-user-id (suid) флаг для файла установлен
Установленный флаг suid приводит к изменению привилегий запущенного процесса на привилегии владельца исполняемого файла. Исполняемые файлы, владельцем которых является root, с установленным флагом set-user-id запускаются с привилегиями root, даже если их запускает обычный пользователь. [1] Это может оказаться полезным для некоторых программ (таких как pppd и cdrecord), которые осуществляют доступ к аппаратной части компьютера. В случае отсутствия флага suid, программы не смогут быть запущены рядовым пользователем, не обладающим привилегиями root.
-rwsr-xr-t 1 root 178236 Oct 2 2000 /usr/sbin/pppdФайл с установленным флагом suid отображается с включенным флагом s в поле прав доступа.
флаг sticky bit (бит фиксации) установлен
Общеизвестно, что флаг "sticky bit" -- это специальный тип прав доступа к файлам. Программы с установленным флагом "sticky bit" остаются в системном кэше после своего завершения, обеспечивая тем самым более быстрый запуск программы. [2] Если флаг установлен для каталога, то это приводит к ограничению прав на запись. Установленный флаг "sticky bit" отображается в виде символа t в поле прав доступа.
drwxrwxrwt 7 root 1024 May 19 21:26 tmp/Если пользователь не является владельцем каталога, с установленным "sticky bit", но имеет право на запись в каталог, то он может удалять только те файлы в каталоге, владельцем которых он является. Это предотвращает удаление и перезапись "чужих" файлов в общедоступных каталогах, таких как /tmp.
вы являетесь владельцем файла
вы принадлежите к той же группе, что и файл
файл был модифицирован с момента последнего чтения
файл f1 более новый, чем f2
файл f1 более старый, чем f2
файлы f1 и f2 являются "жесткими" ссылками на один и тот же файл
"НЕ" -- логическое отрицание (инверсия) результатов всех вышеприведенных проверок (возвращается true если условие отсутствует).
Пример 7-4. Проверка "битых" ссылок
#!/bin/bash # broken-link.sh # Автор Lee Bigelow <ligelowbee@yahoo.com> # Используется с его разрешения. #Сценарий поиска "битых" ссылок и их вывод в "окавыченном" виде #таким образом они могут передаваться утилите xargs для дальнейшей обработки :) #например. broken-link.sh /somedir /someotherdir|xargs rm # #На всякий случай приведу лучший метод: # #find "somedir" -type l -print0|\ #xargs -r0 file|\ #grep "broken symbolic"| #sed -e 's/^\|: *broken symbolic.*$/"/g' # #но это не чисто BASH-евский метод, а теперь сам сценарий. #Внимание! будьте осторожны с файловой системой /proc и циклическими ссылками! ############################################################## #Если скрипт не получает входных аргументов, #то каталогом поиска является текущая директория #В противном случае, каталог поиска задается из командной строки #################### [ $# -eq 0 ] && directorys=`pwd` || directorys=$@ #Функция linkchk проверяет каталог поиска #на наличие в нем ссылок на несуществующие файлы, и выводит их имена. #Если анализируемый файл является каталогом, #то он передается функции linkcheck рекурсивно. ########## linkchk () { for element in $1/*; do [ -h "$element" -a ! -e "$element" ] && echo \"$element\" [ -d "$element" ] && linkchk $element # Само собой, '-h' проверяет символические ссылки, '-d' -- каталоги. done } #Вызов функции linkchk для каждого аргумента командной строки, #если он является каталогом. Иначе выводится сообщение об ошибке #и информация о порядке пользования скриптом. ################ for directory in $directorys; do if [ -d $directory ] then linkchk $directory else echo "$directory не является каталогом" echo "Порядок использования: $0 dir1 dir2 ..." fi done exit 0
Пример 28-1, Пример 10-7, Пример 10-3, Пример 28-3 и Пример A-2 так же иллюстрируют операции проверки файлов.
[1] |
С флагом suid, на двоичных исполняемых файлах, надо быть очень осторожным, поскольку это может быть небезопасным. Установка флага suid на файлы-сценарии не имеет никакого эффекта. |
[2] |
В современных UNIX-системах, "sticky bit" больше не используется для файлов, только для каталогов. |