Как сделать листинг

Обновлено: 04.07.2024

Лабораторная работа №3. Работа с файлом листинга

Краткие теоретические сведения

Права доступа к файлам

Как многопользовательская операционная система, ОС Linux содержит механизм разграничения доступа к данным, позволяющий как защитить данные одного пользователя от нежелательного вмешательства других, так и разрешить другим доступ к этим данным для совместной работы. Любой ресурс компьютера под управлением ОС Linux представляется как файл.

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

chown [ключи] [:новая_группа]

Набор прав доступа задается тройками битов и состоит из прав на чтение, запись и исполнение файла. В символьном представлении он выглядит как строка rwx , где вместо любого символа может стоять дефис. Буква означает наличие права (установлен в единицу второй бит триады r — чтение, первый бит w - запись, нулевой бит х - исполнение), а дефис означает отсутствие права (нулевое значение соответствующего бита). Очевидно, что эти три бита могут быть записаны еще и как восьмеричное число. Так, права доступа r-х (чтение и исполнение без записи) понимаются как три двоичные цифры 101 или как восьмеричная цифра 5. Численное представление прав доступа называется абсолютным, или двоичной маской.

Полная строка прав доступа в символьном представлении устроена так:

В абсолютном представлении права владельца являются старшей цифрой восьмеричного числа, права группы - средней
и права остальных - младшей. Так, права rwxr-x--x выглядят как двоичное число 111 101 001, или восьмеричное 751.

Команда изменения прав доступа chmod понимает как абсолютное, так и символьное указание прав.

Свойства (атрибуты) файлов и каталогов можно вывести на терминал с помощью команды ls с ключом -l :

Назначим файлу /home/debugger/README права rw-r , то есть разрешим себе чтение и запись, группе только чтение, остальным пользователям — ничего:

В символьном представлении можно явно указывать, кому какое право мы хотим добавить, отнять или присвоить. Добавим право на исполнение файла README группе и всем остальным:

Формат символьного режима:

Возможные значения аргументов команды представлены в таблице:

Название бита прилипчивости унаследовано от тех времен, когда объем оперативной памяти был маленьким, а процесс подкачки медленным. Этот бит позволял оставлять небольшие часто используемые программы в памяти для ускорения их запуска. Сейчас его значение переосмыслено: этот бит, установленный для каталога, приводит к тому, что удалять файлы из этого каталога могут только владелец файла и владелец каталога. Обычно это используется в каталогах, открытых для записи всем (например, /tmp ).

Права смены пользователя и группы ( SUID -бит и SGID -бит) означают следующее. Обычно исполняемый файл (программа или командный сценарий) получает те же права на доступ к файлам, что и пользователь, который запустил его на выполнение. Но у этого файла есть еще и владелец, полномочия которого могут быть совсем другими. Наличие одного из этих битов позволяет выполняющейся программе пользоваться полномочиями владельца программного файла или члена его группы.

Назначение файла листинга

Листинг — это один из выходных файлов, создаваемых транслятором. Он имеет текстовый вид и нужен при отладке программы, т. к. кроме строк самой программы содержит дополнительную информацию.

Обычно nasm создает в результате ассемблирования только объектный файл. Получить файл листинга можно, указав ключ -l и задав имя файла листинга в командной строке. Например:

nasm -l main.lst main.asm

Рассмотрим фрагмент файла листинга.

Строки в первой части листинга имеют следующую структуру (рис. [pic:l3]):

Все ошибки и предупреждения, обнаруженные при ассемблировании, транслятор выводит на экран и файл листинга не создается.

Описание инструкции вычитания

Схема команды целочисленного вычитания sub выглядит следующим образом:

sub операнд_1, операнд_2

работы команды включает два действия:

  • выполнить вычитание: операнд_1 = операнд_1 - операнд_2 ;
  • установить флаги.

Флаги, устанавливаемые командой, подробнее рассматриваются ниже.

Команды условного перехода

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

