Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все сделано, как можно удалить сообщение ?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 17:28 20-09-2013 | Исправлено: digital422, 20:33 22-09-2013
RaP1D



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день!
Помогите написать скрипт на bash, проходящий по всем файлам в каталоге (и подкаталогах) с заданным расширением.
 
Есть следующее:
/target_directory
pngtopvr.sh
converter
 
При запуске pngtopvr.sh скрипт должен проходить по файлам директории target_directory и скармливать их в converter.
 
Ввиду отсутствия опыта написания скриптов, хватило лишь на это:

Код:
 
#!/bin/sh
find 'target_directory' -iname '*.png'
 

 
Скрипт выводит файлы, но вот каким образом их передать в converter не пойму...

Всего записей: 186 | Зарегистр. 29-12-2007 | Отправлено: 12:47 25-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Надо не удалять сообщение, а привести здесь итоговый вариант.
 
RaP1D
> но вот каким образом их передать в converter не пойму
Мне не известна утилита с названием converter (репозиторий Дебиана со мной солидарен), я понятия не имею как она принимает файлы, соответственно и как их передать не подскажу.
 
> Помогите написать скрипт на bash
> #!/bin/sh
N. B. /bin/sh — в общем случае не Баш.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 13:41 25-09-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG, RaP1D
А я вот рискну предположить, что скармливать надо просто путь к найденному файлу:
find "$target_directory" -iname '*.jpg' -exec converter {} \;
 
RaP1D, изучаем man find

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:29 25-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG - получилось жутко, писал методом тыка, это лучше не показывать.
Вот очередная, надеюсь не сильно сложная задача:
Пингуем хост, если он отвечает монтируем ftp сервер, делаем синхронизацию и отмонтируем папку. Скрипт работает, но есть много адресов $HOST1 и серверов $G1. Можно ли сократить скрипт так, чтобы для каждого адреса не создавать новых строчек  ?
 

Код:
 
$FPING -u $HOST1 >& /dev/null
    if [ $? -ne 0 ]; then
    exit 1
    fi
mountpoint -q $MOUNT/$G1
    if [ $? -ne 0 ]; then
    curlftpfs $HOST1 $MOUNT/$G1 -o user=login:password
    $RSYNC $OPTION $IN/$G1 $OUT/$G1
    fi
 
umount $MOUNT/$G1
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 20:02 25-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> получилось жутко, писал методом тыка, это лучше не показывать
Это лучше показать.
 
Добавлено:
> но есть много адресов $HOST1 и серверов $G1
Где есть? В каком-то файле?
 
> сократить скрипт так, чтобы для каждого адреса не создавать новых строчек?
В любом случае, очевидно, использовать цикл for.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:35 25-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
>> но есть много адресов $HOST1 и серверов $G1  
> Где есть? В каком-то файле?  
Описываются в начале скрипта
 
>> сократить скрипт так, чтобы для каждого адреса не создавать новых строчек?  
> В любом случае, очевидно, использовать цикл for.
Надо чтобы было $HOST1 $G1 , $HOST2 $G2, $HOST3 $G3 и т.д. А через for получаются все комбинации.

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 21:56 25-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
> $HOST1 $G1 , $HOST2 $G2, $HOST3 $G3 и т.д.
$LOGIN и $PASSWORD еще, наверное.
 
> через for получаются все комбинации
Массив, не?
 
Добавлено:
Если не хотите массив, то возможен еще специфический шелловский подход с heredoc’ом:
 
while read HOST G; do
    echo "$G" :: "$HOST"
done <<_EOF
    foo.example.org foo
    bar.example.net bar
_EOF

 
P. S. Вы скрипт-то, который с юлианским днем, приведите.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 22:08 25-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Преобразование даты в формат chronological Julian day number (JD). В исходном csv файле 2 строка содержит дату, в 5 строке есть время, от которого надо отнять 10 минут.

Код:
 
#!/usr/bin/gawk -f
# ======================= date ===================
NR == 2 {
match ($1, /([.0-9]+)/, s);
split(s[1], a,".");
"date '+%s' -d "a[3]"-"a[2]"-"a[1]"" | getline newdate
dt=newdate/86400+2440588
}
# ================================================
 
# ======================= time ===================
NR == 5 {
split($3, t,":");
"date '+%H:%M' -d '-10 min "t[1]":"t[2]"'" | getline newtime
split(newtime, tt,":");
hour=tt[1]/24
minute=tt[2]/1440
summ=(hour+minute)
split(summ, tm,".");
printf "%.0f",dt
printf "."
printf tm[2]
}
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 06:22 26-09-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нашел такой вариант:

Код:
 
for h in "$IP1 $HOST1" "$IP2 $HOST2"; do
set $h
$COMMAND1 $1
$COMMAND2 $2
done
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 19:06 26-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Не, ну если мы занимаемся ненормальным программированием, то я еще могу накидать. Вот, например:
 
set host            dir \
    foo.example.org foo \
    bar.example.net bar \
    baz.example.com baz
 
while shift 2 && (($#>0)); do
    echo "$2 :: $1"
done


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:25 26-09-2013 | Исправлено: ASE_DAG, 21:30 26-09-2013
kpp77

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422

Цитата:
Скрипт работает, но есть много адресов $HOST1 и серверов $G1. Можно ли сократить скрипт так, чтобы для каждого адреса не создавать новых строчек  ?

 

Код:
#!/bin/sh
 
hosts="server1 login1 pass1 dir1
...
serverN loginN passN dirN"
 
echo "${hosts}" | while read server login pass dir
do  
  # сделать что нужно
  # в переменных server login pass dir поочередно будут  
  # значения server1 login1 pass1 dir1 ... serverN loginN passN dirN
done

Всего записей: 72 | Зарегистр. 29-08-2012 | Отправлено: 12:47 27-09-2013 | Исправлено: kpp77, 12:53 27-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd (12:13 30-09-2013)
Цитата:
Народ подскажите вылезает вот такая ошибка:
find: pred.c:1932: launch: Assertion `starting_desc >= 0' failed.
Aborted

Выполняю команду:
# su www-data -c 'find /var/www -type d -exec chmod g+s "{}" \;'
 
# ls -la /var/www  
total 108
drwxr-xr-x 27 root     root     4096 Сен 25 10:08 .
drwxr-xr-x 13 root     root     4096 Сен 17 18:10 ..
drwxrwxr-x  5 www-data www-data 4096 Сен 17 12:02 3311.old
drwxrwxr-x  5 www-data www-data 4096 Сен 17 12:02 algot.ru
. . .

Как права розданы сейчас думаю понятно: на сам /var/www доступ только у root'а, а дальше всему владелец www-data.
 
Причём команда find вылетает даже если я буду её выполнять на какой-нить вложенный каталог, на который у www-data уже полные права и на родителя тоже.
 
p.s. был какой-то баг в 2006-2007 году при отсутсвии прав на чтение в родительском каталоге вылетала такая же ошибка, но у меня всё с этим в порядке и если не выполнять -exec, а выполнить, например -print, то всё отработает без ошибок.
От root'а команда бегает без ошибок.

 
Не «какой-то», а вполне конкретный баг № 153884. Там написано, в какой версии он пофикшен — 4.3.12, а также написано что фикс не в один релиз пока (на 2007 год) не попал. Не знаю как это понимать, но:
 
~$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
<skipped>
 
~$ ll -a /tmp/a/www
total 12K
drwxr-xr-x 3 main main 4,0K Sep 30 18:59 .
drwxr-x--x 3 root root 4,0K Sep 30 18:59 ..
drwxrwsr-x 3 main main 4,0K Sep 30 18:41 example.org
 
~$ find /tmp/a/www -type d -exec echo {} \;
/tmp/a/www
/tmp/a/www/example.org
/tmp/a/www/example.org/dir
 
~$ cd /tmp/a
 
/tmp/a$ find /tmp/a/www -type d -exec echo {} \;
find: pred.c:1932: launch: Assertion `starting_desc >= 0' failed.
Aborted

 
Добавлено:
Ну а что делать, если желания докапываться до причины нет, я думаю, понятно:
$ find /tmp/a/www -type d | while read d; do chmod g+s "$d"; done

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:05 30-09-2013 | Исправлено: ASE_DAG, 19:25 30-09-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Вай!
# su www-data -c 'cd /var/www/ && find /var/www -type d -exec chmod g+s "{}" \;'
Вот так отработала!!!
Т.е. если у меня команда find будет исполняться в cron файле от пользователя www-data, у которого домашним каталогом назначен /var/www, то всё должно работать правильно? В принципе ближайшей ночью увижу... Лень менять время в кроне...
 
p.s. что-то я даже не понял что Вы тему сменили...

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 19:27 30-09-2013
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd, ну да, вероятно, будет. Но все-равно, отпишитесь, когда проверите, пожалуйста.
 
А что это, если не секрет, за подход — ежесуточно назначать SGID-бит директориям?
 
Добавлено:
А у файнда необходимым и достаточным условием проявления бага является нечиатемая текущая директория. От того, что и где мы ищем это вообще не зависит.
 
/tmp/b$ ls
ls: cannot open directory .: Permission denied
/tmp/b$ find / -exec echo {} \;
find: pred.c:1932: launch: Assertion `starting_desc >= 0' failed.
Aborted



----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:47 30-09-2013 | Исправлено: ASE_DAG, 19:54 30-09-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Да про текущую директорию ужё понял...
Назначение SGID бита это лишь одна из строчек скрипта, который гоняет данные между серверами, а назначение прав идёт т.к. некоторые кривые разработчики(заказчик настроек, он же владелец сервера) любят от root'а сидеть и ни чего я с этим поделать не могу, так вот что бы права всегда были в норме то после синхронизации я их рекурсивно переписываю, ну и SGID бит тоже как защита от того что все сидят с разными юзерами, а потом nginx'у файлы не открыть...
Вот как-то так печально мы с этим и живём.
 
Да, постараюсь не забыть завтра отписать, cron в 5 утра скрипт прогонит как есть, без cd.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 21:59 30-09-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Ошибок от find'а в логе cron'а нету, видать отработал нормально, чего не скажешь о скрипте в целом, но это уже мои пролемы.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 09:36 01-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для борьбы со спамом для postfix делаю файл blacklist.
До сегодняшнего дня добавлял строки руками, сегодня  это надоело делать, хочу автоматизировать процесс.
Надо строку из почтовых сообщений:

Код:
Received: from domain.com (mail.domain.com [11.222.333.44]

приводить в вид:

Код:
domail.com             REJECT Spam_domain-com.

Есть варианты?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 11:37 01-10-2013 | Исправлено: digital422, 11:37 01-10-2013
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital422
Цитата:
Есть варианты?
? Если речь только о работе со строкой, то:
echo " Received: from domain.com (mail.domain.com [11.222.333.44] " | gawk '{print $3" REJECT Spam_"gensub("\\.","-","g",$3)"."}'

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 12:00 01-10-2013
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Первая строка такая:

Код:
/usr/bin/find $PATH -type f $domain -exec /bin/grep "Received: from" {} \; \
| /bin/grep -v "127.0.0.1" | /bin/grep -v "localhost"

избавится бы еще от кучи grep (для исключения правильных и локальных хостов)

Код:
domail.com             REJECT Spam_com.  

Как выделить имя домена с точкой?

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 14:00 01-10-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru