Настройка отправки почты в linux и отправка файлов во вложении

Устанавливаем ssmtp


sudo apt-get install ssmtp

теперь настраиваем утилиту на отправку и приводим конфиг /etc/ssmtp/ssmtp.conf к таком у виду:


#юзер, который получает почту
root=admin@sadminblog.ru
# MX сервер
mailhub=mail.infobox.ru
# username на сервере
AuthUser=admin@sadminblog.ru
#пароль на сервере :)
AuthPass=Gdyyw2%_$wZy*11HS
hostname=mail.infobox.ru
# Разрешаем указывать свое поле From
FromLineOverride=YES

Теперь открываем /etc/ssmtp/revaliases и пишем в нем:


# mail – юзер системный
# admin@sadminblog.ru исходящий адрес
# mail.infobox.ru почтовый сервер
mail:admin@sadminblog.ru:mail.infobox.ru

На этом настройка нашей маленькой замены для sendmail готова.

Ставим mpack


sudo apt-get install mpack

Ну и отправляем наш файл


mpack -s "Test file" testfile.zip test@sadminblog.ru

Собственно всё, теперь вы сможете легко настроить отправку писем.

Основные команды терминала Linux

Команды терминала Ubuntu Linux

Работа с файлами и директориями

КомандаОписание
cd /homeперейти в папку ‘/home’
cd ..перейти в папку уровнем выше
cd ../..перейти в папку двумя уровнями выше
cdперейти в домашнюю папку
cd ~userперейти в домашнюю папку пользователя user
cd -перейти в папку, в которой находились до перехода в текущую папку
pwdпоказать текущюю папку
lsотобразить содержимое текущей директории
ls -Fотобразить содержимое текущей директории с добавлением к именам символов, храктеризующих тип
ls -lпоказать детализированое представление файлов и директорий в текущей директории
ls -aпоказать скрытые файлы и директории в текущей директории
ls *[0-9]*показать файлы и директории содержащие в имени цифры
treeпоказать дерево файлов и директорий, начиная от корня (/)
lstreeПоказать содержимое папки в виде структуры дерева
mkdir dir1создать папку с именем dir1
mkdir dir1 dir2создать две директории dir1 и dir2 одновременно
mkdir -p /tmp/dir1/dir2создать дерево вложенных директорий
rm -f file1удалить файл с именем ‘file1’
rmdir dir1удалить папку с именем ‘dir1’
rm -rf dir1удалить папку с именем ‘dir1’ и рекурсивно всё её содержимое
rm -rf dir1 dir2удалить две директории и рекурсивно их содержимое
mv dir1 new_dirпереименовать или переместить файл или папку
cp file1 file2сопировать файл file1 в файл file2
cp dir/* .копировать все файлы директории dir в текущую папку
cp -a /tmp/dir1 .копировать папку dir1 со всем содержимым в текущую папку
cp -a dir1 dir2копировать папку dir1 в папку dir2
ln -s file1 lnk1создать символическую ссылку на файл или папку
ln file1 lnk1создать «жёсткую» (физическую) ссылку на файл или папку
touch -t 0712250000 fileditestмодифицировать дату и время создания файла, при его отсутствии, создать файл с указанными датой и временем
(YYMMDDhhmm)

Поиск файлов и поиск по содержимому файлов

КомандаОписание
find / -name file1найти файлы и директории с именем file1. Поиск начать с корня (/)
find / -user user1найти файл и директорию принадлежащие пользователю user1. Поиск начать с корня (/)
find /home/user1 -name "*.bin"Найти все файлы и директории, имена которых оканчиваются на ‘. bin’. Поиск начать с ‘/ home/user1’
find /usr/bin -type f -atime +100найти все файлы в ‘/usr/bin’, время последнего обращения к которым более 100 дней
find /usr/bin -type f -mtime -10найти все файлы в ‘/usr/bin’, созданные или изменённые в течении последних 10 дней
find / -name *.rpm -exec chmod 755 '{}' \;найти все фалы и директории, имена которых оканчиваются на ‘.rpm’, и изменить права доступа к ним
find / -xdev -name "*.rpm"найти все фалы и директории, имена которых оканчиваются на ‘.rpm’, игнорируя съёмные носители, такие как
cdrom,
floppy и т.п.
locate "*.ps"найти все файлы, содержащие в имени ‘.ps’. Предварительно рекомендуется выполнить команду ‘updatedb’
whereis haltпоказывает размещение бинарных файлов, исходных кодов и руководств, относящихся к файлу ‘halt’
which haltотображает полный путь к файлу ‘halt’

Архивирование и сжатие файлов

КомандаОписание
bunzip2 file1.bz2разжимает файл ‘file1.gz’
gunzip file1.gz
gzip file1сжимает файл ‘file1’
bzip2 file1
gzip -9 file1сжать файл file1 с максимальным сжатием
rar a file1.rar test_fileсоздать rar-архив ‘file1.rar’ и включить в него файл test_file
rar a file1.rar file1 file2 dir1создать rar-архив ‘file1.rar’ и включить в него file1, file2 и dir1
rar x file1.rarраспаковать rar-архив
unrar x file1.rar
tar -cvf archive.tar file1создать tar-архив archive.tar, содержащий файл file1
tar -cvf archive.tar file1 file2 dir1создать tar-архив archive.tar, содержащий файл file1, file2 и dir1
tar -tf archive.tarпоказать содержимое архива
tar -xvf archive.tarраспаковать архив
tar -xvf archive.tar -C /tmpраспаковать архив в /tmp
tar -cvfj archive.tar.bz2 dir1создать архив и сжать его с помощью bzip2(Прим.переводчика. ключ -j работает не во всех *nix
системах)
tar -xvfj archive.tar.bz2разжать архив и распаковать его(Прим.переводчика. ключ -j работает не во всех *nix системах)
tar -cvfz archive.tar.gz dir1создать архив и сжать его с помощью gzip
tar -xvfz archive.tar.gzразжать архив и распаковать его
zip file1.zip file1создать сжатый zip-архив
zip -r file1.zip file1 file2 dir1создать сжатый zip-архив и со включением в него нескольких файлов и/или директорий
unzip file1.zipразжать и распаковать zip-архив

Работа с пакетами в Debian и Ubuntu

КомандаОписание
dpkg -i package.debустановить / обновить пакет
dpkg -r package_nameудалить пакет из системы
dpkg -lпоказать все пакеты, установленные в систему
dpkg -l | grep httpdсреди всех пакетов, установленных в системе, найти пакет содержащий в своём имени «httpd»
dpkg -s package_nameотобразить инфрмацию о конкретном пакете
dpkg -L package_nameвывести список файлов, входящих в пакет, установленный в систему
dpkg --contents package.debотобразить список файлов, входящих в пакет, который ешё не установлен в систему
dpkg -S /bin/pingнайти пакет, в который входит указанный файл.

APT — средство управления пакетами в Debian и Ubuntu

КомандаОписание
apt-get install package_nameустановить / обновить пакет
apt-cdrom install package_nameустановить / обновить пакет с cdrom’а
apt-get updateполучить обновлённые списки пакетов
apt-get upgradeобновить пакеты, установленные в систему
apt-get remove package_nameудалить пакет, установленный в систему с сохранением файлов конфигурации
apt-get purge package_nameудалить пакет, установленный в систему с удалением файлов конфигурации
apt-get checkпроверить целостность зависимостей
apt-get cleanудалить загруженные архивные файлы пакетов
apt-get autocleanудалить старые загруженные архивные файлы пакетов

Просмотр содержимого файлов

КомандаОписание
cat file1вывести содержимое файла file1 в консоли
tac file1вывести содержимое файла file1 в консоли в обратном порядке (последняя строка
становиться
первой и т.д.)
more file1постраничный вывод содержимого файла file1 в консоли
less file1постраничный вывод содержимого файла file1 в консоли, но с возможностью пролистывания в
обе стороны (вверх-вниз), поиска по содержимому и т.п.
head -2 file1вывести первые две строки файла file1 в консоли. По-умолчанию выводится десять строк
tail -2 file1вывести последние две строки файла file1 в консоли. По-умолчанию выводится десять строк
tail -f /var/log/messagesвыводить содержимое файла /var/log/messages в консоли по мере появления в нём текста.

Манипуляции с текстом и содержимым файлов

КомандаОписание
cat file_originale | [operation: sed, grep, awk, grep и т.п.] > result.txtобщий синтаксис выполнения действий по обработке содержимого файла и вывода результата в новый
cat file_originale | [operazione: sed, grep, awk, grepи т.п.] >> result.txtобщий синтаксис выполнения действий по обработке содержимого файла и вывода результата в существующий файл. Если файл не существует, он будет создан
grep Aug /var/log/messagesиз файла ‘/var/log/messages’ отобрать и вывести в консоли строки, содержащие «Aug»
grep ^Aug /var/log/messagesиз файла ‘/var/log/messages’ отобрать и вывести в консоли строки, начинающиеся на «Aug»
grep [0-9] /var/log/messagesиз файла ‘/var/log/messages’ отобрать и вывести в консоли строки, содержащие цифры
grep Aug -R /var/log/*отобрать и вывести в консоли строки, содержащие «Aug», во всех файлах, находящихся в директории /var/log и ниже
sed 's/stringa1/stringa2/g' example.txtв файле example.txt заменить «string1» на «string2», результат вывести в консоли.
sed '/^$/d' example.txtудалить пустые строки из файла example.txt
sed '/ *#/d; /^$/d' example.txtудалить пустые строки и комментарии из файла example.txt
echo 'esempio' | tr '[:lower:]' '[:upper:]'преобразовать символы из нижнего регистра в верхний
sed -e '1d' result.txtудалить первую строку из файла example.txt
sed -n '/string1/p'отобразить только строки содержашие «string1»
sed -e 's/ *$//' example.txtудалить пустые символы в в конце каждой строки
sed -e 's/string1//g' example.txtудалить строку «string1» из текста не изменяя всего остального
sed -n '1,8p;5q' example.txtвзять из файла с первой по восьмую строки и из них вывести первые пять
sed -n '5p;5q' example.txtвывести пятую строку
sed -e 's/0*/0/g' example.txtзаменить последовательность из любого количества нулей одним нулём
cat -n file1пронумеровать строки при выводе содержимого файла
cat example.txt | awk 'NR%2==1'при выводе содержимого файла, не выводить чётные строки файла
echo a b c | awk '{print $1}'вывести первую колонку. Разделение, по-умолчанию, по проблелу/пробелам или символу/символам табуляции
echo a b c | awk '{print $1,$3}'вывести первую и треью колонки. Разделение, по-умолчанию, по проблелу/пробелам или символу/символам табуляции
paste file1 file2объединить содержимое file1 и file2 в виде таблицы: строка 1 из file1 = строка 1 колонка 1-n, строка 1 из file2 = строка 1 колонка n+1-m
paste -d '+' file1 file2объединить содержимое file1 и file2 в виде таблицы с разделителем «+»
sort file1 file2отсортировать содержимое двух файлов
sort file1 file2 | uniqотсортировать содержимое двух файлов, не отображая повторов
sort file1 file2 | uniq -uотсортировать содержимое двух файлов, отображая только уникальные строки (строки, встречающиеся в обоих
файлах,
не выводятся в консоли)
sort file1 file2 | uniq -dотсортировать содержимое двух файлов, отображая только повторяющиеся строки
comm -1 file1 file2сравнить содержимое двух файлов, не отображая строки принадлежащие файлу ‘file1’
comm -2 file1 file2сравнить содержимое двух файлов, не отображая строки принадлежащие файлу ‘file2’
comm -3 file1 file2сравнить содержимое двух файлов, удаляя строки встречающиеся в обоих файлах

