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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
      Шпаргалка по частым синтаксическим оборотам.

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

 

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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dvk54
Код:
if [[ "$(ping -W 1 -c 2 8.8.8.8 | /usr/bin/awk '/transmitted/ && $1 == 2 && $4 == 2 {print "Hooray"}')" == "Hooray" ]]; then echo OK; else echo BAD; fi
Хотя вариант т. ASE_DAG со сравнением кол-ва пакетов мне нравится больше.

----------
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 11:06 22-06-2016 | Исправлено: Alukardd, 11:09 22-06-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> ping -W 1
 
У товарища Фряха.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 11:22 22-06-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
а у меня без -W большие таймауты и тесты отрицательного пинга было долго ждать)))

----------
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 13:47 22-06-2016
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Приветствую, возникла проблема, были модифицированы несколько файлов на сервере - около 25  
Ранее я специально для отслеживания таких модификаций повесил в крон выполнение примерно следующей задачи:

Код:
find /home/path_to_site_dir/public_html -iname "*.php" -type f -mtime -1 > /home/path_to_site_dir/public_html/changedphp.txt 2>&1

 
Ну или без учета типа файлов, не столь важно.
Так вот, в один прекрасный момент некоторое количество таких файлов - новых и измененных - я увидел, где то 15 шт.  
Почистил все, вроде все нормально. На всякий случай сделал экспертную проверку айболитом, и тут увидел вот какую странность.  
Обнаружилось еще примерно 10 модифицированных файлов, при этом дата модификации была подменена.  
Т.е. дата создания файла  - дата когда этот файл был реально перезаписан, т.е. вчерашнее число, а дата модификации - 6 месяцев назад или более. Каким образом дата создания может быть позже даты модификации, не пойму. Важно, что одной такой простой командой я теперь не могу решать такие задачи, и буду вынужден задействовать тяжелые скрипты которые отслеживают все до последнего знака в контрольной сумме.  
То не есть гут, тот же айболит вчера 5 часов с лишним на 90% процессор вешал, как меня не погнали поганой метлой, без понятия.
 
В общем, вопрос вытекает следующий: можно ли в указанный поиск добавить агрумент, чтобы искал не только по дате изменения, но и дате создания?
 
пс. Red hat на сервере, если это важно.

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 13:42 05-07-2016 | Исправлено: Weinaum, 13:43 05-07-2016
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. -ctime
2. с помощью touch можно поменять atime/mtime
3. используйте inotify/incron для отслеживания изменения объектов на файловой системе.
4. sha1sum работает быстро:
 
# sha1sum /var/www/data/1G.data
aac5c0e55e8d7184d201db3b7f84f416669ed07b  /var/www/data/1G.data
Real: 4.98s User: 2.08s System: 0.64s Percent: 54% Cmd: sha1sum /var/www/data/1G.data

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 16:45 05-07-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В дополнении могу сказать что есть уже заточенные под отслеживание изменений тулзы, типа tripwire.

----------
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 19:16 05-07-2016
1karavan1

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу помочь со следующей задачей:
Есть файл со списком ip-адресов (более сотни), по одному адресу в каждой строчке.
Пример:

Код:
10.10.11.18
10.10.11.182
10.10.11.194
10.10.11.198
10.10.11.202
10.10.11.214

Необходимо в файл к каждому адресу добавить некоторую информацию, взятую с каждого адреса по ssh.
Т.к. узлы не всегда доступны, весь скрипт засунул в бесконечный цикл.
Скрипт:

Код:
while :; do
    while read line; do
    IP=`echo $line | awk '{print $1}'`         #чтобы добавленная инфа не мешала продолжать забирать IP
    ID=`/usr/bin/sshpass -p $Password /usr/bin/ssh -o StrictHostKeychecking=no -o UserKnownHostsFile=/dev/null user@$IP "/system identity print" 2>/dev/null | /usr/bin/head -n1 | /usr/bin/awk '{print $2}'| /usr/bin/tr -d '\r\n'`
    if [[ -n "$ID" ]]; then
        sed -i "s/$IP$/& $ID/" ./list_ip
    fi
    done < ./list_ip
done
 

Проблема в том, что скрипт читает файл со списком адресов до первого успешного подключения по ssh, после чего возвращается к первой строке.
Так и топчется на месте.

Всего записей: 382 | Зарегистр. 20-11-2015 | Отправлено: 20:04 05-07-2016
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
arto
-ctime - нашел еще 2 файла, на которые айболит вообще не показал!
вопрос: как правильно указать оба аргумента, т.е. ,по моему примеру, найти файлы и созданные, и измененные в последние сутки? если я ставлю оба ключа подряд -  -mtime -1 -ctime -1 показыватся или результат только mtime или те что есть в обоих случаях (и там и там). А надо чтобы или там или там.
 
Alukardd
Подскажите, продукт развивается, именно Open Source Tripwire для линукс?  
вижу только "последняя версия от 21.11.2011".
или монструозный сайт с платными системами в котором не очень просто разобраться....

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 20:15 05-07-2016
Pasha_ZZZ



Platinum Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Weinaum Можно попробовать так:
Цитата:
( find ....... -ctime; find ...... -mtime ) >....
или
Цитата:
{ find ....... -ctime; find ...... -mtime; } >....

Всего записей: 12375 | Зарегистр. 11-03-2002 | Отправлено: 20:28 05-07-2016
arto

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
\( -mtime -1 -o -ctime -1 \)
 
Добавлено:
а tripwire -- монстр.

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 20:50 05-07-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Weinaum
Цитата:
вижу только "последняя версия от 21.11.2011".
https://github.com/Tripwire/tripwire-open-source/releases
В Debian'е точно есть пакет в репах, в остальных не проверял.

----------
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 21:00 05-07-2016
arto

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

Цитата:
Есть файл со списком ip-адресов (более сотни), по одному адресу в каждой строчке

 
прочитать в массив и бегать по нему. sed перезаписывает файл.

Всего записей: 294 | Зарегистр. 08-02-2003 | Отправлено: 21:01 05-07-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1karavan1
1. зачем нужен бесконечный внешний цикл?
2. плохая затея одновременно читать файл и пытаться с ним же играться sed -i (in-place).
 
Добавлено:
И самое главное: нельзя просто так взять и поюзать ssh внутри while read'а... На самом деле дело тут не именно в ssh, а в особеностях его умения работать в конвейере.
По сути у вас всегда скрипт заходит только на первый сервер из списка и усё.

----------
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 21:02 05-07-2016
1karavan1

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

Цитата:
зачем нужен бесконечный внешний цикл?


Цитата:
Т.к. узлы не всегда доступны, весь скрипт засунул в бесконечный цикл.  

Предполагается, что хотя бы раз в сутки узел появляется в зоне досягаемости.
А мне необходимо разово собрать инфу по доступным узлам.

Цитата:
плохая затея одновременно читать файл и пытаться с ним же играться sed -i (in-place).

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

Код:
 
while :; do
    for line in `cat ./list_ip` ; do
    IP=`echo $line | awk '{print $1}'`
        ID=`/usr/bin/sshpass -p $Password /usr/bin/ssh -o StrictHostKeychecking=no -o UserKnownHostsFile=/dev/null user@"$IP" "/system identity print" 2>/dev/null | /usr/bin/head -n1 | /usr/bin/awk '{print $2}'| /usr/bin/tr -d '\r\n'`
        if [[ -n "$ID" ]]; then
            sed -i "s/$IP$/& $ID/" ./list_ip
        fi
    done
done

 
Тут косяк в одном, каждое слово в строчке подсовывается в переменную $IP.
Мозгов на кодинг в баше нет, поэтому использовал костыль в ssh_config с пониженным таймаутом на подключение до 5 секунд.
Скрипту все равно работать без присмотра сутки.

Всего записей: 382 | Зарегистр. 20-11-2015 | Отправлено: 21:15 05-07-2016
Weinaum



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
спасибо, буду пробоватьPasha_ZZZ
arto
не стал заморачиваться, записал в простейшей sh скрипт 2 строки, сначала найти одно записать, потом найти второе и добавить в конец файла.

Всего записей: 2152 | Зарегистр. 18-06-2006 | Отправлено: 21:37 05-07-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1karavan1
 
> for line in `cat ./list_ip`
> IP=`echo $line | awk '{print $1}'`
> | /usr/bin/head -n1 | /usr/bin/awk '{print $2}'| /usr/bin/tr -d '\r\n'`
> sed -i "s/$IP$/& $ID/" ./list_ip
 
Какой ужас.   Я даже не понимаю, с какой стороны это начинать критиковать.
 
Прощу у публики прощения за свою лень, но я все-таки позволю себе не об’яснять товарищу 1karavan1 его ошибки, а просто написать программку по условию.
 
#!/bin/bash
 
ip_list_file='ip-list'
output_file='output'
timeout='10m'
 
ssh () {
    /usr/bin/sshpass -p "$passwd" \
                     /usr/bin/ssh \
                     -o StrictHostKeychecking=no \
                     -o UserKnownHostsFile='/dev/null' \
                     "$@"
}
 
 
mapfile -t ipaddrs < "$ip_list_file"
 
while [[ $ipaddrs ]]; do
    for i in "${!ipaddrs[@]}"; do
        read __ some_unnamed_info < \
             <(ssh "${ipaddrs[$i]}" "/system identity print")
        some_unnamed_info="${some_unnamed_info%$'\r'}"
 
        if [[ $some_unnamed_info ]]; then
            printf >> "$output_file" \
                   '%s %s\n' "${ipaddrs[$i]}" "$some_unnamed_info"
            unset ipaddrs[$i]
        fi
    done
 
    sleep "$timeout"
done

 
Не проверял, разумеется.  Могут быть ошибки вплоть до синтаксических.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:29 06-07-2016 | Исправлено: ASE_DAG, 00:38 06-07-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
у меня есть косметические  замечания к вашему коду)))
1. мне кажется плохим тоном переопределять внешние команды (в данном случае ssh). Тут меня ещё коробит объявление без ключевого слова function, но тут как кто привык.
2. тяжело читать printf когда перенаправление идёт до аргументов функции. (perl'овые привычки?))
3. забыли объявить или прочитать с аргументов переменную $passwd.

----------
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 11:09 06-07-2016 | Исправлено: Alukardd, 11:11 06-07-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> мне кажется плохим тоном переопределять внешние команды (в данном случае ssh).
 
Возможно.  Однако же в интерактивной оболочке вы это постоянно делаете.
 
> Тут меня ещё коробит объявление без ключевого слова function, но тут как кто привык.
 
Я бы поспорил с тем, что это сугубо дело вкуса.  Для ГНУ Баша — да, но согласитесь, что полностью игнорировать существование родственных ему языков, где foo () { :; } — это о-кей, а function foo () { :; } — это синтаксическая ошибка, а это, к примеру, ASH или воображаемый POSIX Shell, тоже не стоит.
 
> тяжело читать printf когда перенаправление идёт до аргументов функции. (perl'овые привычки?))
 
Хорошо, поимею в виду.  Ага.  :-)
 
> забыли объявить или прочитать с аргументов переменную $passwd.
 
Ну, а откуда я его возьму-то?  В образце пароль тоже из ниоткуда возникал.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:55 07-07-2016 | Исправлено: ASE_DAG, 02:56 07-07-2016
1karavan1

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Все же, если найдете время, я бы с удовольствием выслушал критику.
Однако, примите во внимание, что я, когда пишу код, не ставлю целью получить приз на олимпиаде программистов.
Мне вообще красота кода до лампочки, мне важны две вещи:
1. Результативность решения поставленной задачи.
2. Читабельность кода.
При чем, по второму пункту, я не преследую целью передавать этот код кому бы то ни было, я скриптами решаю свои задачи, а не чужие, соответственно читабельность сугубо субъективную подразумеваю.
 
За Ваш код спасибо, однако я его не проверял, потому что мой код все же вчера выдал требуемый результат.
Возвращаясь к моему убогому коду, хочу сказать, что он собран из сотни примеров найденных на просторах интернета.
Из всех примеров я не нашел ни одного, который бы нормально описывал построчное чтение файла в баше.
Все примеры сводятся к одному:
while read line; do
_somebody_ $line
done < ./file.txt
До сих пор меня мучает вопрос "как прочитать из файла только второе слово из строки и передать в итерацию циклу?"
Еще сложнее "изменить каждое второе слово в строке"
 
Alukardd
Переопределение плохо? а как же алиасы?
Отсутствие объявления переменной? Даже не ставлю это в ранг ошибки, так, некоторый нюанс на внимательность.

Всего записей: 382 | Зарегистр. 20-11-2015 | Отправлено: 09:16 07-07-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1karavan1
Цитата:
До сих пор меня мучает вопрос "как прочитать из файла только второе слово из строки и передать в итерацию циклу?"
т. ASE_DAG так и делает
Цитата:
read __ some_unnamed_info
Если в строке больше чем два слова, а вам нужно второе. то нужно дописать ещё чепухню в конец read'а, анпример ___
 

Цитата:
Все примеры сводятся к одному:
Опять же, не забывайте то что я Вам написал про while read выше
Цитата:
И самое главное: нельзя просто так взять и поюзать ssh внутри while read'а...

 
1karavan1, ASE_DAG
alias'ы в интерактивном shel'е не тоже самое что переопределение функцией системной команды.
Что бы в скрипте, который source'ится избавиться от влияния alias'ов я стараюсь пользоваться либо which с определением полного пути до бинарника, либо использовать конструкцию вида \command, что бы избежать alias'ов.
Да и alias'ы я использую только для ls --color, grep --color=auto и т.п. А если мне нужно новое поведение от ssh, то я пишу функцию или alias с новым именем.

----------
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.

Всего записей: 6562 | Зарегистр. 28-08-2008 | Отправлено: 10:11 07-07-2016
Открыть новую тему     Написать ответ в эту тему

Страницы: 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