LinuxForum.Fans
Тема

Помогите с лабами.

Автор: si0863 2 сообщений 711 просмотров 🔒 закрыта
#348397

Здравствуйте! Прошу помочь с лабами. Надо описать команды, что после их выполнения происходит. Например, "Выполните ls -a", нужно написать, что произойдет после выполнения этой команды и так далее. Заранее спасибо.
1:

Показать

Команда cp <src> <dst> копирует файл <src> в новый файл <dst>. Если <dst> -- папка, то копия создается в этой папке, а имя файла сохраняется. Выполните cp /etc/fstab .; ls. Символ ; для shell является разделителем команд. Выполните cp fstab fstab.copy; ls

Команда ln <src> <dst> копирует ссылку на файл <src> и называет копию <dst>. Если <dst> -- папка, то ссылка создается в этой папке, а имя файла сохраняется. При копировании (cp) создается новый файл, при создании ссылки (ln) у одного файла появляется не одно имя. Выполните ln fstab fstab.lnk; ls. Выполните mcedit fstab и отредактируйте файл (например, удалите первый символ). Откройте в редакторе fstab.lnk и убедитесь, что он изменился. Откройте в редакторе fstab.copy и убедитесь, что он не изменился.

Команда ln -s <src> <dst> аналогична предыдущей команде, но ссылка создается не жесткая, а символическая. Это необходимо при создании ссылки на файл в другом разделе файловой системы, а также при создании ссылки на папку. Изменения в команде заключаются в том, что добавлен аргумент -s. Аргументы, немного изменяющие действия команды, называются флагами. Попробуйте выполнить ln /etc/fstab ./fstab.long. Выполните ln -s /etc/fstab ./fstab.sym; ls

Команда rm <arg> удаляет объект файловой системы <arg> (кроме папок). Если это последняя жесткая ссылка на файл, то удаляется и сам файл. Выполните ls. Выполните rm fstab\.* , затем снова выполните ls. Для shell * означает 'сколько угодно любых символов'. ? означает 'любой один символ', а \ -- 'отмена специального значения следующего символа'. Такие шаблоны нужно использовать при указании имени файла, ибо shell ищет именно подходящие под шаблон объекты файловой системы.

Команда mv <src> <dst> переименовывает файл или папку <src> в <dst>. Если <dst> -- папка, то <src> не переименовывается, а перемещается в эту папку. Это выглядит не совсем понятным, но зато полностью повторяет логику команды cp. Выполните mv fstab public_html; ls public_html. Выполните mv public_html/fstab fstab.same; ls

Команды mkdir и rmdir создают и удаляют пустую папку. Выполните mkdir empty; ls. Выполните rmdir empty; ls

Флаги

Мы уже встретили флаг -s для команды ln. Поведение почти всех команд в Unix можно модифицировать при помощи флагов. В справочном руководстве (которое можно получить выполнив man имя_команды) подробно описано, какими флагами и как можно поменять работу команды.

Мы же пока рассмотрим еще два флага, общих для операций с файлами. Команды cp и rm работают с файлами. Чтобы скопировать или удалить папку, надо указать этим командам флаг -r (r - recursive). Выполните cp -r public_html html; ls

Вообще, команды в Unix довольно молчаливы. Если команда успешно выполнилась, она не выдает никаких сообщений. Что-то сообщается только в случае возникновения ошибки, либо при возникновении сомнений в том, что пользователь понимает, что делает. Если мы хотим избежать и этой болтовни (что в сценариях жизненно необходимо, ибо некому будет ответить на вопросы), мы можем указать всем операциям для работы с файлами флаг -f (f - force).

С точки зрения синтаксиса, флаги можно указывать по очереди, а можно объединять. Можно написать cp -r -f, можно написать cp -f -r, можно написать cp -rf -- это одно и то же. Выполните rm -rf html; ls. Никогда не делайте rm -rf /. И не запускайте непроверенные программы от имени пользователя root. Иначе можно лишиться всего и даже не заметить.

2:

Показать

Флаг -a (all) в команде ls -a [<arg>]* выводит полный (включая "скрытые" файлы) список содержимого папок <arg>. Многие файлы, например, используемые для личных настроек разнообразных программ, незачем видеть всякий раз, когда мы хотим посмотреть список содержимого папки. Названия таких файлов в Unix начинаются с точки. Таковы также ссылки в каждой папке на папку-родителя и на себя. Выполните ls -a

Обратите внимание на файлы .bash_profile (может также быть .bash_login или .profile), .bashrc, .bash_logout. Предназначение этих файлов таково: .bash_profile (.profile в обычном Unix) выполняется при входе в систему. Файлы .bash_login (.login) и .bashrc (.cshrc) используются другим командным интервретатором (csh) при входе в систему и при запуске каждого экземпляра shell соответственно. Используется ли в других версиях Unix файл .logout мне неизвестно, но .bash_logout выполняется при выходе из системы.

Вообще, в bash (Bourn Again Shell) множество не очень понятных "улучшений" sh. Так, не очень понятно, кому и зачем может понадобиться менять названия инициализационных файлов, однако в bash такая возможность предусмотрена. Много в bash и полезных "улучшений", например, он устанавливает множество полезных переменных, таких как $OLDPWD (путь к предыдущей посещенной папке) или $SECONDS (сколько времени работает скрипт). Впрочем, возможно и sh развивается в ту же сторону. Выполните несколько раз echo $SECONDS

Выполните mcedit .bash_profile Посмотрите, что это обычный файл-сценарий. Допишите в него строчку a=b. Выполните . .bash_profile Команда . (другое имя source) -- выполнить сценарий в текущем интерпретаторе, то есть, не создавать новый процесс для выполнения сценария. Теперь выполните echo $a

Команда alias -- создание нового имени для начала команды. Отредактируйте .bash_profile (выполните mcedit .bash_profile). Напишите (вместо a=b) alias la='ls -a' Выполните source .bash_profile, чтобы дописанная команда выполнилась (с тем же успехом можно было бы просто выполнить команду alias в текущем shell). Теперь выполните la

Подробная информация о файлах

Флаг -l (long) в команде ls выводит больше информации об объктах файловой системы. Кроме имени ls -l выводит информацию о типе объекта, его владельце и группе, правах на него, его размере и времени его изменения. Выполните ls -l

Первая буква характеризует тип объекта: - - жесткая ссылка на файл, l - символьная ссылка, d - папка, c - символьное устройство, b - блочное устройство, s - сокет и p - именованый канал. Выполните ls -l /dev, чтобы посмотреть на файлы устройств. Обратите внимание на файл /dev/log.

Следующие 9 символов описывают права в таком порядке: (чтение, запись, исполнение) для владельца файла, его группы и остальных пользователей. Если права нет стоит прочерк, если есть - одна из букв r (read), w (write) или x (execute). Вместо x может стоять другая буква. s для владельца или группы означает смену для процесса, запущенного из файла, эффективного идентификатора пользователя или группы соответственно (процесс выполняется с правами владельца или группы файла, а не запустившего его пользователя или его группы). Выполните ls -l /usr/bin/passwd

Выполните снова ls -l Следующее поле -- количество ссылок (жестких) на файл. На папку всегда есть две ссылки -- в папке, где она расположена, и в самой себе (.). Кроме того, в каждой вложенной в нее папке есть на нее ссылка (..) Так что, для папки число в этом поле - кол-во подпапок + 2.

Затем идут владелец и группа файла. Затем, для устройств идут два их номера, для папок, символьных ссылок и файлов -- их размер. Папки содержат записи с именами и индексами объектов в таблице объектов файловой системы,-- именно размер, используемой для хранения этой информации области диска, показан. Символьные ссылки содержат в символьном виде путь к объекту, на который ссылаются. Сколько букв в пути, таков и размер символьной ссылки. Но, в общем, важной информацией размер является только для файлов.

И, наконец, дата изменения файла и его название. Для символьных ссылок здесь показывается еще и их содержимое, то есть, куда они ссылаются. Выполните ln -s /var var_lnk; ls -l var_lnk Убедитесь, что var_lnk ссылается на /var и имеет размер 4 байта. Теперь удалите мусор.

3:

Показать

chgrp - задание (смена) группы, которой принадлежит файл. Синтаксис такой: chgrp <newgroup> <arg>*
При этом все объекты <arg> становятся принадлежащими группе <newgroup>. В некоторых системах выполнять эту команду (по-умолчанию) разрешено только псевдопользователю root. В других (или при других настройках системы) эту операцию может произвести и владелец объекта. Выполните chgrp $USER . ($USER содержит логин текущего пользователя, группа пользователя по умолчанию, как правило, называется так же). Попробуйте выполнить chgrp root public_html