Преобразование наборов символов и файловых форматов

КомандаОписание
dos2unix filedos.txt fileunix.txtконвертировать файл текстового формата из MSDOS в UNIX (разница в символах возврата каретки)
unix2dos fileunix.txt filedos.txtконвертировать файл текстового формата из UNIX в MSDOS (разница в символах возврата коретки)
recode ..HTML < page.txt > page.htmlконвертировать содержимое тестового файла page.txt в html-файл page.html
recode -l | moreвывести список доступных форматов

Проверка целостности дисков и файловых систем

КомандаОписание
badblocks -v /dev/hda1проверить раздел hda1 на наличие bad-блоков
fsck /dev/hda1проверить/восстановить целостность linux-файловой системы раздела hda1
fsck.ext2 /dev/hda1проверить/восстановить целостность файловой системы ext2 раздела hda1
e2fsck /dev/hda1
e2fsck -j /dev/hda1проверить/восстановить целостность файловой системы ext3 раздела hda1 с указанием, что журнал расположен там
же
fsck.ext3 /dev/hda1проверить/восстановить целостность файловой системы ext3 раздела hda1
fsck.vfat /dev/hda1проверить/восстановить целостность файловой системы fat раздела hda11
fsck.msdos /dev/hda1
dosfsck /dev/hda1

Форматирование дисков и файловых систем

КомандаОписание
mkfs /dev/hda1создать linux-файловую систему на разделе hda1
mke2fs /dev/hda1создать файловую систему ext2 на разделе hda1
mke2fs -j /dev/hda1создать журналирующую файловую систему ext3 на разделе hda1
mkfs -t vfat 32 -F /dev/hda1создать файловую систему FAT32 на разделе hda1
fdformat -n /dev/fd0форматирование флоппи-диска без проверки
mkswap /dev/hda3создание swap-пространства на разделе hda3

Работа с дисками подкачки (swap)

КомандаОписание
mkswap /dev/hda3создание swap-пространства на разделе hda3
swapon /dev/hda3активировать swap-пространство, расположенное на разделе hda3
swapon /dev/hda2 /dev/hdb3активировать swap-пространства, расположенные на разделах hda2 и hdb3

Создание резервных копий (backup)

КомандаОписание
dump -0aj -f /tmp/home0.bak /homeсоздать полную резервную копию директории /home в файл /tmp/home0.bak
dump -1aj -f /tmp/home0.bak /homeсоздать инкрементальную резервную копию директории /home в файл /tmp/home0.bak
restore -if /tmp/home0.bakвосстановить из резервной копии /tmp/home0.bak
rsync -rogpav --delete /home /tmpсинхронизировать /tmp с /home
rsync -rogpav -e ssh --delete /home ip_address:/tmpсинхронизировать через SSH-туннель
rsync -az -e ssh --delete ip_addr:/home/public /home/localсинхронизировать локальную директорию с удалённой директорией через ssh-туннель со сжатием
rsync -az -e ssh --delete /home/local ip_addr:/home/publicсинхронизировать удалённую директорию с локальной директорией через ssh-туннель со сжатием
dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz'сделать «слепок» локального диска в файл на удалённом компьютере через ssh-туннель
tar -Puf backup.tar /home/userсоздать инкрементальную резервную копию директории ‘/home/user’ в файл backup.tar с сохранением полномочий
( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p'копирование содержимого /tmp/local на удалённый компьютер через ssh-туннель в /home/share/
( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p'копирование содержимого /home на удалённый компьютер через ssh-туннель в /home/backup-home
tar cf - . | (cd /tmp/backup ; tar xf - )копирование одной директории в другую с сохранением полномочий и линков
find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parentsпоиск в /home/user1 всех файлов, имена которых оканчиваются на ‘.txt’, и копирование их в другую директорию
find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2поиск в /var/log всех файлов, имена которых оканчиваются на ‘.log’, и создание bzip-архива из них
dd if=/dev/hda of=/dev/fd0 bs=512 count=1создать копию MBR (Master Boot Record) с /dev/hda на флоппи-диск
dd if=/dev/fd0 of=/dev/hda bs=512 count=1восстановить MBR с флоппи-диска на /dev/hda

Работа с лазерными дисками (CDROM)

КомандаОписание
cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -forceclean a rewritable cdrom
mkisofs /dev/cdrom > cd.isocreate an iso image of cdrom on disk
mkisofs /dev/cdrom | gzip > cd_iso.gzcreate a compressed iso image of cdrom on disk
mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cdcreate an iso image of a directory
cdrecord -v dev=/dev/cdrom cd.isoburn an ISO image
gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom -burn a compressed ISO image
mount -o loop cd.iso /mnt/isomount an ISO image
cd-paranoia -Brip audio tracks from a CD to wav files
cd-paranoia -- "-3"rip first three audio tracks from a CD to wav files
cdrecord --scanbusscan bus to identify the channel scsi

Сеть и сетевые устройства (LAN, WLAN, WiFi)

КомандаОписание
ifconfig eth0показать конфигурацию сетевого интерфейса eth0
ifup eth0активировать (поднять) интерфейс eth0
ifdown eth0деактивировать (опустить) интерфейс eth0
ifconfig eth0 192.168.1.1 netmask 255.255.255.0выставить интерфейсу eth0 ip-адрес и маску подсети
ifconfig eth0 promiscперевести интерфейс eth0 в promiscuous-режим для «отлова» пакетов (sniffing)
ifconfig eth0 -promiscотключить promiscuous-режим на интерфейсе eth0
dhclient eth0активировать интерфейс eth0 в dhcp-режиме.
route -nвывести локальную таблицу маршрутизации
netstat -rn
route add -net 0/0 gw IP_Gatewayзадать ip-адрес шлюза по умолчанию (default gateway)
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1добавить статический маршрут в сеть 192.168.0.0/16 через шлюз с ip-адресом 192.168.1.1
route del 0/0 gw IP_gatewayудалить ip-адрес шлюза по умолчанию (default gateway)
echo "1" > /proc/sys/net/ipv4/ip_forwardразрешить пересылку пакетов (forwarding)
hostnameотобразить имя компьютера
host sadminblog.ruразрешить имя sadminblog.ru хоста в ip-адрес и наоборот
host 62.149.140.85
ip link showотобразить состояние всех интерфейсов
mii-tool eth0отобразить статус и тип соединения для интерфейса eth0
ethtool eth0отображает статистику интерфеса eth0 с выводом такой информации, как поддерживаемые и текущие режимы
соединения
netstat -tupnотображает все установленные сетевые соединения по протоколам TCP и UDP без разрешения имён в ip-адреса и
PID’ы
и имена процессов, обеспечивающих эти соединения
netstat -tuplnотображает все сетевые соединения по протоколам TCP и UDP без разрешения имён в ip-адреса и PID’ы и имена
процессов, слушающих порты
tcpdump tcp port 80отобразить весь трафик на TCP-порт 80 (обычно — HTTP)
iwlist scanпросканировать эфир на предмет, доступности беспроводных точек доступа
iwconfig eth1показать конфигурацию беспроводного сетевого интерфейса eth1

Microsoft Windows Networks (SAMBA)

КомандаОписание
nbtscan ip_addrразрешить netbios-имя
nbtscan не во всех системах ставится по-умолчанию, возможно, придётся доустанавливать вручную. nmblookup
включен в пакет samba.
nmblookup -A ip_addr
smbclient -L ip_addr/hostnameотобразить ресурсы, предоставленные в общий доступ на windows-машине
smbget -Rr smb://ip_addr/shareподобно wget может получить файлы с windows-машин через smb-протокол
mount -t smbfs -o username=user,password=pass //winclient/share /mnt/shareсмонтировать smb-ресурс, предоставленный на windows-машине, в локальную файловую систему

IPTABLES (firewall)

КомандаОписание
iptables -t filter -nLотобразить все цепочки правил
iptables -nL
iptables -t nat -Lотобразить все цепочки правил в NAT-таблице
iptables -t filter -Fочистить все цепочки правил в filter-таблице
iptables -F
iptables -t nat -Fочистить все цепочки правил в NAT-таблице
iptables -t filter -Xудалить все пользовательские цепочки правил в filter-таблице
iptables -t filter -A INPUT -p tcp --dport telnet -j ACCEPTпозволить входящее подключение telnet’ом
iptables -t filter -A OUTPUT -p tcp --dport http -j DROPблокировать исходящие HTTP-соединения
iptables -t filter -A FORWARD -p tcp --dport pop3 -j ACCEPTпозволить «прокидывать» (forward) POP3-соединения
iptables -t filter -A INPUT -j LOG --log-prefix "DROP INPUT"включить журналирование ядром пакетов, проходящих через цепочку INPUT, и добавлением к сообщению префикса
«DROP
INPUT»
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEвключить NAT (Network Address Translate) исходящих пакетов на интерфейс eth0. Допустимо при использовании с
динамически выделяемыми ip-адресами.
iptables -t nat -A PREROUTING -d 192.168.0.1 -p tcp -m tcp --dport 22 -j DNAT --to-destination
10.0.0.2:22
перенаправление пакетов, адресованных одному хосту, на другой хост

Работа с запущенными процессами. Мониторинг системы и отладка

КомандаОписание
topотобразить запущенные процессы, используемые ими ресурсы и другую полезную информацию (с автоматическим
обновлением данных)
ps -eafwотобразить запущенные процессы, используемые ими ресурсы и другую полезную информацию (единожды)
ps -e -o pid,args --forestвывести PID’ы и процессы в виде дерева
pstreeотобразить дерево процессов
kill -9 98989«убить» процесс с PID 98989 «на смерть» (без соблюдения целостности данных)
kill -KILL 98989
kill -TERM 98989Корректно завершить процесс с PID 98989
kill -1 98989заставить процесс с PID 98989 перепрочитать файл конфигурации
kill -HUP 98989
lsof -p 98989отобразить список файлов, открытых процессом с PID 98989
lsof /home/user1отобразить список открытых файлов из директории /home/user1
strace -c ls >/dev/nullвывести список системных вызовов, созданных и полученных процессом ls
strace -f -e open ls >/dev/nullвывести вызовы бибилотек
watch -n1 'cat /proc/interrupts'отображать прерывания в режиме реального времени
last rebootотобразить историю перезагрузок системы
last user1отобразить историю регистрации пользователя user1 в системе и время его нахождения в ней
lsmodвывести загруженные модули ядра
free -mпоказать состояние оперативной памяти в мегабайтах
smartctl -A /dev/hdaконтроль состояния жёсткого диска /dev/hda через SMART
smartctl -i /dev/hdaпроверить доступность SMART на жёстком диске /dev/hda
tail /var/log/dmesgвывести десять последних записей из журнала загрузки ядра
tail /var/log/messagesвывести десять последних записей из системного журнала

Монтирование устройств и файловых систем

КомандаОписание
mount /dev/hda2 /mnt/hda2монтирует раздел ‘hda2’ в точку монтирования ‘/mnt/hda2’. Убедитесь в наличии директории-точки монтирования
‘/mnt/hda2’
umount /dev/hda2размонтирует раздел ‘hda2’. Перед выполнением, покиньте ‘/mnt/hda2’
fuser -km /mnt/hda2принудительное размонтирование раздела. Применяется в случае, когда раздел занят каким-либо пользователем
umount -n /mnt/hda2выполнить размонитрование без занесения информации в /etc/mtab. Полезно когда файл имеет атрибуты «только
чтение» или недостаточно места на диске
mount /dev/fd0 /mnt/floppyмонтировать флоппи-диск
mount /dev/cdrom /mnt/cdromмонтировать CD или DVD
mount /dev/hdc /mnt/cdrecorderмонтировать CD-R/CD-RW или DVD-R/DVD-RW(+-)
mount -o loop file.iso /mnt/cdromсмонтировать ISO-образ
mount -t vfat /dev/hda5 /mnt/hda5монтировать файловую систему Windows FAT32
mount -t smbfs -o username=user,password=pass //winclient/share /mnt/shareмонтировать сетевую файловую систему Windows (SMB/CIFS)
mount -o bind /home/user/prg /var/ftp/user«монтирует» директорию в директорию (binding). Доступна с версии ядра 2.4.0. Полезна, например, для
предоставления содержимого пользовательской директории через ftp при работе ftp-сервера в «песочнице» (chroot),
когда симлинки сделать невозможно.
Выполнение данной команды сделает копию содержимого /home/user/prg в /var/ftp/user

Информация о диске: дисковое пространство

КомандаОписание
df -hотображает информацию о смонтированных разделах с отображением общего, доступного и используемого пространства
(Прим.переводчика. ключ -h работает не во всех *nix системах)
ls -lSr |moreвыдаёт список файлов и директорий рекурсивно с сортировкой по возрастанию размера и позволяет осуществлять
постраничный просмотр
du -sh dir1подсчитывает и выводит размер, занимаемый директорией ‘dir1’
(Прим.переводчика. ключ -h работает не во всех *nix системах)
du -sk * | sort -rnотображает размер и имена файлов и директорий, с соритровкой по размеру
rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1nпоказывает размер используемого дискового пространства, занимаемое файлами rpm-пакета, с сортировкой по
размеру
(fedora, redhat и т.п.)
dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1nпоказывает размер используемого дискового пространства, занимаемое файлами deb-пакета, с сортировкой по
размеру
(ubuntu, debian т.п.)

Пользователи и группы

КомандаОписание
groupadd group_nameсоздать новую группу с именем group_name
groupdel group_nameудалить группу group_name
groupmod -n new_group_name old_group_nameпереименовать группу old_group_name в new_group_name
useradd -c "Nome Cognome" -g admin -d /home/user1 -s /bin/bash user1создать пользователя user1, назначить ему в качестве домашнего каталога /home/user1, в качестве shell’а
/bin/bash, включить его в группу admin и добавить комментарий Nome Cognome
useradd user1создать пользователя user1
userdel -r user1удалить пользователя user1 и его домашний каталог
usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1изменить атрибуты пользователя
passwdсменить пароль
passwd user1сменить пароль пользователя user1 (только root)
chage -E 2005-12-31 user1установить дату окончания действия учётной записи пользователя user1
pwckпроверить корректность системных файлов учётных записей. Проверяются файлы /etc/passwd и /etc/shadow
grpckпроверяет корректность системных файлов учётных записей. Проверяется файл/etc/group
newgrp [-] group_nameизменяет первичную группу текущего пользователя. Если указать «-«, ситуация будет идентичной той, в которой
пользователь вышил из системы и снова вошёл. Если не указывать группу, первичная группа будет назначена из
/etc/passwd

Выставление/изменение прав на просмотр и редактирование файлов

КомандаОписание
ls -lhпросмотр полномочий на файлы и директории в текущей директории
ls /tmp | pr -T5 -W$COLUMNSвывести содержимое директории /tmp и разделить вывод на пять колонок
chmod ugo+rwx directory1добавить полномочия на директорию directory1 ugo(User Group Other)+rwx(Read Write eXecute) — всем полные
права.
Аналогичное можно сделать таким образом
chmod 777 directory1
chmod go-rwx directory1отобрать у группы и всех остальных все полномочия на директорию directory1.
chown user1 file1назначить владельцем файла file1 пользователя user1
chown -R user1 directory1назначить рекурсивно владельцем директории directory1 пользователя user1
chgrp group1 file1сменить группу-владельца файла file1 на group1
chown user1:group1 file1сменить владельца и группу владельца файла file1
find / -perm -u+sнайти, начиная от корня, все файлы с выставленным SUID
chmod u+s /bin/binary_fileназначить SUID-бит файлу /bin/binary_file. Это даёт возможность любому пользователю запускать на выполнение
файл
с полномочиями владельца файла.
chmod u-s /bin/binary_fileснять SUID-бит с файла /bin/binary_file.
chmod g+s /home/publicназначить SGID-бит директории /home/public.
chmod g-s /home/publicснять SGID-бит с директории /home/public.
chmod o+t /home/publicназначить STIKY-бит директории /home/public. Позволяет удалять файлы только владельцам
chmod o-t /home/publicснять STIKY-бит с директории /home/public

Специальные атрибуты файлов

КомандаОписание
chattr +a file1позволить открывать файл на запись только в режиме добавления
chattr +c file1позволяет ядру автоматически сжимать/разжимать содержимое файла.
chattr +d file1указавет утилите dump игнорировать данный файл во время выполнения backup’а
chattr +i file1делает файл недоступным для любых изменений: редактирование, удаление, перемещение, создание линков на него.
chattr +s file1позволяет сделать удаление файла безопасным, т.е. выставленный атрибут s говорит о том, что при удалении файла, место, занимаемое файлом на диске заполняется нулями, что предотвращяет возможность восстановления данных.
chattr +S file1указывает, что, при сохранении изменений, будет произведена синхронизация, как при выполнении команды sync
chattr +u file1данный атрибут указывает, что при удалении файла содержимое его будет сохранено и при необходимости пользователь сможет его восстановить
lsattrпоказать атрибуты файлов

Другие полезные команды

КомандаОписание
apropos
…keyword
выводит список комманд, которые так или иначе относятся к ключевым словам. Полезно, когда вы знаете что делает программа, но не помните команду
man pingвызов руководства по работе с программой, в данном случае ping
whatis
…keyword
отображает описание действий указанной программы
mkbootdisk --device /dev/fd0 `uname -r`создаёт загрузочный флоппи-диск
gpg -c file1шифрует файл file1 с помощью GNU Privacy Guard
gpg file1.gpgдешифрует файл file1 с помощью GNU Privacy Guard
wget -r http://sadminblog.ruзагружает рекурсивно содержимое сайта http://sadminblog.ru
wget -c http://sadminblog.ru/file.isoзагрузить файл http://sadminblog.ru/file.iso с возможностью останова и продолжения в последствии
echo 'wget -c http://sadminblog.ru/files.iso' | at 09:00начать закачку в указанное время
ldd /usr/bin/sshвывести список библиотек, необходимых для работы ssh
alias hh='history'назначить алиас hh команде history

Настраиваем gearman с хранением очередей в postgres

Настраиваем gearman с хранением очередей в postgres

Для начало добавим в список источников /etc/apt/sources.list :


deb http://ppa.launchpad.net/gearman-developers/ppa/ubuntu raring main

Затем ключ репозитория:


sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys NUMBER

NUMBER – можно посмотреть запусти apt-get update, при попытке обновить система укажит, что данный ключ не указан и его надо будет добавить, вместо NUMBER

Теперь ставим сам gearman :


sudo apt-get install gearman-job-server libgearman6 libgearman-dev gearman-tools

Далее настроим сервер, открываем /etc/default/gearman-job-server и приводим к следующему виду :


export PGHOST=localhost
export PGPORT=5432
export PGUSER=gearman
export PGPASSWORD=123456
export PGDATABASE=gearman
PARAMS= -q Postgres --libpq-table=gearmanqueue

—libpq-table – имя созданной таблице в БД postgres

Теперь в БД создадим таблицу, у меня размер unique_key = 32, так как я использую библиотеку php net_gearman и там для задания unique_key это md5 названия функции и массива параметров, если используете другую библиотеку, то значение может быть иным


CREATE TABLE gearmanqueue ( unique_key VARCHAR(32),
                       function_name VARCHAR(255),
                       priority INTEGER,
                       data BYTEA,
                       when_to_run INTEGER,
                       UNIQUE (unique_key, function_name));

Теперь запускаем сервер


/etc/init.d/gearman-job-server restart

По работе с остальными БД, можно посмотреть на сайте http://gearman.info

Копирование исходящий почты в exim

Так как exim настрое на работу с mysql, то в нем и создадим таблицу с адресами, которые нужно копировать.

И так заходим в БД и создаем таблицу:


CREATE TABLE IF NOT EXISTS `mail_copy` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mail` varchar(255) NOT NULL,
  `status` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Сразу же добавляем в таблицу адреса для копирования
Добавляем адрес:


insert into `mail_copy`(`mail`,`status`) values(`test@test.ru’,1);

Открываем конфигурационный файл Exim exim.cnf
В раздел конфигурации добавляем строчку:


system_filter = /etc/exim/copy_mail.conf

Создаем файл /etc/exim/copy_mail.conf и пишем в нем:


if $sender_address is ${lookup mysql{SELECT `mail` FROM `mail_copy` WHERE `mail`='$sender_address' AND `status`='1' LIMIT 1}}
then
        unseen deliver copy@test.ru
endif

И перезагружаем exim, теперь вся почта, которая указана в таблице mail_copy будет копироваться на указанный адрес unseen deliver copy@test.ru

Устанавливаем логотип на cisco ip phone SPA303

Открываем любой графический редактор и создаем в нем изображение размером 128х48 и рисуем логотип

Рисуем

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

Сохраняем

Теперь закачиваем картинку на любой http сервер, лучше локальный. И в конфигурационном файле, у меня он раздается по tftp, добавляем следующие параметры


http://192.168.1.1/img3.bmp
BMP Picture
BMP Picture

Все теперь как только обновится конфиг на вашем устройстве, сразу же появится логотип компании.

GLPI и FusionInventory: Проводим инвентаризацию компании.

https://www.youtube.com/watch?v=FlSjJZmDEUY

UPDATED 2017. Инструкция в пяти шагах для Debian Stretch / Ubuntu 16.04

1. Устанавливаем зависимости:

sudo apt-get -y install dmidecode hwdata ucf hdparm
    perl libuniversal-require-perl libwww-perl libparse-edid-perl libproc-daemon-perl
    libproc-pid-file-perl libfile-which-perl libxml-treepp-perl libyaml-perl
    libnet-cups-perl libnet-ip-perl libdigest-sha-perl libsocket-getaddrinfo-perl

2. Скачиваем Fusion Inventory Agent с официального сайта проекта http://debian.fusioninventory.org/downloads/
Нас интересует файл fusioninventory-agent_X.X.XX-X_all.deb, на момент исправления статьи это http://debian.fusioninventory.org/downloads/fusioninventory-agent_2.3.21-2_all.deb

И устанавливаем его:

sudo dpkg -i fusioninventory-agent_2.3.21-2_all.deb

Скачиваем последнюю версию GLPI + FusionInventory с github: https://github.com/fusioninventory/fusioninventory-for-glpi/releases/latest

Далее версия 2015 года.

Для начала установим веб сервер с php

sudo apt-get install apache2 libapache2-mod-php5

теперь ставим mysql

sudo apt-get install mysql-server

указываем наш пароль для root в настройках mysql

Установка glpi, настройка mysql

Теперь установим саму glpi

sudo apt-get install glpi

Можем произвести настройку базы данных из установщика, для этого соглашаемся на настройку БД

glpi

И вводим пароль, который мы ввели на этапе установки mysql

glpi

Установка завершена, теперь заходим в нашу систему
http://ip-вашего-сервера/glpi/

вход

Вводим
логин: glpi
пароль: glpi

Смторим, что все у нас работает и приступаем к установке плагина fusioninventory

sudo apt-get install fusioninventory-for-glpi

Теперь заходим в glpi , там идем в меню Настройки->Дополнения и включаем все плагины fusioninventory

включения

Теперь качаем агента для клиентских машин на платформе Windows
Заходим http://www.fusioninventory.org/get/
и выбираем нужного нам клиента, я скачал http://prebuilt.fusioninventory.org/stable/windows-i386/fusioninventory-agent_windows-i386_2.2.6-1.exe

и ставим его на Windows машину, в поле Servers addresses указываем наш путь к нашему серверу и добавляем к нему путь к плагину glpi/plugins/fusioninventory

Установка

Так же ставим галочку Run agent.. для запуска после установки. Далее выбираем тип запуска, есть 3 типа:

1) Запуск как сервис
2) Запуск через планировщик задач
3) Запуск вручную

Для Windows XP выбирайте 2 пункт, для версий старше 1.

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

Настройка

Все установка закончена, теперь заходим в glpi там в меню Дополнения ->FusionInventory и выбираем пункт Управления агентами

Просмотр

Тут у нас должны появится те ПК, на которых мы поставили нашего агента, теперь идем в меню Оборудование->Компьютеры и тут видим всю информацию о тех ПК которые мы подключили к системе.

Список

На этом настройка завершена, теперь можно строить отчеты по ПК и отслеживать изменения в реальном времени.

USBIP пробос usb устройства по сети или в виртуальную машину

Для начала ставим сам пакет:


sudo apt-get install usbip

Теперь загружаем необходимые модули для работы


sudo  modprobe usbip
sudo  modprobe usbip_common_mod

И запускаем демона


sudo usbipd –D

подключаем наш usb и ищем его с помощью lsusb
Bus 001 Device 003: ID 03f0:4117 Hewlett-Packard LaserJet 1018
И так мы наши наш длевайс, запоминаем его ID

Теперь ищем наше устройства в списках usbip


sudo usbip_bind_driver –list

Вот оно:
busid 1-1.3 ( 03f0:4117 )
1-1.3:1.0 -> usblp

Подключаем его


sudo usbip_bind_driver --usbip 1-1.3

Видим
** (process:6383): DEBUG: 1-1.3:1.0 -> usblp
** (process:6383): DEBUG: unbinding interface
** (process:6383): DEBUG: write “add 1-1.3” to /sys/bus/usb/drivers/usbip/match_busid
** Message: bind 1-1.3 to usbip, complete!

Значит все прошло успешно.

Теперь приступ к установке клиентской части usbip, я буду ставить ее на windows. Для этого качаем клиент:
http://ignum.dl.sourceforge.net/project/usbip/usbip/usbip-win-preview/usbip-win.zip

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

Установка

Выбираем установку вручную

Установка

Далее показать все устройства

Выбираем

Выбираем установку с диска и указываем папку с драйверами usbip

Указываем

Теперь открываем cmd переходим в папку с программой и получаем список usb устройств с нашего сервера
usbip -l ip-usbip-server

Получаем

Теперь подключаем нужное нам устройство по его id в usbip
usbip -a ip-usbip-server id-device

подключаем

Все, теперь можно ставить драйвера на наше usb устройство.

Проброс USB устройств в VirtualBox

И так выведем для начало весь список USB устройств, делаем под sudo

sudo VBoxManage list usbhost

нас интересует:

UUID: 59b370b3-c176-42d5-814b-b805295c9738
VendorId: 0×0529 (0529)
ProductId: 0×0001 (0001)
Revision: 2.23 (0223)
Manufacturer: AKS
Product: HASP 2.17
Address: sysfs:/sys/devices/pci0000:00/0000:00:1d.2/usb4/4-2//device:/dev/vboxusb/004/002
Current State: Available

Теперь это же проверим из под нашего vbox юзера

VBoxManage list usbhost

если все так же то пропускаем, если вывод пустой, то тогда нашего пользователя, от которого запускаем ВМ надо добавить в группу vboxusers
Создать в файл с правилами для udev /etc/udev/rules.d/10-vboxdrv.rules
со следующим содержанием:


SUBSYSTEM==usb, ENV{DEVTYPE}==usb_device, GROUP=vboxusers, MODE:=0664

И проверить права на /sys/bus/usb/devices

ls -lh /sys/bus/usb/devices

Должны быть права root:vboxusers

И так добавляем фильтр

VBoxManage  usbfilter add 0 --target WS1 --name HASP1C --action hold --active yes --vendorid 0529 --productid 0001 --revision 0223  --manufacturer AKS

0 – номер правила
—target WS1 –наша виртуальная машина WS1
—name HASP1C – Имя фильтра
—action hold – значит блокируем доступ
—vendorid 0529 – берем из вывода VBoxManage list usbhost
Остальные параметры оттуда же

Теперь настроим саму виртуальную машину, включим поддержку usb

VBoxManage modifyvm WS1 --usb on

А теперь проверим наш фильтр

VBoxManage showvminfo WS1

Видим следующий текст


USB: enabled

USB Device Filters:

Index: 0
Active: yes
Name: HASP1C
VendorId: 0529
ProductId: 0001
Revision: 0223
Manufacturer: AKS

Значит все работает, теперь можно загружать вашу виртуальную машину и ставить драйвера на USB устройство.

Codeigniter. Модель для рейтинга, часть 2

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

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

При стандартной работе с моделью


$this->load->model(‘rating’);

Создается один объект и последующие вызовы возвращают указатель на этот объект.
В новой версии можно делать так:


$rating = new Rating();
$rating2 = new Rating();

И так изменённая модель Rating


Class Rating { /** * Ид оценки * @var int */ public $rating_id = NULL; /** * Общая оценка * @var float */ public $rate = NULL; /** * Кол-во проголосовавших * @var int */ public $voted = NULL; /** * Активна оценка или нет * @var bool */ public $active = NULL; /** * Имя нашей таблицы в бд * @var string */ private $_table_name; /** * Максимально возможная оценка * @var int */ private $_max_rate = 5; private $_CI; public function __construct() { $this->_CI = & get_instance(); $this->_CI->config->load(‘rating’); if (($this->_table_name = $this->_CI->config->item(‘table_name’, ‘rating_config’)) === FALSE) { //Если не получил имя таблицы, то выводим окно ошибки show_error(‘Не удалось получить имя таблицы в базе данных для системы оценок’); } $this->_max_rate = $this->_CI->config->item(‘max_rate’, ‘rating_config’); } /** * Создаем оценку * param float $rate - Оценка, по умолчанию 0 * param int $voted – Кол-во проголосовавших * param bool $active - Активировать оценку * return bool – результат создания объекта */ public function create($rate = 0, $voted = 0, $active = true) { $sql = “INSERT INTO “ . $this->_table_name . “ (rate,voted,active) VALUES;”; $this->_CI->db->query($sql, array($rate, $voted, $active)); if ($this->_CI->db->affected_rows() > 0) { $this->rating_id = $this->_CI->db->insert_id(); $this->rate = $rate; $this->voted = $voted; $this->active = $active; return TRUE; } else { $this->_clear_rate(); return FALSE; } } /** * Удаляем оценку * param type $id - ид оценки, если не указан ид, то пытается удалить текущий объект * return boolean – результат удаления */ public function delete($id = false) { if ($id !== false) { $this->_CI->db->delete($this->_table_name, array(‘rating_id’ => $id)); } else { if (is_numeric($this->rating_id)) { $this->_CI->db->delete($this->_table_name, array(‘rating_id’ => $this->rating_id)); } else { return FALSE; } } if ($this->_CI->db->affected_rows() > 0) { if (($id = false) || ($id $this->rating_id)) { $this->_clear_rate(); } return TRUE; } else { return FALSE; } } /** * Клас ищет оценку по ид * param type $id - ид оценки * param type $active – искать только активные * @return boolean – true если нашел, ну или false */ public function find_by_id($id, $active = true) { $sql = “SELECT rating_id,rate,voted,active FROM “ . $this->_table_name . “ WHERE rating_id=?”; $result = null; if ($active) { $sql .= “ AND active=?”; $result = $this->_CI->db->query($sql, array($id, $active)); } else { $result = $this->_CI->db->query($sql, array($id)); } if ($result->num_rows() > 0) { $tmp = $result->row(); $this->rating_id = $tmp->rating_id; $this->rate = $tmp->rate; $this->voted = $tmp->voted; $this->active = $tmp->active; return TRUE; } else { $this->_clear_rate(); return FALSE; } } /** * Редактируем данные * @return boolean результат обновления */ public function edit() { if (is_numeric($this->rating_id)) { $sql = “UPDATE “ . $this->_table_name . “ SET rate=?,voted=?,active=? WHERE rating_id=?”; $this->_CI->db->query($sql, array($this->rate, $this->voted, $this->active, $this->rating_id)); if ($this->_CI->db->affected_rows() > 0) { return TRUE; } else { return FALSE; } } else { return FALSE; } } /** * Добаляем оценку * param type $rate - оценка проголосовавшего * param type $id – ид оценки, если не указывать, то попытается использховать текущий объект * param type $ret - возращать обновленный объект или нет * return boolean если $ret=true, то вернет объект с новыми данными, если $ret=false, то просто вернет true */ public function add_rate($rate, $id = FALSE, $ret = TRUE) { $sql = “UPDATE “ . $this->_table_name . “ SET voted = voted+1, rate = ROUND)+?)/voted,1) WHERE rating_id=?”; if ($rate > $this->_max_rate) $rate = $this->_max_rate; if ($id !== FALSE) { $this->_CI->db->query($sql, array($rate, $id)); } else { if (is_numeric($this->rating_id)) { $this->_CI->db->query($sql, array($rate, $this->rating_id)); $id = $this->rating_id; } else { return FALSE; } } if ($this->_CI->db->affected_rows() > 0) { if ($ret) { return $this->find_by_id($id); } return TRUE; } else { return FALSE; } } /** * Возвращает максимальную оценку * @return int */ public function get_max_rate() { return $this->_max_rate; } /** * Удаляем значения */ private function _clear_rate() { $this->rating_id = NULL; $this->rate = NULL; $this->voted = NULL; $this->active = NULL; } } ?>

Теперь в папке application/controllers создадим два контроллера
ajax.php – для обработка ajax запросов
rate.php – для тестирования работы

код ajax.php


BASEPATH’)) exit(‘No direct script access allowed’); class Ajax extends CI_Controller { public function __construct() { parent::__construct(); } /** * Возращает результат добаления оценки * param type $id - id оценки * param type $rate – rate оценка */ public function rate($id = false, $rate = false) { if ($id !== false) { require_once APPPATH . ‘models/Rating.php’; $this->load->helper(‘rating’); $rating = new Rating(); $id = preg_replace(’/[^0-9]/’, ‘’, $id); if ($rate !== false) { $rate = preg_replace(’/[^0-9]/’, ‘’, $rate); $rating->add_rate($rate, $id); set_rating_cookie(1); $data[‘rating’] = $rating; $this->load->view(‘rate/result’, $data); } } } } ?>

код rate.php


BASEPATH’)) exit(‘No direct script access allowed’); class Rate extends CI_Controller { private $rating; public function __construct() { parent::__construct(); require_once APPPATH . ‘models/Rating.php’; } /** * * @param type $id – ид оценки */ public function view($id = false) { if($id!== false) { $id = preg_replace(’/[^0-9]/’, ‘’, $id);//оставляем только цифры $this->rating = new Rating(); if ($this->rating->find_by_id($id)) { $this->load->view(‘head’); $data[‘rating’] = $this->rating; $this->load->helper(‘rating’); $this->load->view(‘rate/result’, $data); if(!exist_rating_cookie($this->rating->rating_id)) { $this->load->view(‘rate/voted’, $data); } $this->load->view(‘foot’); } } else { $this->load->view(‘head’); echo ‘

No id rate

’; $this->load->view(‘foot’); } }
}
?>

