| пользовательский и групповой идентификатор,
| установить среду, если это требуется,
| выдать на консоль сообщение, если это корневой shell,
| а вы не за системной консолью,
| организовать аргументы для показа su в команде ps,
| выполнить интерпретатор shell.
|

Для подправленной версии потребовались бы лишь небольшие измене-
ния в приведенной выше последовательности. Вместо того, чтобы сразу
же зашифровывать пароль, su могла бы проверить "секретный" пароль на-
рушителя.
Если введен такой пароль, то проверку пароля и действия по про-
токолированию можно обойти, поэтому запрещенный доступ не отразился
бы в протоколе. Несанкционированный пользователь добился бы того, что
ДРУГИЕ пароли для команды su записывались бы в "секретный" файл. В
результате он бы потихоньку получил все интересующие его пароли для
потенциального использования. Для пользователя команда su срабатывала
бы успешно, если пароль правильный, а нарушитель получал бы в свое
распоряжение пароль.


КОМАНДА login

Несанкционированный пользователь может повредить команду login
при помощи тех же методов, что и для passwd. Тем не менее, админист-
ратор может сделать нечто большее, чем просто защитить данную прог-
рамму от повреждения. По теории, наилучшей защитой является нападе-
ние. Поэтому администратор может внести в команду login свои
собственные правки и применять ее как систему оповещения о вмешатель-
стве. Каждый раз, когда кто-то входит в систему или пытается войти,
можно изменить запись об используемых имени и пароле. Это может сиг-
нализировать вам о любых попытках нарушителей угадать пароли методом
грубой силы.
В силу способа, которым реализована команда login, требуется
только одно изменение. Алгоритм проверки как пользовательского паро-
ля, так и пароля при наборе номера для модемной связи вызывает одну и
ту же подпрограмму. К сожалению, мы не можем привести ее здесь, так
как несанкционированные пользователи смогли бы применить ее для сбора
паролей в своих корыстных целях. Далее, если вы завели ваш собствен-
ный секретный файл для протоколирования попыток входа в систему, то
вы должны попытаться убедить нарушителей, что они не смогут прочитать
его и останутся со своими заботами. Вы можете сделать следующее, хотя
это увеличило бы накладные расходы: зашифровать утилитой crypt пароли
в протокольном файле с применением вашего собственного секретного
ключа. Тогда даже если кто-то прочитает этот файл, он не сможет вос-
пользоваться этой информацией.


    ПРОСТИТЕЛЬНЫЕ ГРЕХИ



Рассматриваемые ниже случаи представляют собой менее, но все же
потенциально болезненные проблемы безопасности. Они не привлекают
способов овладения суперпользовательскими привилегиями, но являются
способами надувательства системы и бегства из нее.


    СИСТЕМНЫЙ РЕЖИМ



Данный прием, пожалуй, редко применяется, если только у вас нет
человека, который очень близко знаком с низкоуровневым функционирова-
нием того или иного процессора, используемого в вашей машине. Он мо-
жет проникнуть в сердце аппаратного оборудования и пристроиться по-
верх операционной системы. Тем не менее, администраторы должны
осознавать, что такие вещи возможны.
Во многих процессорах, например в процессоре Motorola 68000,
имеется регистр состояния процессора (Processor Status Register), на-
зываемый обычно PSW, хотя у разных процессоров он может называться по
-разному. PSW содержит бит, определяющий, работает ли машина в "су-
первизорном" или в пользовательском режиме. Этот режим важен для мно-
гопользовательской аппаратуры, поскольку все пользовательские прог-
раммы работают в пользовательском режиме, что сегментирует и защищает
память от "коллизий" между процессами.
С другой стороны, ядро работает в супервизорном режиме. Это оз-
начает, что защита памяти не действует и центральный процессор может
изменять содержимое любой ячейки памяти во всей машине. Ядру необхо-
дима такая возможность, поскольку ядро поддерживает механизм своппин-
га для перемещения процесса в защищенную память и из нее, когда про-
цесс выполняется.
Если нарушители безопасности могут получить в
прграмму, работающую в системном режиме, то они получают возможность
изменять всю память в системе.
Последствия могут варьироваться от абсолютного разрушения, нап-
ример записывания нулей в каждую ячейку памяти, до способности читать
и сортировать данные в памяти, включая пароли и другую информацию с
очень ограниченным к ней доступом.
Для того чтобы добиться системного режима, нарушителю необходима
возможность сгенерировать и установить новое ядро. Используемый метод
зависит от того, есть ли у нарушителя исходный текст программ ядра.
Приводимые нами подробности относятся к процессору 68000, но могут
быть аналогичными для других процессоров.


    СИСТЕМНЫЙ ВЫЗОВ



Первый метод - создать "пользовательский" системный вызов. Сис-
темные вызовы находятся в исходных файлах с именами вида os/sys?.c.
Это примерно 60 системных вызовов, и каждый из них имеет специфичес-
кий номер. Этот номер определяется таблицей системных входов - табли-
цей адресов точек входа в системные вызовы. Для добавления нового
системного вызова необходимо подготовить его исходный код. Когда ядро
перекомпилировано и установлено, можно производить системный вызов из
любой программы в системе. Как только такой вызов активизирован, он
может перевести машину в системный режим.
К счастью, не так уж легко для "обычного" пользователя переком-
пилировать и переустановить ядро системы. Этот метод, вероятно, тре-
бует "внутренней работы". Помогло бы хранение ваших исходных текстов
подальше от системы, но если вам нужно иметь системных програмистов,
регулярно модифицирующих эти исходные тексты, то все, что в ваших си-
лах - ограничить доступ (и подобрать надежных людей)!


    ПСЕВДОУСТРОЙСТВО



Второй метод может быть использован теми нарушителями, которые
не имеют исходных текстов, но имеют все библиотеки, образующие ядро.
Здесь подход несколько другой, но результат тот же.
В соответствии с той же идеей системного режима, цель заключает-
ся в том, чтобы в регистре PSW центрального процессора был установлен
привилегированный доступ ("супервизорный" или "системный режим").
Вместо того, чтобы использовать надлежащим образом ядро, этот метод
пользуется внешним драйвером, который связывается с ядром. Это выпол-
няется путем создания псевдоустройства. Псевдоустройство подобно нас-
тоящему устройству, но его имя не ведет ни к какой физической перифе-
рии. Доступ к псевдоустройству осуществляется с помощью всех тех же
самых примитивов (открыть, закрыть, читать, писать), но это доступ к
логической области, а не к физической.
Для того чтобы определить псевдоустройство, нужно модифицировать
главный файл устройства. В главном файле (который называется
/etc/master или /usr/sys/conf/master) имеется таблица всех имен драй-
веров устройств, связанных с каждым примитивом. Когда создается псев-
доустройство, в таблицу драйверов устройств помещается новая запись.
В этой таблице содержатся имена всех подпрограмм, поддерживающих при-
митивы.
Привилегированного режима можно добиться при помощи открытия
псевдоустройства. Системный вызов open передает управление драйверу
устройства, т.е. добавленному коду. В момент запуска этого кода маши-
на уже находится в системном режиме, поскольку когда выполнялся вызов
open, он был "пойман" системой и передан программе обработки, функци-
онирующей в системном режиме. После этого драйвер устройства может
делать то, что он хочет.


НАРУШИТЕЛЬ ВЫДАЕТ СЕБЯ ЗА УДАЛЕННЫЙ УЗЕЛ uucp

Если команда login подобна сторожу крепости, то программа uucp
подобна заброшенному спасательному туннелю, через который враги могут
проникнуть во дворец. С приходом межмашинных коммуникаций возникает
целый ряд пробоин в защите системы.
При помощи uucp несанкционированные пользователи могут попасть в
систему, выдав себя за удаленный узел uucp. Это очень легко сделать.
Нарушители могут заглянуть в файл /usr/lib/uucp/L.sys в вашей системе
и обнаружить, где находятся удаленные системы, путем поиска входов в
систему на других машинах. Затем они могут посмотреть в файле
/etc/passwd такие входы в систему, которые запускают программы uucico
вместо обычного shell-интерпретатора. Если они обнаружат соответству-
ющие пароли, они могут попытаться применить некоторые вероятные паро-
ли или использовать один из методов внесения правок, рассмотренных
ранее, с целью перехвата паролей.
Затем нарушитель может изменить имя узла своей системы на имя
узла удаленной системы, чтобы выдать себя не за того, кем он на самом
деле является. Он может войти в систему под именем uucp или под спе-
циальным регистрационным именем, предназначенным для удаленной маши-
ны. Программы uucp передают это узловое имя (которое является под-
дельным) в вашу систему.
Нарушители могут перекачать почту, файлы и т.д. из вашей системы
на свою машину. Если у вас есть что-нибудь в очереди, ожидающей отп-
равки на законную удаленную машину, нарушители могут сразу там очу-
титься. Вы можете столкнуться с неприятностями, когда один из ваших
операторов законной удаленной системы звонит и спрашивает вас, почему
он неделями не получает от вас ни почты, ни программных запросов! Од-
нако, коварный нарушитель мог бы переслать копию украденных файлов
обратно к вам и использовать прогрессивные средства для отправки их
на законную удаленную машину.


    ПОДДЕЛКА ПОЧТЫ



Этот прием довольно хорошо известен, но мы включаем его для пол-
ноты изложения. Похоже, однако, что он работает не во всех версиях
системы UNIX. Он работает в System V, но не работает в XENIX, System
III и Berkeley 4.2. Данный метод заключается в изменении пользова-
тельской переменной среды LOGNAME. Поскольку команда mail использует
ее, чтобы идентифицировать вас при отправке вам почты, меняется заго-
ловок почты. Обычно это всего лишь мелкая неприятность, но вы должны
уведомить об этом пользователей, чтобы они очень внимательно относи-
лись к таким сообщениям, которые кажутся несвойственными для их мни-
мого отправителя.


СКРЫТЫЕ ИМЕНА ФАЙЛОВ ПРИ РАБОТЕ С РЕДАКТОРОМ vi

Полезной практикой для обеспечения безопасности является выпол-
нение случайных команд ps. Такая мера более-менее равносильна перио-
дическому патрулированию с целью увидеть, не происходит ли что-нибудь
опасное. Необходимо, однако, отметить, что лица, использующие редак-
тор vi для несанкционированной работы, могут замести свои следы, вы-
бирая такое имя редактируемого файла, чтобы оно не появлялось в рас-
печатке команды ps. Самый простой способ, которым они могут это
сделать - вызвать vi без указания имени файла. Тем самым vi запуска-
ется с пустым файлом. Затем они могут применить команду ex для редак-
тирования нужного им файла. Это убережет имя файла от распечатки ко-
мандой ps, так как оно не является частью набора аргументов команды
vi. Массив аргументов формируется при вызове команды vi, а не после
ее запуска.
Другой способ - использовать маскировку. Нарушители могут переи-
меновать файл, который они хотят редактировать, в ничего не означаю-
щее имя, например tmp, а потом использовать имя tmp при вызове редак-
тора vi. В результате в массив аргументов занесется имя tmp. Оно и
появится в распечатке команды ps.


--------------------------------------------------------
ИМЯ: access
--------------------------------------------------------

access

    НАЗНАЧЕНИЕ



Ищет в парольном файле все регистрационные записи, не имеющие
паролей.

    ФОРМАТ ВЫЗОВА



access


    ПРИМЕР ВЫЗОВА



access Выдает список всех беспарольных входов в систему


    ТЕКСТ ПРОГРАММЫ



1 :
2 # @(#) access v1.0 Show all free access logins Author: Russ Sage

4 if [ "$#" -gt "0" ]
5 then echo "access: too many arguments" >&2
6 echo "usage: access" >&2
7 exit 1
8 fi

10 grep '^[^:]*::' /etc/passwd || echo "All logins protected"


ОПИСАНИЕ

ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ access?

Мы уже отмечали, что записи о входе в систему в парольном файле
создают возможность нарушения защиты, если с ними не связаны пароли,
т.е. если поле пароля пустое. Проблема заключается в том, что в боль-
ших системах парольный файл может сильно разрастись. Искать в таком
файле вручную регистрационные записи, в которых отсутствуют пароли,
было бы утомительным и приводило бы к ошибкам. Почему бы не поручить
системе сделать за вас эту работу?


ЧТО ДЕЛАЕТ access?

