LINUX.ORG.RU

Скрипты, которые мы пишем...


0

0

Уважаемый All, все мы по долгу службы или просто для своего удобства вынуждены писать различные скрипты для различных целей, будь то автоматическая инсталяция продуктов на несколько машин или вещи попроще. Вот я и подумал, что зачем сто раз писать то, что уже давно написано и во что вложено достаточно труда и времени. Давайте устроим здесь своеобразный ⌠пункт обмена■, неопытные пользователи скажут Вам спасибо и смогут сразу использовать скрипты, а опытные смогут сэкономить себе немного времени, головной боли, а также поучится новым программистским приемам. Для затравки выложу здесь (На форуме development - линк - внизу ) небольшой скрипт, который упорядывачивает вывод от стандартной команды df (для Линукса это, может не так актуально, а мне на Солярисе 2.6 очень даже помогает.) внутри ещё чего покидаю... Так что, продолжение следует?..

>>> Ссылка на форум

Уважаемый All, можно ли с помощью скрипта вырезать из бинарного файла кусок начиная с некоторой последовательности шестнадцатеричных кодов и до конца ? Если знаете, то как?

anonymous
()

Идея создания ресурса для обмена скриптами отличная !

anonymous
()

Доброе утро:)
вот вам пара советов как сделать свои скрипты нагляднее (жирный шрифт, другой цвет, и так далее) с помощью так называемых Escape Sequencen.
Кстати \033 работает только в таких шеллах как ksh, bash, а в таких типа sh надо использовать ^[ - это один значек! -выводится так: Ctrl + v + Esc
работает в любом шелле

\007 - Sound
\033[10;#] - Установить частоту звукового сигнала в герцах
\033[11;#] - время звукового сигнала в миллисекундах
Комбинируем: \033[10;40]\033[11;35] или короче \033[10;40;11;35]

\033[0m - default
\033[1m - жирный шрифт
\033[2m - тёмно-серый
\033[4m - ярко-белый
\033[5m - мигающий
\033[7m - реверсия (фон на цвет шрифта, а шрифт на цвет фона)
\033[22m - нормальная интенсивность
\033[24m - отменить подчеркивание
\033[25m - отменить мигание
\033[27m - отменить реверсию

\033[30 - черный цвет знаков
\033[31 - красный цвет знаков
\033[32 - зеленый цвет знаков
\033[33 - коричневый цвет
\033[34 - синий цвет
\033[35 - фиолетовый
\033[36 - магента
\033[37 - серый цвет
\033[40 - черный цвет фона
\033[41 - красный цвет фона
\033[42 - зеленый цвет фона
\033[43 - коричневый цвет фона
\033[44 - синий цвет фона
\033[45 - фиолетовый цвет фона
\033[46 - магента фон
\033[47 - серый цвет фона

Да, в зависимости от версии ЮНИКСа некоторые цвета могут быть другими (у меня на Солярисе, например не работает желтый и коричневый цвет), но восновном вышенаписанное подходит для всего. И не пишите белым по белому;)
Пример:

#!/bin/ksh
echo "^[[37;1;41m DANGER ^[[0m"

Не забудте потом выставить текст в нормальный режим ^[[0m , а то весь дальнейший текст будет тоже на на красном фоне (в данном примере)

CrownRU
() автор топика
Ответ на: комментарий от delta9

можно узнать, что там не работало? Подозреваю, что nawk... надо заменить на awk или gawk Насчёт сайта, буду рад поддержать чем смогу: скриптами и статейками, которые смогу перевести:)

CrownRU
() автор топика

А вот пост про ESC-последовательности мне понравился :-)

fearan
()

Поконкретнее: Допустим нужно отрезать от SFX-rar архива запускаемую часть. Известно, что архив в чистом виде следует после SFX и начинается с последовательности шестнадцатеричных символов 0x52 0x61 0x72 0x21 0x1a 0x07 0x00. Вопрос: Можно ли с помощью sed|awk|perl вырезать архив???

anonymous
()

To: anonymous (*) (2002-07-12 12:59:32.518)
Самый простой
# strings file > newfile
вытащит только ASCI знаки

или, если хочешь выудить твои шестндцетиричные символы, то:

# strinfs -t x file

тогда, то, что получишь на выходе, можешь передать в... чем ты там резать хочешь.

CrownRU
() автор топика
Ответ на: комментарий от CrownRU

> Вообщето все вырезания - замешения делаются довольно удобно > в awk - sed

Балбес, тебе же написали ясно что файл __бинарный__, последовательность символов произвольная, то есть может включать и символ перевода строки.

По-моему проще всего на перле, в помощью чтения кусков без буферизации по строкам - т.е sysread. Искать последовательност во входном буфере функцией index, если не нашлась, то оставить из входного куска хвост длиной не менее длины последовательности, считать еще кусок, добавить его к буферу, и снова искать в нем последовательность. Как нашел - все остальное на вывод. ИМХО, несложно сделать.

anonymous
()

To: anonymous (*) (2002-07-12 14:03:22.942)
Если Вы, уважаемый аноним, оскорбляя других участников
форума надеетесь завоевать уважение, то Вы заблуждаетесь...
Лучше поделитесь с нами сирыми своей безграничной мудростью.

CrownRU
() автор топика
Ответ на: комментарий от CrownRU

Да, есть еще hexdump, но как мне обратно из 16-ричного представления упаковать в бинарник? нужно не просто выудить, а отрезать начиная с последовательности байт Делаем: cat sfx.exe|sed -n '/Rar!/,$ p'|sed 's/.*Rar!/Rar!/'> nosfx.rar

отрезает, но перед Rar! остается последовательность байт не попавших в шаблон .* , и это похоже связано с тем что sed предназначен для работы с текстовыми данными,к примеру исполняем: echo -e 'abc\ndefRar!sadf\nasf'|sed -n '/Rar!/,$ p'|sed 's/.*Rar!/Rar!/' получаем нужный результат: Rar!sadf asf C awk та же история скорее всего Может на perl можно сделать, я мельком знаю что там есть что-то вроде binmode.

anonymous
()

2CrownRU:заменил nawk на awk - это я сделал после первого запуска текущий вид скрипта могу кинуть тебе на мыло(если есть) а вывод - пожалуйста - ]$new_df - 00================================== ====================== TOTAL local for delta9.capslock.ru in kbytes 0 0

delta9
()
Ответ на: комментарий от anonymous

В общем понятно в каком направлении искать, спасибо тебе! Но вот если бы написал скрипт, было бы совсем здорово

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

PS: оскорбления суть пошлость

anonymous
()
Ответ на: комментарий от delta9

Кинь, гляну, что там может быть, и заодно screenshot что у тебя выводит сейчас. a101i08@dvg.de

CrownRU
() автор топика
Ответ на: комментарий от anonymous

Кинь файл, глянем, что можно сделать. Не весь, разумеется:)

CrownRU
() автор топика

Не пойму, зачем столько геморроя, искать, как это делается в sed/awk/perl. Зачем заставлять перл обрабатывать большие бинарные файлы? Вот программа на C не сложнее скрипта (и довольно тупая), но зато писать быстрее.

#include <stdio.h>
int main()
{
unsigned char seq[7]={0x52,0x61,0x72,0x21,0x1a,0x07,0x00};
unsigned char c;
int seq_match=0,C;

while ((C=fgetc(stdin))>=0) {
c=C;
if (seq[seq_match]==c)
seq_match++;
else
seq_match=(seq[0]==c)?1:0;

if (seq_match==sizeof(seq)) {
fwrite(seq,1,sizeof(seq),stdout);
while ((C=fgetc(stdin))>=0)
fputc(C,stdout);
return 0;
}
}
return 1;
}

$ gcc unsfx.c -o unsfx
$ unsfx <in >out

И все!

anonymous
()
Ответ на: комментарий от anonymous

> И все!

Спасибо, добрый человек ! :)

anonymous
()
Ответ на: комментарий от anonymous

2anonymous:
>можно ли с помощью скрипта вырезать из бинарного файла кусок начиная
>с некоторой последовательности шестнадцатеричных кодов и до конца ?
man tail

Led ★★★☆☆
()
Ответ на: комментарий от CrownRU

Господа!

Если уж и приводить ESC-последовательности здесь, то надо ясно
сказать, для какого _терминала_ они применимы.
Посмотрую я на отработку DEC VT100-последовательностей на
каком-нибуть WISE или IBM.

Чуствуется, что никогда железного терминала в руках не держали :).

Единственным переносимым способом управления терминалом является
использование tremcap/terminfo. IMHO, конечно.

Если обсуждается коллекция скриптов, то уж надо ее делать
переносимой.

Regards!
GNS

gns ★★★★★
()

Позволю себе высказаться...

1. Каждый пишет себе скрипты по-своему криво и в меру своего понимания - и если он увидит, что можно проще/лучше/корче/быстрее - хуже не будет. IMHO это лучше, чем изводиться на windows vs linux & emacs vs vi.:)

2. С моей точки зрения достаточно подхода: Скрипт для решения определенной задачи - 1 тред в форуме. Насчет отделения этого от development - не знаю, надо или нет (хотя хочется).;)

3. В конце концов процесс может получиться ИНТЕРЕСНЫМ.:)

Dimai
()
Ответ на: комментарий от gns

А как-же, держали мы железные терминалы, держали:)
Там будет работать только "жирный текст", по крайней мере у меня работает. Также не рекомендую вставлять ESC Sequence в boot скрипты и motd, я ещё не слышал, что от этого пострадал кто-то, но всеже, от греха подальше:)

CrownRU
() автор топика
Ответ на: комментарий от anonymous

> Не пойму, зачем столько геморроя, искать, как это делается в > sed/awk/perl. Зачем заставлять перл обрабатывать большие бинарные > файлы? Вот программа на C не сложнее скрипта (и довольно тупая), но > зато писать быстрее. A вот программа на perl: perl -ne 'BEGIN{ $/ = pack("C7",0x52,0x61,0x72,0x21,0x1a,0x07,0x00) }; print if $i++' Ну и что же написать быстрее? :)

anonymous
()
Ответ на: комментарий от anonymous

> Не пойму, зачем столько геморроя, искать, как это делается в
> sed/awk/perl. Зачем заставлять перл обрабатывать большие бинарные
> файлы? Вот программа на C не сложнее скрипта (и довольно тупая), но
> зато писать быстрее.


A вот программа на perl:

perl -ne 'BEGIN{ $/ = pack("C7",0x52,0x61,0x72,0x21,0x1a,0x07,0x00) }; print if $i++'

Ну и что же написать быстрее? :)

anonymous
()
Ответ на: комментарий от Led

2Led: >>можно ли с помощью скрипта вырезать из бинарного файла кусок начиная >>с некоторой последовательности шестнадцатеричных кодов и до конца ? > man tail Приятель, ты либо невнимательно прочитал приведенное тобой же сообщение и форум перед своим сообщением, либо не читал мануал по tail.

anonymous
()
Ответ на: комментарий от Led

>>можно ли с помощью скрипта вырезать из бинарного файла кусок начиная
>>с некоторой последовательности шестнадцатеричных кодов и до конца ?
> man tail

Нет в tail таких возможностей.

anonymous
()
Ответ на: комментарий от anonymous

>perl -ne 'BEGIN{ $/ = pack("C7",0x52,0x61,0x72,0x21,0x1a,0x07,0x00) }; print if $i++'

>Ну и что же написать быстрее? :)

некорректно сработало - результат меньше на 7 байт, твой скрипт отрезает саму последовательность 0x52,0x61,0x72,0x21,0x1a,0x07,0x00

PS: на С все ОК.

anonymous
()
Ответ на: комментарий от anonymous

>некорректно сработало - результат меньше на 7 байт, твой скрипт >отрезает саму последовательность 0x52,0x61,0x72,0x21,0x1a,0x07,0x00

Ну так и должно быть ...
Как задача была поставлена - оставить все после последовательности.
А как надо? Поправлю, только скажи.


anonymous
()

Это я, anonymous (*) (2002-07-12 15:02:29.601), пишущий на С.
К сожалению, прога с ошибкой была. Но анонимус пошел погулять, и на свежем воздухе прояснилось:

#include <stdio.h>
#include <string.h>
int main()
{
unsigned char seq[7]={0x52,0x61,0x72,0x21,0x1a,0x07,0x00};
unsigned char buffer[sizeof(seq)];
unsigned char c;
int C,bytes_read=0;

while ((C=fgetc(stdin))>=0) {
bytes_read++;
memmove(buffer,buffer+1,sizeof(buffer)-1);
buffer[sizeof(buffer)-1]=C;

if (bytes_read>=sizeof(seq) && strncmp(seq,buffer,sizeof(seq))==0) {
fwrite(seq,1,sizeof(seq),stdout);
while ((C=fgetc(stdin))>=0)
fputc(C,stdout);
return 0;
}
}
return 1;
}

Тем не менее, и та прога, скорее всего, сработала бы.

anonymous
()
Ответ на: комментарий от ignite

to ignite
> По поводу вырезания части бинарника RTFM dd Ноги, крылья, главное -
> хвост ! ;)

dd не поможет тебе вырезать кусок файла после какой-то символьной
последовательности. Если умеешь - продемострируй :)

anonymous
()
Ответ на: комментарий от ignite

2ignite:

Дык самое сложное это научить скрипт вычислять skip= для dd

anonymous
()
Ответ на: комментарий от anonymous

>>Как задача была поставлена - оставить все после последовательности. >>А как надо? Поправлю, только скажи. Нужно оставлять последовательность - этож признак архива :) но все равно спасибо

anonymous
()
Ответ на: комментарий от CrownRU

>А как-же, держали мы железные терминалы, держали:)

Узнаю брата Васю:) Только вот, опять-же. Запомнят люди приведенные
тобой витишные эскейпы и будут их лепить куда не попадя.
А на замечание о том, что надо-бы в termcap посмотреть никто
внимания и не обратит :( Сдается мне, что не надо людей плохому
учить...

>Там будет работать только "жирный текст", по крайней мере
>у меня работает. Также не рекомендую вставлять ESC Sequence
>в boot скрипты и motd, я ещё не слышал, что от этого пострадал
>кто-то, но всеже, от греха подальше:)

Вообще говоря, если логическая инициализация и осознавание
параметров консоли проходит сразу (на ранних стадиях исполнения
rc-скриптов), то вроде-как и быть ничего не должно. Но, сколь я
понимаю, при отработке rc-скриптов переменной TERM вообще
может не существовать. Так-что - действительно, от греха подальше.

Тонкий изврат по расцвечиванию отображения процесса загрузки я
наблюдал только в linux. Остальные виденные мною UNIX (а их не мало)
как-то не заморочены были на эту тему. Пустое это все. Да и монитор
на сервере, как правило, отключен...

gns ★★★★★
()
Ответ на: комментарий от anonymous

> Нужно оставлять последовательность - этож признак архива :)

Ну тады вот так:

perl -ne 'BEGIN{ $/ = pack("C7",0x52,0x61,0x72,0x21,0x1a,0x07,0x00) }; print $/ if $i == 1; print if $i++'

Легко и приятно! :)
Просто мне с такими архивами никогда не приходилось встречаться.

anonymous
()

А вот так еще короче:

perl -pe 'BEGIN{ $/ = pack("C7",0x52,0x61,0x72,0x21,0x1a,0x07,0x00) }; $_ = $/ unless $i++'

Совсем легко и совсем приятно!

anonymous
()

Ещё раз к Esc Sequence -
ещё пара фокусов, пусть не столь красочных, но не менее полезных - Поговорим об управлением положения курсора. Это Вам пригодится если например надо вывести текст на середину экрана

\033[#A - передвинуть курсор вверх на # строк
\033[#B - передвинуть курсор вниз на # строк
\033[#C - передвинуть курсор вправо на # столбцов
\033[#D - передвинуть курсор влево на # столбцов
\033[#E - передвинуть курсор вниз на # строк и поставить в начало строки
\033[#F - передвинуть курсор вверх на # строк и поставить в начало строки
\033[#G - передвинуть курсор в указанный столбец данной строки
\033[#;#H - передаем координаты курсора (строка - столбец)

Ну и пример ловите - напишет зелеными буквами на красном фоне с подчеркиванием (бррррр... тьфу) <Вот Вам Пример!> примерно в центре экрана

# man ls ; echo "^[[17A^[[50G^[[1;4;32;41m Vot Vam Primer! ^[[0m^[[12E"

CrownRU
() автор топика
Ответ на: комментарий от poison_reverse

Для неЛинуксовых юниксов %)))

#!/bin/bash
work_dir="/home"
for i in `ls $work_dir`
do
du -sk $work_dir/$i
done
du -sk $work_dir

sco-killer
()
Ответ на: комментарий от anonymous

Eto budet po karotsche, ili?

ls -l | awk '{print $0; sum+=$5} END{printf "----------\n%f M\n",sum/1024/1024}'"

anonymous
()

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

недостатки сам пропишу:

1. адрес сервера жестко вписан в код (можно было бы в ком-строку засунуть)

2. адрес получателя - то же самое, что и 1

плюсы - отправление всех файлов, включая бинарники и включая и те, что больше 64К (многие почтовые клиенты не обрабатывают такие тексты, если они идут plain/text без кодирования)

а вот и скриптик

#!/usr/bin/python

import smtplib, sys, MimeWriter, cStringIO, mimetools

for file in sys.argv[1:]:

Message=cStringIO.StringIO() writer=MimeWriter.MimeWriter(Message) writer.addheader('Subject', 'file: %s'%(file,)) writer.addheader('Content-transfer-encoding', 'base64')

pout=writer.startbody('text/plain', [('name', file)]) infile=open(file, 'rb') mimetools.encode(infile, pout, 'base64') infile.close() srv=smtplib.SMTP('localhost:25') srv.sendmail('root', 'main', Message.getvalue()) srv.quit()

anonymous
()

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

недостатки сам пропишу:

1. адрес сервера жестко вписан в код (можно было бы в 
ком-строку засунуть)

2. адрес получателя - то же самое, что и 1

плюсы - 
отправление всех файлов, включая бинарники
и включая и те, что больше 64К (многие почтовые
клиенты не обрабатывают такие тексты, если они
идут plain/text без кодирования)

а вот и скриптик

#!/usr/bin/python

import smtplib, sys, MimeWriter, cStringIO, mimetools


for file in sys.argv[1:]:

	Message=cStringIO.StringIO()
	writer=MimeWriter.MimeWriter(Message)
	writer.addheader('Subject', 'file: %s'%(file,))
	writer.addheader('Content-transfer-encoding', 'base64')

	
	pout=writer.startbody('text/plain', [('name', file)])
	infile=open(file, 'rb')	
	mimetools.encode(infile, pout, 'base64')
	infile.close()
	
	srv=smtplib.SMTP('localhost:25')	
	srv.sendmail('root', 'main', Message.getvalue())                        
	srv.quit()

anonymous
()
Ответ на: комментарий от CrownRU

> Ну и пример ловите - напишет зелеными буквами на красном фоне с подчеркиванием (бррррр... тьфу) <Вот Вам Пример!> примерно в центре экрана > ># man ls ; echo "^[[17A^[[50G^[[1;4;32;41m Vot Vam Primer! ^[[0m^[[12E"

гнать горазд как обычно... man вывелся как всегда, после него: localhost:~> man ls ; echo "^[[17A^[[50G^[[1;4;32;41m Vot Vam Primer! ^[[0m^[[12E" ^[[17A^[[50G^[[1;4;32;41m Vot Vam Primer! ^[[0m^[[12E

anonymous
()

To: anonymous (*) (2002-07-12 21:09:56.54)
Зря, наверное, отвечаю, хамлу такому, ну да ладно...
Я ещё вверху писал, что ^[ это ОДИН знак. Пишется так Ctrl + v + Esc
плюсы писать не надо.
Если не получается - спроси вежливо - ответим, и не думай, что если хамить будешь, дождешься объяснений.

CrownRU
() автор топика
Ответ на: комментарий от anonymous

Важней всего в твоем случае : 1. выучить русский язык, 2. выучить английский язык. 3. понять, что ты хочешь от своей программы.

А в остальном, я уверен, что "идея" возникла просто от элементарной неграмотности и неумения мыслить.

anonymous
()

Вот это правильная работа с консолью. Взято из http://www.javacommerce.com/tips/linux/all/00000080.html
set_prompt ()
{
     local SAVE_CRS=`tput sc 2> /dev/null`
     local RESET_CRS=`tput rc 2> /dev/null`
     local CLOCKPOS=`tput cup 0 $(($HZ-10)) 2> /dev/null`
     local FOREG=`tput setaf 6 2> /dev/null` #4
     local ALT_FOREG=`tput setaf 3 2> /dev/null` #4
     local BACKG=`tput setab 0 2> /dev/null` #6
     local NORMAL=`tput sgr0 2> /dev/null`
     local BOLD=`tput bold 2> /dev/null`
 
     PS1="\[${NORMAL}${SAVE_CRS}${CLOCKPOS}${FOREG}${BACKG}${BOLD} \@
 ${RESET_CRS}${BOLD}${ALT_FOREG}\]\u\[${NORMAL}\]@\h:\w\$ "
 }
set_prompt

Elendal

anonymous
()

BASH

А мне больше нравится делать заголовок командной строчки вот так:

CUR_TTY=$(tty | sed -e "s/.*dev\/\(.*\)/\1/") PS1='\u-$CUR_TTY \w\$ '

Знание номера терминала бывает полезно при работе с несколькими консолями. Использование цветов иногда запутыват bash относительно длины строки в history, что раздражает.

Много полезной информации по работе bashкой можно найти по адресу http://www.caliban.org/bash/ Особенно интересен скрипт для расширения возможностей чудесной клавиши tab, которая теперь может дополнять строчки для man.

Добавив в /etc/inittab такую строчку:

# aumix at spare terminal (12) st12:2345:respawn:/usr/bin/aumix >/dev/tty12 </dev/tty12

получаем на 12 консоли регулятор громкости (если установлен aumix)

Подскажите пожалуйста как включить создание файлов coredump? Желательно чтоб это можно было делать на лету без перекомпиляции ядра - мне нужны дампы только отлаживаемой программы. Ядро 2.4.18 - система собрана руками по инструкциям из Linux-From-Scratch.

Aerton

anonymous
()

В предыдушем посте строчки склеились Ж-( Должно быть так: Командная строчка: CUR_TTY=$(tty | sed -e "s/.*dev\/\(.*\)/\1/") PS1='\u-$CUR_TTY \w\$ ' Регулятор громкости: # aumix at spare terminal (12) st12:2345:respawn:/usr/bin/aumix >/dev/tty12 </dev/tty12 Aerton

anonymous
()

Один из очень немногих тредов, которые могут быть полезны... Идея очень хорощая - но продолжения наверняка не получит...

anonymous
()
Ответ на: комментарий от anonymous

2anonymous:
>Приятель, ты либо невнимательно прочитал приведенное тобой же
>сообщение и форум перед своим сообщением, либо не читал мануал по
>tail
Видно я невнимательно читал форум:)
Действительно, для tail -c $skip file.bin
нужно ещё и $skip вычислить ;-)

Ламерский вопрос: как в bash'e сделать trancate для файла?

Led ★★★☆☆
()

2 Led:
> Ламерский вопрос: как в bash'e сделать trancate для файла?

perl -e 'truncate "filename", length'

С перлом все делается легко и просто! :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.