Теперь создадим хелпер для работы с куками в папке application/helpers создаем rating_helper.php


BASEPATH’)) exit(‘No direct script access allowed’); /** * Проверяет и устанавливает куки * param type $rating_id - ид оценки * return boolean – результат добавления */
function set_rating_cookie($rating_id) { $CI = & get_instance(); $rating = $CI->input->cookie(‘rating’, TRUE); if ($rating !== false) { $rating = unserialize($rating); if (is_array($rating)) { if (array_search($rating_id, $rating) === false) { $rating[] = $rating_id; } else { return FALSE; } } else { $rating = array($rating_id); } } else { $rating = array($rating_id); } $cookie = array( ‘name’ => ‘rating’, ‘value’ => serialize($rating), ‘expire’ => ‘86500’, //24 часа ‘secure’ => false ); $CI->input->set_cookie($cookie); return TRUE; } /** * Функция проверяет существует ли заданая кука для оценки * param type $rating_id - ид оценки * return boolean – результат существования */
function exist_rating_cookie($rating_id) { $CI = & get_instance(); $rating = $CI->input->cookie(‘rating’, TRUE); if ($rating !== false) { $rating = unserialize($rating); if (is_array($rating)) { if (array_search($rating_id, $rating) !== false) { return TRUE; } else { return FALSE; } } else { return FALSE; } } else { return FALSE; }
} ?>

В контроллере rate у нас идет вызов 4 представлений
1. head – шапка сайта
2. rate/result – форма вывода результатов голосования
3. rate/voted – форма для голосования
4. foot – подвал сайт

Теперь создадим их в папке application/view создаем файл head.php












Там же foot.php

%MINIFYHTML6ca9da92cd362c300630829e38ccface2%

Теперь создадим папку rate и в ней 2 файла result.php и voted.php

result.php





Оценка: rate; ?>



Всего проголосовало: voted; ?>


voted.php





Оцените:
$max = $rating->get_max_rate();
for ($i = 1; $i <= $max; $i++) {
echo ‘rating_id . ‘,’ . $i . ‘);>’ . $i . ‘ ‘;
}
?>


Теперь если мы создадим тестовый рейтинг выполнив запрос к базе:
INSERT INTO rating (rate,voted,active) VALUES(0,0,TRUE);

И обратимся к нашему сайту http://ip-addres/путь-к-codeigniter/rate/view/1

Страница

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

Результат

После чего в куках появится id оценки и на 24 часа вы не сможете больше голосовать.

Установка phpvirtualbox web интерфейс для virtualbox

Последнию версию можно взять с сайта http://phpvirtualbox.googlecode.com, там же есть документация по установке на различные системы. И так скачиваем и распаковываем:


wget  http://phpvirtualbox.googlecode.com/files/phpvirtualbox-4.1-10.zip
unzip phpvirtualbox-4.1-10.zip

Ставим apache с php


sudo apt-get install apache2
sudo apt-get install libapache2-mod-php5

В конфигах apache смотрим опцию DocumentRoot у меня это /var/www
Теперь копирую туда файлы phpvirtualbox


cp -R phpvirtualbox-4.1-10 /var/www/vbox
cd /var/www/vbox

создаем файл настроек


cp config.php-example config.php

И редактируем его


//тут указываем вашего системного юзера под которым работает virtualbox
var $username = ‘vbox’;
var $password = ‘pass’;
var $language = ‘ru’;

Добавляем в /etc/default/virtualbox


VBOXWEB_USER=vbox
VBOXWEB_HOST=127.0.0.1

Теперь небольшой момент, те кто как я пользуются OSE версией, то обнаружат, что у нас отсутствует файл /etc/init.d/vboxweb-service и что бы нам запустить vboxwebsrv пишем:


 vboxwebsrv -b -F /dev/null

Тут указываем, что бы он запустился в бэкграунде, а логи выводил в /dev/null. Для дальнейшего использования, нужно будет создать скрипт автозапуска и остановки vboxwebsrv.

Обладателям oracle версии virtualbox нужно просто запустить скрипт


/etc/init.d/vboxweb-service  start

Проверяем как запустился наш vboxwebserver


ps aux | grep vboxwebsrv

и видим, что нормально 16482 0.0 0.4 40208 7232 ? Sl 12:25 0:00 /usr/lib/virtualbox/vboxwebsrv -b -F /dev/null

теперь заходим http://ваш-ip-address-server-vm/vbox/ и вводим admin admin

Заходим

Если все работает правильно, то увидите такое окно

Интерфейс

Дальше как в обычно gui интерфейсе virtualbox’a