chown - задание (смена) владельца файла. Синтаксис такой: chown <newowner>[.<newgroup>] <arg>*
При этом все объекты <arg> становятся принадлежащими пользователю <newowner>. При этом можно указать (сменить) сразу и группу. В некоторых системах выполнять эту команду (по-умолчанию) разрешено только псевдопользователю root. В других (или при других настройках системы) эту операцию может произвести и владелец объекта. Выполните chown $USER public_html
Попробуйте выполнить chown root public_html


chmod - задание (смена) прав доступа к файлу. Синтаксис такой: chmod <newrights> <arg>*
При этом для всех объектов <arg> права изменяются в соответствии с <newrights>. Задавать права можно символьно, как список (через запятую) изменений, либо численно, устанавливая сразу все права.

В первом случае, каждое изменение представляется в виде <who>±<right>. При этом <who> определяет, кому дается или у кого отбирается право, совокупностью букв из u (user, владелец), g (group, группа), o (others, остальные) или a (all, все сразу). Плюс или минус определяет, выдается право или отнимается. А право (<right>) задается совокупностью из rwx. Выполните cp /etc/passwd $HOME; ls -l passwd, посмотрите права. Выполните chmod go+w,a+x passwd; ls -l passwd, посмотрите права. Выполните chmod a-rwx passwd; ls -l passwd, посмотрите права.

Во втором случае, права задаются числом в восьмеричной записи. Почему числом, и что из этого следует, подумайте сами, кому интересно. Можно просто считать, что это совокупность трех цифр, первая из которых задает права владельца, вторая -- группы, а третья -- остальных. Цифры получаются сложением 4 за право на чтение, 2 -- на запись и 1 -- на исполнение. Выполните chmod 425 passwd; ls -l passwd, посмотрите права. Выполните chmod 644 passwd; ls -l passwd, посмотрите права.

Все три рассмотренные команды работают с объектами файловой системы, имена которых переданы в командной строке. Если надо натравить какую-нибудь из них на папки рекурсивно (то есть, чтобы изменения произошли во всех объектах и подобъектах этих папок), используется флаг -R. Выполните chmod -R a-w public_html. Попробуйте выполнить cp /etc/fstab public_html; ls -l public_html.

С этим же флагом (и, приблизительно, с тем же его смыслом) работает и ls. Выполните ls -lR public_html. Обратите внимание, что для всех объектов в папке и подпапках было отобрано право записи. Выполните chmod -R u+w public_html; ls -lR public_html.

А каковы права у вновь создаваемого файла? Было бы неудобно, если бы, например, при создании файла, пришлось указывать еще и права на него. Чтобы этого избежать, в общем для всех пользователей сценарии инициализации shell (что-нибудь вроде /etc/profile) права по умолчанию задаются при помощи команды umask. В своем файле инициализации shell (.profile) это значение можно изменить. Синтаксис такой: umask NNN, где N -- восьмеричные цифры, которые получаются вычитанием из цифр 7 цифр, передаваемых в chmod. Смысл в том, что здесь оказалось правильнее права отбирать, так что из 7 (4+2+1, rwx) мы вычитаем права так же, как для chmod мы их складывали. Например umask 222 значит, что в создаваемые файлы запись будет запрещена всем, то есть у всех будет право читать и выполнять (7-2=5=4+1). Если новое значение отсутствует, umask просто выводит свое текущее значение.

Выполните umask, запомните значение. Выполните umask 345, затем cp /etc/fstab ~; ls -l fstab и посчитайте, какие должны были получиться права. (~ это символ обрабатываемый shell так: если за ним следует имя пользователя, shell подставляет путь к домашней папке этого пользователя, если же за ней следует разделитель или / -- путь к домашней папке текущего пользователя.) Права получились не такими, как мы ожидали. Не сходится потому, что при копировании маска накладывается на права на исходный файл. Выполните ls -l /etc/fstab и посчитайте, какие на самом деле должны были получиться права. Выполните > junkfile; mkdir junkdir, чтобы создать файл и папку. Посмотрите, какие теперь получились права. Для группы должно было проставиться право на выполнение, но на файл не проставилось. Это потому, что большинство файлов не надо выполнять. При создании файлов право на выполнение не проставляется, независимо от маски. Выполните umask <oldmask>, чтобы восстановить маску, какой она была. Если забыли, используйте маску 022 (запрет группе и остальным на запись). Почистите мусор.

#348399

Читайте страницы руководств соответствующих команд (man команда), они присутствуют во многих дистрибутивах, в том числе и на русском языке, а также в Сети, в том числе и на русском языке. А данную тему я закрываю.

Войдите или зарегистрируйтесь, чтобы ответить.