Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Запрограммировать меню из 3-х пунктов: создание папки, файла, ссылки

Нужна помощь с одним заданием. Буду премного благодарен. Итак, суть:

Написать командный файл, который в качестве аргументов принимает имя каталога и реализует меню из 3 пунктов:
1) Создать папку с указанным именем, в которой каждый пользователь может создавать и удалять файлы, но не может удалять файлы других пользователей;
2) Создать в этой директории файлы с такими правами доступа: создатель файла может читать, модифицировать и запускать файл, участники той же группы могут только читать файл, а остальные не могут делать ничего;
3) Создать символьную ссылку на один из файлов.

Благодарю)
Ответ: В помощи больше нет нужды, прикрывайте тему.
Вопрос: Права доступа на директории при чтении, изменении и удалении файлов

Всем привет , помогите разобраться с правами доступа.
У нас есть 5 директорий и 5 файлов , нужно удалить 3 и 5 директоии вместе с файлами , файл из второй директории записать в конец файла из первой , а первую первую директорию объединить с четвертой .



насколько я понимаю для всех подходит rwx, но нужно написать минимальные а знаний на это не хватает(
Ответ: Вам следует помнить, что директории — это суть файлы, со списком содержимого. При перемещении файла из одной директории в другую физического перемещения данных файла не происходит — только изменяются два списка: дир_источник и дир_получатель.
Т.е для того чтобы «файл из второй директории записать в конец файла из первой» необходимо для 1дир иметь права на запись, обеим права на вход, 2файл право на чтение, 1файл право на запись.
Вопрос: Монтирование удаленной директории

Всем привет!

С чего нужно начать монтирование удаленной директории между двумя компами под Линукс? Насколько я понимаю - это аналог расшаривания папки для двух компов, подключенных по локальной сети?
Нашел статью:
но в ней много незнакомых терминов и понятий, таких как: SSHFS, NFS.

Я никогда не писал скрипты по Убунту и вот что за команда
Bash
1
$ sshfs [email]username@server.ru[/email]:/home/user mount-point/
что за @server.ru ? Мы ведь говорим всего о двух компах..?
Ответ: Давайте на пальцах попробую объяснить, как это работает в быту.

SSH - зашифрованный протокол связи между компьютерами. С его помощью вы можете, например, залогиниться на удалённый компьютер или примонтировать удалённую директорию.

sshfs монтирует удалённую директорию.

Ситуация № 1. У вас дома стоит роутер и в локальной сети находятся десктоп komp и ноутбук nout. Здесь komp и nout ― их имена, которые возвращаются командой hostname. У вас и на компе, и на ноуте есть пользователь zigfrid. И вот вы хотите с ноута получить доступ к директории Documents, которая находится в домашней директории zigfrid-а на компе.

Сначала вы решаете, куда эту директорию примонтировать. Например, можете монтировать в директорию ~/foobar (на ноуте). Для этого вы делаете следующую команду:
Bash
1
sshfs zigfrid@komp:Documents ~/foobar
Первый аргумент ― что монтировать, второй ― куда. Удалённая директория имеет три компоненты: пользователь@компьютер:директория. Если директория относительная, то считается относительно домашней.

Если на компе работает демон sshd, то попросят ввести пароль пользователя zigfrid, после чего в foobar чудесным образом окажутся документы.

Отмонтировать можно командой
Bash
1
fusermount -u ~/foobar
Ситуация № 2. Ваш универ выделил вам учётку на сервере: . Вы хотите примонтировать всю тамошнюю домашнюю директорию в ~/univ. Делаете аналогичено:
Bash
1
sshfs [email]zigfrid@univer.ru[/email]: ~/univ
После двоеточия ничего нет: значит, примонтировать всю домашнюю директорию.

В качестве имени компа может выступать и IP-адрес циферками.

Можно сделать так, чтобы ssh не требовало ввода пароля при соединении, а использовало бы ключ.

Короче, это потрясающе удобно. Есть ещё команда rsync, которая позволяет синхронизировать директории (одна из которых может быть удалённой), копируя недостающие файлы и заменяя старые версии новыми. Тоже потрясающая вещь, попробуйте как-нибудь.
Вопрос: Найти файлы, начинающиеся первой строкой и заканчивающися последней, и переместить их в текущую директорию

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

Bash
1
2
3
4
5
6
cd $1
result=(grep -rl "$2*$3" $1)
echo "$result"
for file in $result 
do mv $file rezult_dir
done
Ответ: panzer278, Если считаете так как предложил Marinero, слишком просто, тогда можете попробавать так.
Bash
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env bash
cd $1
arg=$(find -type f)
for i in $arg; do
        if [[ $(cat $i | head -1 | grep "^$2") ]]; then
                if [[ $(cat $i | tail -1 | grep "^$3") ]]; then
                        echo "Переместим файл $i в директорию $PWD" 
                fi
        fi
done
Когда убедитесь, что скрипт работает правильно замените строчку
Bash
1
echo "Переместим файл $i в директорию $PWD"
на
Bash
1
mv $i ./
Буддте осторожны. Обязательно нужно ввести в начале скрипта проверку на наличае параметров!
Иначе после подстановки быть беде

Добавлено через 1 час 16 минут
Я тут подумала, все таки правильней будет grep заменить на comm
Bash
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env bash
[ $# != 3 ] && exit 1
cd $1
arg=$(find -type f)
for i in $arg; do
        if [[ $(cat $i | head -1 | comm -12 - <(echo $2)) ]]; then
                if [[ $(cat $i | tail -1 | comm -12 - <(echo $3)) ]]; then
                        echo "Переместим файл $i в директорию $PWD" 
                fi
        fi
done
И безопасней

Добавлено через 15 минут
Ну или просто в grep добавить опцию -x и убрать из паттерна ^
Вопрос: Найти директорию куда установилась программа

смотрю через наутилус там тысячи файлов в 1-ой только usr/bin
все просматривать можно бесконечно.
Есть простой путь узнать? Мне нужно заменить 1 файл в нём заменить.

Добавлено через 2 минуты
читаю туториал:

/usr/bin - исполняемые файлы программ
/usr/sbin - исполняемые файлы программ, которые запускаются с правами администратора
/usr/games - исполняемые файлы некоторых игр

/usr/lib - библиотеки программы
/usr/share - остальные файлы программы
--------------------------
? неужели надо миллиард файлов вручную просматривать, чтобы найти emacs?

Добавлено через 10 минут
сомневаюсь что поможет find.

Добавлено через 1 минуту
если я даже не знаю точно в какой директории искать.

Добавлено через 2 минуты
и не надо мне рассказывать про cd home и тому подобное cd /bin
Ответ:
Сообщение от __py__
/usr/bin - исполняемые файлы программ
/usr/sbin - исполняемые файлы программ, которые запускаются с правами администратора
/usr/games - исполняемые файлы некоторых игр
Кроме этого, есть ещё директории, где лежат программы в линуксах:
/usr/bin
/usr/sbin
В обоих этих директориях лежат пользовательские приложения, которыми повседневно пользуются все юзеры этой машины. Те, которые относятся к GUI различных DE, те, которые запускаются из главного меню в GUI, те, которые вы видите ежедневно.
В /bin и /sbin - приложения для администрирования. Они доступны с момента запуска в консоли уже на первом init . Это такие приложения, которыми администратор пользуется для конфигурирования системы, создания/редактирования/удаления пользователей, разделов, файлов (в том числе системных). Без которых "как без рук" в самой минимальной конфигурации. Те, которые в /usr/bin /usr/sbin обычно в минимальной конфигурации не нужны, их нужность появляется позже - на третьем и пятом уровне init .
Вопрос: Сравнение размеров файлов

Всем привет!
Подскажите, как сравнить файл(размер и название которого уже записаны в переменную) с другими файлами в указанной директории. То есть сравнить их размеры и вывести в отдельный текстовый документ.

Bash
1
2
3
4
5
cd /e/Test/1
file1=$(dir -S -r | awk '{print $1}')
filesize1=$(wc -c $file1 | awk '{print $1}')
mv $file1 /e/Test/2
cd /e/Test/2
Тут две директории и в первой я нахожу файл с наименьшим размером, записываю его данные в переменные и перемещаю в другую директорию, в которой я должен сравнить его размер с другими размерами файлов
Заранее спасибо!
Ответ: N9wKa, Вы записали в переменную filesize размер тестируемого файла
а теперь в цикле мы вычисляем размеры каждого файла size из второй директории и сравниваем их
Тоесть size это временная переменная для хранения текущего размера каждого файла
Вопрос: Найти директории path/dir, рядом с которыми есть файлы path/dir.png

Добрый день.

Появилась задача следующего вида. На диске есть директории (назовём полные пути к ним path), в которых есть поддиректория path/dir и файл path/dir.png. Нужно удалить все такие файлы, попутно составив их список.
Заведомо известно, в path/dir нет других директорий с таким свойством.

Я могу написать скрипт на JS и т.п., обходящий рекурсивно директории в поисках файла, но вдруг на shell/bash есть более компактное решение.
Что скажете: есть ли однострочник для этой задачи?
Ответ: Этот код не работает. Вот мои эксперименты и результат.
Подготовка:
Bash
1
2
3
4
5
6
7
8
mkdir dir
cd dir
touch 1.png
touch 2.png
mkdir 2
mkdir 'sub dir'
touch 'sub dir.png'
cd ..
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
$ find dir -type d -exec echo rm -vf {}.png +
rm -vf dir dir/2 dir/sub dir
 
$ find dir -type d -exec rm -vf {}.png +
rm: невозможно удалить «dir»: Это каталог
rm: невозможно удалить «dir/2»: Это каталог
rm: невозможно удалить «dir/sub dir»: Это каталог
 
$ a=$(find dir -type d -exec echo rm -vf \"{}.png\" \;)
$ echo "$a"
rm -vf "dir.png"
rm -vf "dir/2.png"
rm -vf "dir/sub dir.png"
Затем можно сделать
Bash
1
2
3
4
$ echo "$a" | sed 's/$/;/' >e
$ sh -f e
удалён «dir/2.png»
удалён «dir/sub dir.png»
Но без вспомогательного файла почему-то не работает, то есть нельзя просто написать $a или $(echo "$a" | sed 's/$/;/').

Как бы то ни было, мои цели были достигнуты.
Вопрос: Записать в файл содержимое директории, найти строку(и) содержащие cron

В файл list.txt записать список файлов директории /var/log. На экран вывести номер знако-мест, в которых стоит строка con


Начал так но на самом деле затрудняюсь, что делать дальше
Bash
1
grep -E -r- h /var/log/* > list.txt 
Ответ:
Сообщение от Jokez
В файл list.txt записать список файлов директории /var/log. На экран вывести номер знако-мест, в которых стоит строка con
Bash
1
ls /var/log > list.txt && grep -n "con" list.txt
Вопрос: Подсчитать размер и количество файлов

Нужно написать скрипт подсчитывающий суммарный размер файлов в заданном каталоге и всех его подкаталогах (имя каталога задаётся пользователем в качестве аргумента командной строки). Скрипт выводит результаты подсчёта в файл (второй аргумент командной строки) в виде каталог (полный путь), суммарный размер файлов число просмотренных файлов. Нашел что-то в интернете, вроде понял как работает (добавил еще , чтобы ошибки записывались в отдельный файл). Но вот проблема, при работе скрипта он выдает ошибки : Путь - нет такого файла или каталога. Как я понял, это происходит из за того, что если есть в имени файла или директории пробелы, то он их разделяет и смотрит по отдельности. Например Рабочий - нет такого файла, стол - нет такого файла . Вроде это можно как-то через grep реализовать, но я что-то вообще плохо понимаю.Помогите написать это через grep или пофиксить эти ошибки.
Bash
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
IFS=$'\n'
for i in $( find "$1" -type d 2>>/tmp/1.err ); do
count=0
dsize=0
for j in $( find "$i" -type f 2>>/tmp/1.err ); do
let count=count+1
let dsize=dsize+$( stat -c%s "$j" )
done
echo "$i $dsize $count" > $2
done
Ответ: Добавил проверку для нечитаемых директорий
Вопрос: Настройка конфигурационных файлов 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
}