Мнемоника перехода (от одной до трёх букв) связана со значением анализируемых флагов (или регистра CX), либо со способом формирования этих флагов. Чаще всего программисты формируют флаги, проверяя отношение между двумя операндами op1 op2 , для чего выполняется команда вычитания или команда сравнения. Команда сравнения имеет мнемонический код операции cmp и такой же формат, как и команда вычитания:

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

Программист по своему желанию может трактовать результат вычитания (сравнения) как производимый над знаковыми или же беззнаковыми числами. От этой трактовки может зависеть, будет ли один операнд считаться большим, чем другой, или же нет. Так, например, рассмотрим два коротких целых числа 0FFh и 01h — с учетом того, что отрицательные числа представляются процессором в дополнительном коде. Если числа знаковые, 0FFh = -1 01h = 1.

Инструкции условной передачи управления бывают следующими:

Мнемокод условие перехода
Флаги Смысл
ja/jnbe CF or ZF=0 выше /не ниже и не равно
jae/jnb CF=0 выше или равно/не ниже
jb/jnae CF=1 ниже/не выше и не равно
jbe/jna CF or ZF=1 ниже или равно/не выше
je/jz ZF=1 равно/нуль
jne/jnz ZF=0 не равно/не нуль
jg/jnle (SF xor OF) or ZF=0 больше/не меньше и не равно
jge/jnl SF xor OF=0 больше или равно/не меньше
jl/jnge (SF xor OF)=1 меньше/не больше и не равно
jle/jng ((SF xor OF) or ZF)=1 меньше или равно/не больше
jp/jpe PF=1 есть паритет/паритет четный
jnp/jpo PF=0 нет паритета/паритет нечетный
jc CF=1 перенос
jnc CF=0 нет переноса
jo OF=1 переполнение
jno OF=0 нет переполнения
jns SF=0 знак +
js SF=1 знак -

Мнемоники, идентичные по своему действию, написаны в таблице через дробь (например, ja и jnbe ). Программист выбирает, какую из них применить, чтобы получить более простой для понимания текст программы.

Для веб-сервера Apache существует модуль mod_autoindex, который служит для построения и отображения списка файлов (листинга) директории, если в ней нет индексного файла (определенного директивой DirectoryIndex). У нас на серверах хостингапо умолчанию этот модуль подключен.

Параметры для mod_autoindex можно задать в файле .htaccess:

IndexOptions FancyIndexing FoldersFirst
IndexIgnore .htaccess .htaccess~
IndexOrderDefault Descending Name

AddDescription "WordPress screenshot" post.jpg

HeaderName header.html
ReadmeName footer.html

  • Options +Indexes - эта директива разрешает показ листинга директории;
  • IndexOptions - задает опции для отображения листинга; в нашем примере:FancyIndexing - разрешает отображение подробного листинга (с иконками для разных типов файлов, комментариями и т.п.), FoldersFirst - указывает первыми в списке показывать директории;
  • IndexIgnore - указывает, какие файлы не должны отображаться в листинге;
  • IndexOrderDefault - задает порядок сортировки записей в списке; в нашем случае - сортировка по имени по убыванию;
  • AddDescription - добавить описание к какому-либо файлу или группе файлов;
  • HeaderName - имя файла, в котором задается текст или HTML-код, который добавляется в верх ("шапку") листинга;
  • ReadmeName - имя файла, в котором задается текст или HTML-код, который добавляется после списка.

Данный проект содержит 5 форм, которые являются основой проектируемого приложения Builder C++.

Первая форма появляющаяся сразу же при включении пользователем базы данных представляет собой загрузочный лист, на котором располагаются компоненты:

void __fastcall TForm1: RzBitBtn1Click (TObject *Sender)

Form1->Visible=False; Форма 1 становится невидимой

Form2->ShowModal(); Форма 2 открыть

void __fastcall TForm1: RzBitBtn2Click (TObject *Sender)

Form1->Close(); Закрыть форму1

void __fastcall TForm1: FormClose (TObject *Sender, TCloseAction &Action)

Application->Terminate(); По завершению убрать программу из процессов

Вторая форма является главной в проекте, на ней находятся все основные элементы программы. Главным образом на ней находится элемент TabbedNotebook1 на котором и отображается главная часть программы. На форме находятся следующие компоненты:

RzDateTimePicker1 служит для получения информации об дате и месяце.

TForm2 *Form2; главная форма

__fastcall TForm2:TForm2 (TComponent* Owner)

void __fastcall TForm2:N4Click (TObject *Sender)

Form2->Close (); закрытие формы 2

void __fastcall TForm2:N3Click (TObject *Sender)

SendMessage (HWND_BROADCAST, WM_SYSCOMMAND, SC_TASKLIST, -1); Запуск диспетчера устройств

void __fastcall TForm2: RzToolbarButton1Click (TObject *Sender)

void __fastcall TForm2: RzToolbarButton2Click (TObject *Sender)

if (OpenDialog1->Execute()) открыть файл

SEI.nShow = SW_SHOW; отобразить информацию

void __fastcall TForm2: RzToolbarButton3Click (TObject *Sender)

0, 0, SW_SHOWNORMAL); настройка Интернета, либо запуск браузера

void __fastcall TForm2:N6Click (TObject *Sender)

Form3->ShowModal(); открыть форму 3

void __fastcall TForm2:N7Click (TObject *Sender)

Form4->ShowModal(); открыть форму 4

void __fastcall TForm2: Ip1Click (TObject *Sender)

Form5->ShowModal(); открыть форму 5

Третья форма является информацией об авторе. На ней имеется вся нужная информация о том когда и кем была создана данная программа. Присутствуют такие компоненты, как RzMarqueeStatus1, RzStatusPane1, Label1 все они используются для отображения текста, но каждая отображает его по разному.

TForm3 *Form3; форма 3 об авторе

__fastcall TForm3:TForm3 (TComponent* Owner)

void __fastcall TForm3: RzBitBtn1Click (TObject *Sender)

Form3->Close(); закрыть форму 3

Четвертая форма появляется по требованию пользователя и имеет в себе версию данного программного продукта, а также адрес поддержки его. Содержит компоненты Image1 - для отображения рисунка, Label1 - для отображении текста.

TForm4 *Form4; форма 4 О программе

__fastcall TForm4:TForm4 (TComponent* Owner)

void __fastcall TForm4: RzBitBtn1Click (TObject *Sender)

Form4->Close(); закрыть форму 4

Пятая форма предназначена для получения Ip - адреса компьютера. Применить её можно при работе с Интернетом на более высоком уровне, чем пользователь.

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

Индексный файл или запрет вывода листинга

Если ввести в адресную строку браузера путь к папке, открывается индексный файл (например, index.html, index.php), который находится внутри этой папки, но если индексного файла в папке нет, а выдача листинга каталога не запрещена, появляется содержимое этой папки (каталога).

Исходный листинг содержимого папки test

Листинг содержимого папки test

Обычно это нежелательно, поэтому в каждую папку нужно помещать индексный файл, пусть даже пустой) или задать в файле .htaccess, который находится внутри папки или внутри родительской папки (например, в корневой папке сайта) , запрет выдачи листинга каталогов:

Запрет распространяется на все дочерние (вложенные) папки. Поэтому, если вы хотите показать листинг файлов в какой-то папке, в ней не должно быть индексных файлов и в нее нужно поместить файл .htaccess с разрешением вывода листинга содержимого этой папки (и всех вложенных):

При этом можно запретить показывать некоторые файлы, в том числе с использованием регулярных выражений, например:

Здесь заданы файлы с расширением .php и начинающиеся с myfile (спецсимвол * заменяет любое количество символов).

Изменение страницы листинга

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

Содержимое файла HEADER.html будет выводиться перед листингом, а файла README.html - после листинга.
HEADER.html (имена этих файлов могут быть любыми):

Вид листинга изменится так:

Измененный листинг

Листинг каталогов и .htaccess : 2 комментария

Читайте также: