Shell скрипты

Bourne shell (/bin/sh) присутствует во всех Unix системах, соответственно скрипты, написанные на этом языке, будут работать на любой Unix-машине. Для прочтения: man 1 sh. Незаменимая вещь при настройке и обслуживании сервера.

Основые понятия о shell скриптах

Переменные и аргументы командной строки

Присваивание значений переменным производится следующим образом: variable=value, получить присвоенное значение можно по ссылке $variable.

MESSAGE="Hello World"                        # Присвоить переменной строку "Hello World"
PI=3.1415                                    # Присвоить цифровое значение
N=8
TWON=`expr $N * 2`                           # Присвоить арифметическое выражение (только целые числа)
TWON=$(($N * 2))                             # Другой вариант
TWOPI=`echo "$PI * 2" | bc -l`               # Использование bc для операций с плавающей точкой
ZERO=`echo "c($PI/4)-sqrt(2)/2" | bc -l`

Аргументы командной строки:

$0, $1, $2, ...                              # $0 - сама команда(название скрипта) 
$#                                           # Кол-во аргументов командной строки
$*                                           # Все аргументы (аналог $@)

Специальные переменные

$$                                           # ID текущего процесса
$?                                           # Код возврата последней выполненной команды
  command
  if [ $? != 0 ]; then
    echo "command failed"
  fi
mypath=`pwd`
mypath=${mypath}/file.txt
echo ${mypath##*/}                           # Вывести только имя файла
echo ${mypath%%.*}                           # Полный путь без расширения
var2=${var:=string}                          # Если var назначена, использовать ее значение, иначе string
# значение string будет присвоено и var и var2.

Конструкции

for file in `ls`
do
    echo $file
done

count=0
while [ $count -lt 5 ]; do
    echo $count
    sleep 1
    count=$(($count + 1))
done

myfunction() {
    find . -type f -name "*.$1" -print       # $1 -первый аргумент функции
}
myfunction "txt"

Простенький скрипт генерирующий файл

MYHOME=/home/colin
cat > testhome.sh < < _EOF   # Все до символа _EOF, записывается в файл testhome.sh
if [ -d "$MYHOME" ] ; then
    echo $MYHOME exists
else
    echo $MYHOME does not exist
fi
_EOF
sh testhome.sh

Еще один пример скрипта на bourne shell

В данном примере, скрипт создает PDF буклет, из XHTML документа:

#!/bin/sh
# Данный скрипт создает книгу в формате PDF, для печати на принтере
if [ $# -ne 1 ]; then                        # Проверить аргумент
  echo 1>&2 "Usage: $0 HtmlFile"
  exit 1                                     # Выход с кодом больше нуля в случае ошибки
fi

file=$1                                      # Присвоить имя файла из агрумента
fname=${file%.*}                             # Взять только имя файла
fext=${file#*.}                              # Взять только расширение

prince $file -o $fname.pdf                   
pdftops -paper A4 -noshrink $fname.pdf $fname.ps # Создать postscript буклет
cat $fname.ps |psbook|psnup -Pa4 -2 |pstops -b "2:0,1U(21cm,29.7cm)" > $fname.book.ps

ps2pdf13 -sPAPERSIZE=a4 -sAutoRotatePages=None $fname.book.ps $fname.book.pdf
# В Windows используйте #a4 и #None !
exit 0                                       # Выход с кодом успешного завершения

awk

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

awk '{ print $2, $1 }' file                  # Вывести из файла 2 колонки, поменя из местами
awk '{printf("%5d : %s\n", NR,$0)}' file     # Форматирование вывода с номерами строк
awk '{print FNR "\t" $0}' files              # Несколько измененный вариант
awk NF test.txt                              # Удалить из вывода пустые строки (аналогично grep '.')
awk 'length > 80'                            # Напечатать строки, длинной более 80 символов

sed

Sed — это неинтерактивный строчный редактор, принимает текст с устройства stdin или из текстового файла, выполняет некоторые со строками и выводит в stdout или в файл. Часто применяется в конвейерной обработке данных совместно с другими командами.

sed 's/string1/string2/g'                    # Заменить string1 на string2
cat ./wrong.txt | sed 's/wrong/right/g' > ./right.txt              # Вывести содержимое файла, заменить слова и записать в другой файл
sed 's/\(.*\)1/\12/g'                        # Модифицировать "строку1" в "строку2"
sed '//,/< \/p>/d' t.xhtml                 # Удалить строки, начинающиеся с ⁢p>
                                             # И заканчивающиеся 
sed '/ *#/d; /^ *$/d'                        # Удалить комментарии и пустые строки
sed 's/[ \t]*$//'                            # Удалить символы табуляции
sed 's/^[ \t]*//;s/[ \t]*$//'                # Удалить пробелы в начале и конце
sed 's/[^*]/[&]/'                            # Заключить первый символ в квадратные скобки
sed = file | sed 'N;s/\n/\t/'                # Порядковый номер в каждой строке

regex — регулярные выражения

[\^$.|?*+()                          # Специальные символы, остальные символы означают самих себя
\                                    # Экранирует специальные символы
*                                    # Повтор 0 или 1 раз
.                                    # Любой символ, за исключением символа новой строки
.*                                   # Совпадает 0 или более символов
^                                    # Начало строки
$                                    # Конец строки
.$                                   # Совпадает с одним любым символ в конце строки
^ $                                  # Совпадает со строкой, состоящей из одного пробела
[^A-Z]                               # Любые символы, не входящие в диапазон от А до Z

Некоторые полезные команды

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

sort -t. -k1,1n -k2,2n -k3,3n -k4,4n         # Отсортировать IPv4 ip адреса
echo 'Test' | tr '[:lower:]' '[:upper:]'     # Смена регистра символов
echo foo.bar | cut -d . -f 1                 # Вернет foo
PID=$(ps | grep script.sh | grep bin | awk '{print $1}')    # PID запущенного скрипта
PID=$(ps axww | grep [p]ing | awk '{print $1}')             # PID процесса ping
IP=$(ifconfig $INTERFACE | sed '/.*inet addr:/!d;s///;s/ .*//')   # Linux
IP=$(ifconfig $INTERFACE | sed '/.*inet /!d;s///;s/ .*//')        # FreeBSD
if [ `diff file1 file2 | wc -l` != 0 ]; then [...] fi       # Файл изменен?
cat /etc/master.passwd | grep -v root | grep -v \*: | awk -F":" \ # Создание файла паролей http passwd
'{ printf("%s:%s\n", $1, $2) }' > /usr/local/etc/apache2/passwd

testuser=$(cat /usr/local/etc/apache2/passwd | grep -v \    # Проверить пользователя в passwd
root | grep -v \*: | awk -F":" '{ printf("%s\n", $1) }' | grep ^user$)
:(){ :|:& };:                                # bash fork bomb :). Убьет вашу машину ))
tail +2 file > file2                         # Удалить первую строку из файла

Я использую этот небольшой трюк, что-бы разом изменить расширение для кучи файлов, например с *.cxx на *.cpp. (советую для начала протемтировать данный пример, без | sh в конце строки.
Тоже самое можно смделать с помощью команды rename, если она присутствует, или с помошью встроенных средст оболочки.

# ls *.cxx | awk -F. '{print "mv "$0" "$1".cpp"}' | sh
# ls *.c | sed "s/.*/cp & &.$(date "+%Y%m%d")/" | sh # Копировать файлы *.c в *.c.20080401
# rename .cxx .cpp *.cxx                             # Переименовать все файлы .cxx в cpp
# for i in *.cxx; do mv $i ${i%%.cxx}.cpp; done      # Встроенными средствами

По материалам: vds-admin.ru

Рубрика: *Unix,*Linux, FreeBSD | 1 комментарий

Как запретить показ своего сайта во фреймах (frame и iframe)

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

Упрощенный пример кода злоумышленника, использующего ваш сайт, приведен ниже.

    


  

Your browser doesn\&#8217;t support frames

Есть несколько способов борьбы с встраиванием вашего сайта в чужой фрейм. Основные из них:

1) Проверка на Javascript

В head вашего документа вы можете вставить следующий код:

Он позволит выявить, загружается ли ваш документ во фрейме, если да – то загрузка останавливается соответствующей командой.

2) Отправка серверного заголовка, запрещающего браузеру показывать содержимое во фрейме

Для сервера Apache вы можете вставить в файл .htaccess следующий код:

Header always append X-Frame-Options DENY

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

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

Подробнее о данном методе — https://developer.mozilla.org/en-US/docs/The_X-FRAME-OPTIONS_response_header

Kodiua.ru • 7 месяцев назад

спасибо за статью. только я бы предложил модеренизировать код js
if (window.parent.frames.length > 0) {    window.stop();    window.parent.location = «http://АДРЕСС ВАШИЕГО ОРИГИНАЛЬНОГО САЙТА»;  }

так будет происходить сбор трафика и злоумышленники будут лишь помогать продвижению

По материалам: Блога Самарко

Рубрика: *Web | Оставить комментарий

Настройка NTP-сервера в FreeBSD

Network Time Protocol (NTP) — протокол предназначен для синхронизации системного времени через интернет. NTP использует для своей работы протокол UDP и порт 123. Я использую NTP-сервер для синхронизации времени на ПК в локальной сети.
Установку производим из портов:

[root@router /]#cd /usr/ports/net/ntp
[root@router /usr/ports/net/ntp]# make install clean

Теперь создадим конфиг. файл NTP-сервера:

[root@router /]#cat > /etc/ntp.conf

# Тут указываем NTP сервера с которых будем производить синхронизацию времени.
server 91.198.10.20 iburst prefer
server 213.179.228.1 iburst
server 82.207.71.6 iburst
server 193.193.193.107 iburst
# Путь, где находится drift-файл (файл в котором находиться информация о смещении времени).
driftfile /etc/ntp/drift
# Путь к логу NTP-сервера.
logfile /var/log/ntp.log
# Указываем кому мы разрешаем обновлять время с нашего сервера времени.
restrict default ignore
# Моя локалка.
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# Наш локалхост.
restrict localhost
# Разрешаем синхронизировать время с удаленными серверами, которые описаны выше в «server».
restrict 91.198.10.20
restrict 213.179.228.1
restrict 82.207.71.6
restrict 193.193.193.107

Создадим дрифт-файл:

[root@router /]#mkdir -p /etc/ntp/
[root@router /]#touch /etc/ntp/drift

Для автозапуска сервера, добавим строчки в /etc/rc.conf:

[root@router /]# cat >> /etc/rc.conf

ntpd_enable=»YES»
ntpd_program=»/usr/local/bin/ntpd»

Запускаем сам сервер:

[root@router /etc/rc.d]# ./ntpd start
Starting ntpd.
[root@router /etc/rc.d]#

Проверяем работоспособность:

[root@router /etc/rc.d]# sockstat | grep 123
root     ntpd       31191 20 udp4   *:123                 *:*
root     ntpd       31191 21 udp6   *:123                 *:*

Ждем 10мин. для того что бы наш сервер сам синхронизировался с внешними NTP-серверами. Пробуем синхронизировать время:

[root@router /etc/rc.d]# ntpdate -q 127.0.0.1
server 127.0.0.1, stratum 3, offset -0.000005, delay 0.02563
18 Nov 09:23:31 ntpdate[31213]: adjust time server 127.0.0.1 offset -0.000005 sec
[root@router /etc/rc.d]#

[root@router /etc/rc.d]# date
четверг, 18 ноября 2010 г. 09:23:47 (EET)

Работает. Happy
Работу серверов с которых мы синхронизируем время можно увидеть так:

[root@router /]#ntpq -p

remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*shkvoren.tntu.e 62.149.0.30      2 u    1   64  377   33.334    1.258  18.729
+zirka.vc.ukrtel 131.188.3.222    2 u   63   64  377   30.756    1.685   0.954
+eye.vc.ukrtel.n 192.53.103.104   2 u    3   64  377   31.044    1.214  17.546
-burka.carrier.k 195.2.64.5       2 u   63   64  377   92.962   -1.725  19.033

Не забываем открыть в фаерволе порт 123 наружу. )

unix.ck.ua

Рубрика: *Unix,*Linux, FreeBSD | Оставить комментарий

Работа с портами FreeBSD

Обновление портов

Обновление портов FreeBSD:

pkg_add -r cvsup-without-gui
cvsup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile
# для России можно выбрать русское зеркало:
cvsup -L 2 -h cvsup7.ru.FreeBSD.org /usr/share/examples/cvsup/ports-supfile
cd /usr/ports ; make index

Второй вариант:

portinstall cvsup-without-gui
cvsup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile
# для России можно выбрать русское зеркало:
cvsup -L 2 -h cvsup7.ru.FreeBSD.org /usr/share/examples/cvsup/ports-supfile
cd /usr/ports ; make index

Третий вариант:

cd /usr/ports/distfiles/
wget ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/Latest/cvsup-without-gui.tbz
pkg_add cvsup-without-gui.tbz
cvsup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile
cd /usr/ports ; make index

Четвёртый вариант. Автоматизация обновления.

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/portsnap.html

Пятый вариант:

# nano /etc/make.conf
SUP_UPDATE="true"
SUPHOST="cvsup7.ru.FreeBSD.org"
PORTSSUPFILE="/usr/share/examples/cvsup/ports-supfile"
# cd /usr/ports ; make update

Установка пакета из порта

# поиск порта по названию или части названия
cd /usr/ports ; make search name=имя порта
# поиск порта по слову из описания
cd /usr/ports ; make search key=ключевое слово
# установить утилиты для работы с портами
cd /usr/ports/ports-mgmt/portupgrade
make && make install
# установка порта
portinstall имя порта

Обновление портов

# перед обновлением хорошо бы проверить базу данных на ошибки...
pkgdb -Fa
# ...и на потерянные зависимости
pkgdb -L
# обновление порта
portupgrade имя порта
# переустановка порта
portupgrade -f имя порта
# или все вместе
portinstall portmanager
# portmanager -s #(посмотреть список обновлений)
portmanager -u #(обновить порты, пересобрать порты, зависящие от обновленных, etc.)
portmanager -slid --resume #(интерактивное удаление неиспользуемых портов после обновления)

По материалам: openwiki.ru

Рубрика: FreeBSD | Оставить комментарий

Для перезагрузки/выключения компьютера служит команда shutdown

Для перезагрузки/выключения компьютера служит команда shutdown

Использование: shutdown [-i | -l | -s | -r | -a] [-f] [-m <\\компьютер>] [-t xx] [-c «комментарий»] [-d up:xx:yy]

 

Ключи:

-? – вывод справки по использованию (либо без ключа)
-i – отображение графического интерфейса (при использовании этот ключ ставится впереди всех);
-l – выход из системы (несовместима с ключом –m);
-s – выключение компьютера;
-r – перезагрузка компьютера;
-a – отмена выполнения перезагрузки/выключения;
-m <\\компьютер> – применение операции к удаленному компьютеру с именем <компьютер>;
-t N – таймер выполнения операции в N секунд;
-c “комментарий” – комментарий к операции (при использовании в окне будет отображен «комментарий», в командной строке обязательно заключать его в двойные кавычки, комментарий не должен быть длиннее 127 знаков);
-f – принудительное завершение работы приложений без предварительного предупреждения;
-d [u] [p]:xx:yy – код причины;
     u – пользовательский код;
     p – запланированное завершение;
     xx – основной код причины (1-255);
     yy – дополнительный код причины (1-65535).


Примеры использования:
shutdown -r -t 20 -c “Перезагружаю компьютер через 20 сек.” –  перезагружает локальный компьютер с таймером на 20 секунд и выводом комментария;
shutdown -s -t 600  выключает локальный компьютер по истечении 600 секунд (10 минут);
shutdown -s -m \\user02 -t 20 -c “Закругляйся”  выключает удаленный компьютер user02 с таймером 20 секунд и комментарием;
shutdown -a  останавливает выполнения перезагрузки/выключения на локальном компьютере.

Примечания: команду shutdown может использовать только пользователь с правами администратора, обычный пользователь может использовать только ключ -l (выход из системы). Чтобы разрешить пользователям использовать остальные возможности команды shutdown, нужно воспользоваться оснасткой «Локальная политика безопасности» (..\WINDOWS\system32\secpol.msc). Перейдите в раздел Локальные политики -> Назначение прав пользователя -> Принудительное удаленное завершение и добавьте пользователя или группу пользователей, которым вы хотите дать разрешение.

Для удаленной перезагрузки/выключения сервера служит команда

tsshutdn

Использование: tsshutdn [T ] [/server:имя сервера] [/reboot] [/powerdown] [/delay: N ] [/v]

Параметры:

T – задает время (в секундах), которое должно пройти с момента уведомления всех пользователей до отключения их от сеансов (по умолчанию 60 секунд);
/server:имя сервера – задает имя сервера терминалов, который завершает работу (если имя сервера не задано, то работу завершит текущий сервер терминалов);
/reboot – перезагружает сервер терминалов после завершения всех пользовательских сеансов;
/powerdown – если компьютер поддерживает программное управление питанием от сети, то выключает питание сервера терминалов;
/delay:N – после выхода всех пользователей из сеансов задает время, которое должно пройти до остановки всех процессов и завершения работы сервера терминалов (по умолчанию 30 секунд);
/v – отображает сведения о выполненных действиях;
/? – отображает справку в командной строке.

Примеры использования:

tsshutdn 0 /powerdown /delay:0 – выключение компьютера, без задержки (таймаут — 0 сек.)

 

Примечания: команду tsshutdn может использовать только пользователь с правами администратора.

По материалам: pkremont.ru

Рубрика: *CentOS, *Unix,*Linux, *Windows, FreeBSD | Оставить комментарий