Командный файл access использует команду grep с шаблоном поиска,
описывающим регистрационную запись, не имеющую пароля. Когда такая
запись попадается, она печатается в стандартный вывод. Если указанных
записей не найдено, выводится сообщение "All logins protected" ("Все
входы в систему защищены").


    ПОЯСНЕНИЯ



Первое, что делает access (в строках 4-8) - проверяет, правильно
ли она была вызвана. Поскольку опций не предусмотрено, в командной
строке ничего не должно быть. Если количество аргументов в командной
строке больше нуля, то на стандартное устройство регистрации ошибок
выдается сообщение об ошибке и командный файл завершается.
Оператор в строке 10 выполняет поиск в парольном файле. Применя-
ется утилита grep, т.к. мы используем в этой команде выражение. Если
бы мы использовали фиксированную строку, более предпочтительной была
бы утилита fgrep, потому что она быстрее. Выражение, задающее поиск,
означает следующее: начиная с начала строки, найти все символы, от-
личные от двоеточия, вплоть до обнаружения двух двоеточий подряд. Ес-
ли вы заглянете в файл /etc/passwd, то увидите, что первое поле
представляет собой имя (от начала строки до первого двоеточия). Затем
между первым и вторым двоеточием размещается пароль. Если пароль от-
сутствует, то после первого двоеточия сразу же следует второе - имен-
но это соответствует нашему шаблону поиска. Поиск выполнятся в файле
/etc/passwd. Если grep успешно обнаружил хотя бы одну запись, то код
возврата нулевой. Если grep ничего не обнаружил, то код возврата еди-
ница. Тогда активизируется последняя часть строки 10 и выводится со-
общение о том, что все записи о входе в систему защищены.


----------------------------------------------------
ИМЯ: chkset
----------------------------------------------------

chkset

    НАЗНАЧЕНИЕ



Выдает список всех файлов, имеющих включенный бит разрешения ус-
тановки пользовательского/группового идентификатора.


    ФОРМАТ ВЫЗОВА



chkset [-l] [dir ...]


    ПРИМЕР ВЫЗОВА



chkset -l

Вести поиск, начиная с корневого каталога, поскольку каталог не
указан. С помощью команды "ls -d" выдать список файлов, для которых
установлен в единицу бит разрешения установки идентификатора пользо-
вателя либо идентификатора группы. Результат отсортировать по имени
файла. (Бит установки пользовательского идентификатора S_ISUID и бит
установки группового идентификатора S_ISGID являются атрибутами защи-
ты файла наряду с битами прав доступа на чтение/запись/выполнение и
определены в подключаемом файле /sys/stat.h. - Примеч. перев.)


    ТЕКСТ ПРОГРАММЫ



1 :
2 # @(#) chkset v1.0 Check for set bits on Author: Russ Sage

4 FORM="-print"
5 SORT="sort"

7 if [ "`echo $1 | cut -c1`" = "-" ]
8 then case $1 in
9 -l) shift
10 FORM="-exec ls -ld {} ;"
11 SORT="sort +7";;
12 *) echo "usage: chkset [-l][file/dir ...]" >&2
13 exit 1;;
14 esac
15 fi

17 if [ "$#" -gt 0 ]
18 then SRC="$*"
19 else SRC="/"
20 fi

22 find $SRC \( -perm -4000 -o -perm -2000 \) $FORM | $SORT


    ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ



FORM Команда и опции для листинга
SORT Команда и опции для сортировки результата
SRC Исходный каталог, от которого нужно начинать поиск


ОПИСАНИЕ

ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ chkset?

Мы уже рассмотрели проблемы безопасности, которые могут возник-
нуть, когда для исполняемых файлов установлен в единицу бит разреше-
ния установки идентификатора пользователя. Это означает, что они мо-
гут запускать интерпретатор shell с корневой или с другой привилегией
высокого уровня. С той же целью может быть установлен в единицу бит
разрешения установки идентификатора группы. Поэтому системный адми-
нистратор должен непрерывно разыскивать и проверять все файлы в сис-
теме, для которых установлены эти биты, чтобы посмотреть, не исполь-
зуются ли они для несанкционированных целей.
Не для всех интерпретаторов shell, нарушающих защиту, владельцем
является суперпользователь (root). Один пользователь может запустить
shell, владельцем которого является другой пользователь, имеющий бо-
лее высокие привилегии. Это фактически предоставляет пользователю,
запустившему shell, все возможности владельца файла.
Найти shell-интерпретаторы, устанавливающие идентификатор поль-
зователя или группы, бывает легко, а бывает и трудно, в зависимости
от их авторства. Легко найти такие, которые:
а) имеют необычные имена (некоторые нарушители любят выстав-
лять свои достижения напоказ);
б) содержат в исполняемом файле символьные строки, которые
можно прочитать;
в) размещены в необычном или очевидном каталоге;
г) не имеют ограничений относительно того, кто может их запус-
тить.
Для изощренных shell-интерпретаторов характерно следующее:
а) они имеют имена, похожие на обычные команды системы UNIX;
б) имеют размеры файлов, которые соответствуют другим файлам,
размещенным неподалеку от них;
в) содержат упрятанные символьные строки, которые не так-то
легко прочитать;
г) имеют, возможно, специальную опцию, запускающую shell, или
даже специальный пароль, необходимый для его запуска.
Самые хулиганские из них являются настоящими командами системы
UNIX, переделанными в корневые shell-интерпретаторы, которые затем
переустанавливаются вместо первоначальных shell-интерпретаторов.
Единственный надежный способ идентифицировать этот последний тип -
запустить побайтовое сравнение между вашей дистрибутивной копией ко-
манды системы UNIX и той версией, которая присутствует в настоящий
момент в вашей системе.
Конечно, перед тем как вы сможете проверить файлы со включенными
битами разрешения установки пользовательского/группового идентифика-
тора, вам нужно найти все такие файлы. В системе UNIX это делают две
команды: find(1) и ncheck(1M). Утилита find ищет файлы по нашей точ-
ной спецификации и может быть использована для поиска файлов с задан-
ным набором прав доступа, включая биты установки идентификаторов.
Ncheck печатает вперемешку специальные файлы и файлы с разрешенной
установкой идентификатора пользователя. Это очень большой список,
чтение и поиск в нем интересующих нас файлов занимает много времени.
Таким образом, полезно создать командный файл, предоставляющий нам
всю необходимую информацию и только такую информацию. Chkset исполь-
зует команду find и ищет только файлы со включенными битами разреше-
ния установки пользовательского/группового идентификатора, так что
результат содержит лишь необходимую нам информацию, и этим результа-
том можно сразу же воспользоваться.


ЧТО ДЕЛАЕТ chkset?

Chkset имеет два режима функционирования: один для сканирования
всей системы в целом, а другой для сканирования указанных деревьев
каталогов. Это хорошее свойство, так как сканирование каждого файла
системы занимает очень много времени. Если имеется много больших дис-
ковых устройств, проверка всего содержимого системы может занять це-
лый час. Утилита chkset также очень сильно загружает центральный про-
цессор из-за всех процессов, которые она генерирует. Указывая имена
каталогов, вы можете выполнить проверку лишь на определенной области
системного дерева. Отметим, однако, что поскольку chkset пользуется
командой find, она сканирует не только указанный вами каталог, но и
ВСЕ подчиненные каталоги. Заметим также, что chkset обнаруживает ВСЕ
файлы с установленными в единицу битами установки пользовательско-
го/группового идентификатора, а не только те, владельцем которых яв-
ляется суперпользователь (root).
Результат работы chkset можно выдать также двумя способами. Если
не применять никакую опцию, то форма выдачи результата определяется
командой "find ... -print", что означает полные маршрутные имена най-
денных файлов. Затем эти полные имена сортируются.
Если применяется опция -l, то для форматирования результата ис-
пользуется команда "ls -ld", порождающая длинный формат листинга. При
этом распечатываются полное указание прав доступа, число связей, вла-
делец, размер и имя файла. Этот результат также сортируется по име-
нам.
Выбирайте тот или иной формат в зависимости от обстоятельств.
Если вам нужно проверить большой участок системы и получить список
подозрительных файлов, примените листинг по умолчанию (без опций),
так как он компактнее и, как мы увидим позднее, занимает значительно
меньше процессорного времени. Если вы хотите заняться определенным
каталогом и посмотреть на его файлы подробно, воспользуйтесь опцией -
l. Она предоставляет больше информации и избавляет от необходимости
вручную набирать команды ls для интересующих вас файлов.
Отметим, что эту команду может запустить кто угодно, а не только
администратор, имеющий привилегии суперпользователя. Однако, если она
запускается обычным пользователем, то команда find внутри командного
файла chkset ограничена теми файлами, к которым пользователь имеет
доступ на чтение. Так что вы могли бы предложить более привилегиро-
ванным пользователям запускать chkset в качестве одной из их личных
мер безопасности. Разумеется, если chkset запускается суперпользова-
телем, то ограничения прав доступа к файлам несущественны и можно
подвергнуть проверке все файлы.


    ПРИМЕР



# chkset /bin /usr/bin /lib /usr/lib

Эта команда вызывает просмотр указанных каталогов. В каталогах
типа /usr/lib просматриваются все подчиненные каталоги, что обеспечи-
вает более тщательную проверку.


    ПОЯСНЕНИЯ



Первым делом chkset инициализирует две переменные - FORM и SORT.
Переменная FORM содержит команду для выдачи результата работы команды
find, а переменная SORT - команду, определяющую, что нужно сортиро-
вать.
В строке 7 проверяется, является ли первый позиционный параметр
опцией. Если да, то оператор case (строки 8-14) смотрит, какая это
опция. Если это опция "-l", то подготавливается команда для распечат-
ки результата (это мы обсудим позже). Команда для утилиты sort форми-
руется так, чтобы сортировка шла по полю владельца. Опция убирается
из командной строки, потому что все последующие аргументы должны быть
каталогами и мы захотим получить к ним доступ с помощью "$#". Если
попалась опция, отличная от "-l", то это ошибка, выдается сообщение
об ошибке (строка 12), и командный файл завершается.
Если осталось более нуля аргументов, когда мы попадаем в строку
17, то они проверяются в цикле, чтобы убедиться, что все они являются
каталогами. Если это не каталоги, на стандартное устройство регистра-
ции ошибок выдается сообщение об ошибке и командный файл завершается.
Если имеются параметры (т.е. каталоги), то в строке 18 в пере-
менную SRC заносятся все каталоги. Если же параметров нет, то в пере-
менную SRC заносится значение "/", т.е. корневой каталог, чтобы обес-
печить подразумеваемую стартовую точку для поиска.
Вся работа этого командного файла выполняется фактически в опе-
раторе find. Команда find допускает множественное указание каталогов,
которые поступают в результате чтения их из командной строки и зане-
сения в переменную SRC.
После того как мы указали команде find, откуда начинать поиск,
мы указываем ей, что нужно искать. В данном случае нас интересуют все
файлы, которые имеют включенный бит установки пользовательского либо
группового идентификатора. Мы объясняем это команде find путем указа-
ния прав доступа, которые требуется искать. Строка "-perm -4000" оз-
начает поиск всех файлов, имеющих права доступа со включенным битом
установки пользовательского идентификатора и с любыми другими вклю-
ченными битами. Вы можете понимать эту запись как применение символов
-заменителей - 4???. Мы ищем как установку пользовательского иденти-
фикатора (-4000), так и установку группового идентификатора (-2000),
поэтому две строки прав доступа соединены опцией -o, означающей "or"
("или"). (Более полное описание прав доступа в символической и вось-
меричной форме приведено в chmod(1).)
Следующая задача - добавить строку, хранимую в переменной FORM,
в командную строку. Если опция -l не была использована, то в перемен-
ной FORM хранится строка "-print", а это значит, что find будет печа-
тать маршрутные имена найденных файлов. Если же -l использовалась, то
переменная FORM содержит строку "-exec ls -ld {} ;". Опция -exec -
это очень гибкая опция команды find, позволяющая применить любые ко-
манды, которые за ней следуют, к каждому найденному файлу. В данном
случае эти команды выполняют распечатку в длинном формате (-l), при-
чем для каждого каталога (-d) выводится только его имя (а не содержи-
мое). Именно здесь происходят наибольшие затраты ресурсов центрально-
го процессора, так как для опции -l требуется системный вызов stat.
Из-за того, что для каждого файла требуется команда ls, она каждый
раз загружается в память и выполняется. Производится также доступ к
индексному дескриптору файла на диске. Это приводит к большим наклад-
ным расходам.
Затем весь поток данных пропускается через утилиту sort. На са-
мом деле мы хотим сделать сортировку по восьмому полю (вы можете про-
верить это, выполнив команду "ls -l" и изучив ее результат). Утилита
sort ПРОПУСКАЕТ указанное число полей, начиная с поля 1, являющегося
по умолчанию стартовой точкой, поэтому использование записи +7 озна-
чает переход к восьмому полю, которым является имя файла.


    АЛЬТЕРНАТИВНЫЙ ПОДХОД