sh


shell programming

romy4 аватар

Run function under different user

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

#!/bin/bash
 
function run_as_another()
{
  echo "I'm under another user"
  id
}
 
export -f run_as_another
su another -c run_as_another
 
echo Voila!
0
Ваша оценка: Ничего
ramok аватар

Случайная fork бомба

Делал простенький скрипт для преобразования ссылок с ютуба к нормальному виду. Команды замены взял из своих настроек urxvt в ~/.Xresources (в нём есть встроенный perl интерпретатор), сделав простенькую обвязку на perl

#/usr/bin/perl -CS 
 
$_ = $ARGV[0];
 
goto END if s,^(https?://(?:www\.)?youtube\.com/)[^ \n]*v[=\\/]([A-Za-z0-9_-]{11}).+?(t=\d+)[^ \n]*,$1watch?v=$2#$3$4,;
goto END if s,^(https?://(?:www\.)?youtube\.com/)[^ \n]*v[=\\/]([A-Za-z0-9_-]{11}).*,$1watch?v=$2,;
goto END if s,^https?://(?:www\.)?(?:youtu\.be/)([A-Za-z0-9_-]{11})$,http://www.youtube.com/watch?v=$1,;
goto END if s,^(https?://(?:www\.)?youtube\.com/)embed/([A-Za-z0-9_-]{11})[^ \n]*,$1watch?v=$2,;
 
exit;
 
END:
    print;

Внезапно всё начало тормозить. htop показал что скрипт воспроизводит себя с бешеной скоростью. Предлагаю сначала самостоятельно догадаться в чем дело :)

P.S.
Будьте осторожны с запуском. Предохраняйтесь :)

UPDATE:

0
Ваша оценка: Ничего
ramok аватар

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

Во время отладки скриптов очень удобно видеть какие трассировку, какие команды исполняются во время исполнения скрипта.
Обычно это реализуется специальными командами включения/выключения трассировки. Информация о выполнении команд обычно выводится в поток ошибок.
Ниже приведены примеры для sh/bash/zsh, expect/tcl, python.

0
Ваша оценка: Ничего
bliznezz аватар

OCR на bash + imagemagick

Есть много программок на андроиде, которые рисуют otp-код (one time password). Вот и у меня одна такая.
Но распознавать глазами код совершенно не интересно, поэтому нацарапал скриптик который этот код распознает как текст. Справедливости ради текст представляет собой несколько цифр в одном положении экрана определенного размера, удобным для распознавания шрифтом, не капча.

5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)
romy4 аватар

Фильтрация stderr без слития с stdout

Сделав два раза swap и между ними grep - мы добиваемся желаемого, фильтруем stderr (почти) без побочных эффектов.

( prog 3>&2 2>&1 1>&3 | grep -v "лишний warning который нельзя отключить" ) 3>&2 2>&1 1>&3

----------------
ликбез:
Когда мы пишем в bash prog X>&Y , то перед запуском происходит присваивание
file_descriptors[X] = file_descriptors[Y]
Присваивания происходят в порядке написания, через них можно сделать swap дескрипторов:

prog 3>&2 2>&1 1>&3
0
Ваша оценка: Ничего
ramok аватар

Пройти свой путь до конца...

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

Яркий пример это Debian alternatives system. Эта подсистема позволяет использовать однотипные программы под одним и тем же именем, в зависимости от предпочтений. И основана она на символических ссылках.

Помочь в этом может команда namei.
Например что бы узнать куда в результате указывает x-terminal-emulator можно сделать так

$ namei $(which x-terminal-emulator)
f: /usr/bin/x-terminal-emulator
 d /
 d usr
 d bin
 l x-terminal-emulator -> /etc/alternatives/x-terminal-emulator
   d /
   d etc
   d alternatives
   l x-terminal-emulator -> /usr/bin/urxvt
     d /
     d usr
     d bin
     - urxvt

Хотя если разобраться в системе альтернатив, то можно найти другую команду:

$ update-alternatives --config x-terminal-emulator 
4.666665
Ваша оценка: Ничего Рейтинг: 4.7 (3 голоса)
ramok аватар

Повторить символ заданное количество раз

Повторить символ заданное количество раз

$ printf 'A%.0s' {1..50}
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
$ perl -e 'print "A"x50'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
$ python -c 'print "A"*50'
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
3.333335
Ваша оценка: Ничего Рейтинг: 3.3 (3 голоса)
angel2s2 аватар

spam-chek 0.3: Быстрее, больше, сильнее

Я уже выкладывал и писал предыдущие версии скрипта spam-check. Сегодня же, в преддверии Нового 2010 года, хочу поделиться новой, третьей версией данного скрипта.
Напомню, скрипт предназначен для проверки своих (и не только) серверов на их наличие в черных списках (DNSBL).

5
Ваша оценка: Ничего Рейтинг: 5 (3 голоса)

Демотиваторы

Все мы знаем ныне популярный формат картинок в интернете - демотиваторы. Известен так же и бум , связанный с ними. Программы для создания демотиваторов были написаны на огромном множестве языков программирования. Но линуксоид во всем и всегда должен быть первым =) Внесу свою скромную лепту. Создаем демотивационные постеры одной командой при помощи скрипта!

5
Ваша оценка: Ничего Рейтинг: 5 (3 голоса)

Пишем альтернативный поиск по истории переписки в Pidgin

Итак, для начала скажу что я меньше месяца в линуксе, и естественно, пока что ламер. Поэтому предоставляю не столько код, сколько идею.
Многие мои знакомые (да и я сам) недовольны странно реализованным способом поиска в истории по ключевым словам. Хочется чего-то более удобного.
Этот элементарнейший bash-скрипт позволяет нам автоматически проискать всю историю переписки с определенным человеком, сгенерировать на ее основе HTML документ содержащий строки с искомым ключевым словом и открыть его для просмотра. Я не хотел публиковать этот позор, но друзья сказали, что это очень удобная штука...
Пользуйтесь, делайте что хотите, изменяйте, улучшайте, доведите до ума, делайте из фекалий кондитерское изделие. :) Критика приветствуется, улучшения КРАЙНЕ приветствуются. Особая просьба пофиксить костыль в коде, он заметен. А все от незнания.

4.5
Ваша оценка: Ничего Рейтинг: 4.5 (2 голоса)
bliznezz аватар

timeout: запуск команды с таймаутом по истечении которого команде посылается сигнал

интересный и очень полезный скрипт нашел в документации к башу
запуск команды с таймаутом. по истечении которого команде посылается сигнал. например -9

$0 [-signal] [timeout] [:interval] [+delay] [--] <command>
 
SIG=-TERM       # default signal sent to the process when the timer expires
timeout=60      # default timeout
interval=15     # default interval between checks if the process is still alive
delay=2         # default delay between posting the given signal and
                # destroying the process (kill -KILL)
0
Ваша оценка: Ничего

редирект STDERR в пайп

В баше на первый взгляд нельзя отправить поток STDERR через пайп в другую программу. По крайней мере нельзя просто добавить '2' к операторам '|' и '>()'.

Но на самом деле это делается очень просто:

$ ./command 2>&1 >log_normal | tee log_errors | mail

Дело в том, что операторы редиректа обрабатываются с конца команды. Таким образом, в данном случае сначала stdout будет перенаправлен в файл log_normal, затем stderr будет скопирован в stdout.

Команда

$ ./command >log_normal 2>&1 | tee log_errors | mail

Запишет в log_normal сообщения и из stdout и из stderr, а в log_errors не попадет ничего.

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

PS
Подробнее здесь

2
Ваша оценка: Ничего Рейтинг: 2 (2 голоса)

Замер веса всех JPG в каталоге.

$ du -csh *.jpg | tail -1

(c) ramok

0
Ваша оценка: Ничего
ramok аватар

Ссылка: 10 трюков в командной строке, о которых вы не знали. Честное слово.

10 трюков в командной строке, о которых вы не знали. Честное слово.

Рекомендую так же почитать коментарии, так как в статье не всегда оптимально.

via nexus

5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)
ramok аватар

Очистка временых файлов в shell-скриптах

Допустим у вас есть shell-скрипт который создаёт временные файлы, именованые пайпы и прочие вещи которые необходимо очищать перед окончанием скрита.
Но если пользователь прервал работу вашего скрипта (например по ctrl-c), то в системе останется мусор.

Проблема решается регистрацией обработчика сигнала EXIT. Например

#!/bin/sh
 
TMPFILE=`mktemp`
trap "rm -f $TMPFILE; echo процедура очистки 1>&2" EXIT 
 
# ....

Когда скрипт закончится (не зависимо от того закончится он нормально или пользователь его прервёт), обработчик удалит временный файл и выведет отладочное сообщение.

Грубо говоря это аналог C-шной фунции atexit() или C++-шного деструктора класса (только для всего скрипта).

5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)
ia аватар

обработка аргументов с помощью getopts в конце строки

Бывает так, что нужно создать скрипт, при вызове которого дополнительные аргументы командной строки должны идти в конце. Например, чтобы

$ ./script action -o a -p -t argument

выполнял действие action, при этом обрабатывая аргументы -o -p -t, но при

$ ./script -o a -p -t action argument

выводил справку по использованию. (По такому принципу работает ряд утилит; в частности - многие распределённые системы контроля версий - git, mercurial, bazaar и т.п.)
Традиционно, для обработки аргументов используется утилита getopts; в Сети также можно без проблем найти множество примеров её использования.
Приблизительный пример же того, что нужно нам:

#!/bin/bash
#...
USAGE="script <action> <options> [file | directory]";
 
case "$1" in
	#обрабатываем действие, которое предусмотренно скриптом
	action1 | action2 ) action="$1" ;;
	#в противном случае выводим справку по использованию
5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)
ramok аватар

Защита от случайной перезаписи содержимого файла

Защита от случайной перезаписи содержимого файла.

Любой знающий основы шела знает как можно создать файл с помощью перенаправления ввода/вывода

$ echo какой то текст > test.txt
$ cat test.txt
какой то текст

Но если в файле test.txt был не пустой то содержимое файла перепишется, и восстановить его уже не удастся.
В bash от такого можно защитится с помощью установки опции set -o noclobber

$ set -o noclobber
$ echo другой текст > test.txt
bash: test.txt: не могу переписать уже существующий файл
$

Если вы знаете что делаете, и хотите переписать файл то можно или отменить эту опцию или воспользоваться специальной формой перенаправления >|

$ set +o noclobber
#или
$ echo тест >| test.txt

В zsh аналогичные опции выглядят так

$ setopt clobber
$ setopt noclobber

И кроме привычного >| есть другая форма >!

$ echo тест >! test.txt
$ echo тест >| test.txt
0
Ваша оценка: Ничего

Имена файлов в переменных баша

Возьмите себе за правило заключать значения переменных в которых храняться имена файлов или путей в кавычки. Таким образом будут поддерживаться пути и имена файлов в которых содержаться пробелы.

#!/bin/sh
for i in "$@"; do
    echo "$i"
done

то вывод у комманды

./script.sh my\ files/*

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

0
Ваша оценка: Ничего

bash reminders

я постоянно забываю как записывается в bash выражения типа : вырезать из переменной кусок строки до первого символа "такогото". поэтому пользуюсь sed, либо ищу в тырнете доку по этому поводу.

А тут наткнулся на свод всех правил в табличках. Так как я очень люблю такие таблички то и предсталяю их вам по линку.

5
Ваша оценка: Ничего Рейтинг: 5 (2 голоса)

создание собственных стартовый скриптов в debian

Для написания стартовых скриптов в debian по совету ramok можно использовать темплейт /etc/init.d/skeleton, предварительно прочитав /etc/init.d/README.
Не забываем указать запуск скрита с помощью update-rc.d

0
Ваша оценка: Ничего