среда, 28 декабря 2016 г.

bacula очистка баз от бэкапов





На данный момент сделать второю полную копию хранилища на сервере PDC невозможно – недостаточно места на разделе /mnt/bacula/ ( примонтирован по iSCSI nas4free )
Для этого делается очистка баз от бэкапов:
1. меняем дату в файле:
sudo vi /usr/local/bin/purge-db-and-files.sh


до какого числа очистить базу
DATEFROM=2015-02-12
 и запускаем его
cd /usr/local/bin/
purge-db-and-files.sh

2. далее чистим хранилище /mnt/bacula/
эта папка (/mnt/bacula/) примонтирована по ISCSI с сервера nas4Free
sudo rm -rf /mnt/bacula/*_volume-*
если действительно хотим удалить все:
sudo rm -rf /mnt/bacula/*_volume-*



purge-db-and-files.sh

 #!/bin/bash

  DATEFROM=2016-12-26
  BACKUPFOLDER="/mnt/bacula"

  #GETLISTFROM="BCONSOLE"
  GETLISTFROM="MYSQL"

  # get list to prune
  if [[ "${GETLISTFROM}" == "BCONSOLE" ]] ; then
    DELETELIST=`echo -e "sqlquery\nselect VolumeName from Media where LastWritten < '${DATEFROM}' order by VolumeName;\n.\nexit" | bconsole | grep '^|' | grep -v ' VolumeName ' | sed -e 's/[ ]*|[ ]*//g'`
    echo "Using bconsole"
  elif [[ "${GETLISTFROM}" == "MYSQL" ]] ; then
    DELETELIST=`mysql --database=bacula --column-names=FALSE -e "select VolumeName from Media where LastWritten < '${DATEFROM}' order by VolumeName;" | sed -e 's/[ ]*|[ ]*//g'`
    echo "Using mysql"
  fi
  if [[ -z "${DELETELIST}" ]] ; then
    echo "No records found earlier than ${DATEFROM}"
    exit 1
  fi
  #echo -e "${DELETELIST}"
  echo  "${DELETELIST}"
  echo
  echo "WARNING: IT WILL DESTROY THAT FILES ON THE DISK"
  echo "Are you sure you want to proceed?"
  read -p 'Type YES if you really want to proceed: ' input
  echo
  if [[ ${input} != YES  ]]; then
    echo "Ok. Aborting."
    exit 1
  fi

  echo -e "${DELETELIST}" | xargs -I '{}' echo delete yes volume='{}' | bconsole
  echo -e "${DELETELIST}" | xargs -I '{}' echo "rm ${BACKUPFOLDER}/"'{}' | while read LINE ; do echo "${LINE}"; "${LINE}"; done

Bacula. Fatal error: Uncaught exception 'Zend_Exception' with message 'Fatal error: Can't connect to SQL server'

Изначально Система резервного копирования строилась по этой статье:


Развертывание Bacula в малом офисе 

Все работает по статье нормально.

НО что у меня объем хранилища 4ТБ, а объем данных более 2 ТБ. В итоге приходится чистить базу и запускать бэкап заново

Однажды после такой чистки получил  ошибку:


Fatal error: Uncaught exception 'Zend_Exception' with message 'Fatal error: Can't connect to SQL server' in /var/www/webacula/html/index.php:178
Stack trace:
#0 {main}
  thrown in /var/www/webacula/html/index.php on line 178

проблема с SQL server
 
проверяем место на жестком диске

user@bacula:/$ df -h
Файл.система                Размер Использовано  Дост Использовано% Cмонтировано в
/dev/mapper/bacula--vg-root    71G          67G     0          100% /
udev                          994M         4,0K  994M            1% /dev
tmpfs                         201M         736K  200M            1% /run
none                          5,0M            0  5,0M            0% /run/lock
none                         1004M            0 1004M            0% /run/shm
/dev/sda1                     236M          35M  189M           16% /boot
overflow                      1,0M            0  1,0M            0% /tmp
/dev/sdb1                     2,5T          62G  2,3T            3% /mnt/bacula
 


подозрительно

/dev/mapper/bacula--vg-root    71G          67G     0          100% /

ищем самую большую папку

user@bacula:/$ sudo du -s * | sort -nr | head

получили 
 
64186796        mnt
2844792         var
870928          usr
213648          lib


user@bacula:/var/lib$ sudo du -s * | sort -nr | head
2373428 mysql
120132  apt
56068   mlocate
34008   postgresql
29968   dpkg
8036    aptitude
3488    aspell
2072    apt-xapian-index
1648    bacula

в итоге нашел файл


user@bacula:/var/lib$ sudo ls -la  /var/lib/mysql/ibdata1
-rw-rw---- 1 mysql mysql 2418016256 дек.  26 17:52 /var/lib/mysql/ibdata1


что такое ibdata1 нашел здесь

Второй параметр – задаёт размещение файла ibdata1 (т.к. путь не указан – будет использоваться “хранилище” MySQL – /var/lib/mysql )

ibdata1 увеличился видимо, когда /mnt/bacula не был примонтирован

не запускался MySql






в итоге удалил 
ibdata1 и логи

после этого 
запускался MySq

но webacula не запустился

было решено пересоздать базу bacula и таблицы webacula по статье

выполнить команды:
 
Если после наших эксперементов нам нужно удалить все тестовые джобы, делаем это так:
$ mysql -u root -p
mysql> drop database bacula;
mysql> quit

$ dpkg-reconfigure bacula-director-mysql
Мы уничтожили базу данных, а затем создали ее вновь. Осталось удалить сами файлы томов.
 и
Далее создаем таблицы Webacula, пользователей и роли:
$ cd install/MySql
$ ./10_make_tables.sh
$ ./20_acl_make_tables.sh


после этого система заработала





вторник, 13 сентября 2016 г.

USB-Keyboard with Arduino


http://blog.petrockblock.com/2012/05/19/usb-keyboard-with-arduino-and-v-usb-library-an-example/



https://florianfries.me/en/arduino-as-a-keyboard.html




http://www.vladcazan.com/electronics/arduino-keyboard-emulator
http://robocraft.ru/blog/1002.html


Arduino как HID-устройство


Необходимо перепрошить mega8u2
















взято с https://vk.com/blynk

Немного предистории:
Посте того, как сгорел мой "ноутбук", я вспомнил про свой старый системник (точнее материнку и блок питания).
Достав его из кучи барахла, заметил что кроме мышки нету никакого устройства ввода, немного посидел,и начал рыть инет. Так как у меня в асоррименте только Arduino UNO R3 смотрел статьи только с ней. Многие делают клавиатуру на Arduino micro (ну там все просто).

В поисках наткнулся на статью где ардуино играет в 2048. Так как для упавления игрой надо нажимать клавиши, нужно превратить ардуино в клавиатуру.То что надо!


Приступим:

Нам понадобится:
  • Arduino UNO R3
  • Перемычка
  • Arduino IDE
  • Фирменная утилита Atmel – Flip
  • Архив с прошивками и примером + библиотека
Цель: написать скетч для Arduino UNO, который будет эмулировать нажатие клавиш стрелок на клавиатуре.
Алгоритм наших действий:
  • Пишем скетч с нужным функционалом и заливаем в МК ATmega328
  • Прошиваем загрузчик Arduino, usb контроллер ATmega16U2
Для эмулирования нажатий клавиш я использовал библиотеку HIDKeyboard.
Что ж теперь переходим к самому интересному – будем превращать Arduino UNO в HID устройство, а конкретней в USB клавиатуру.
Немного теории.
Прошивка загрузчика — для начала нужно перевести Arduino в режим Device Firmware Update или в более часто используемом варианте DFU. Он служит для перепрошивки контроллера выполняющего роль конвертера serial to usb.
Как известно, основное отличие Arduino UNO от предыдущих моделей плат Arduino заключается в наличие второго контроллера ATmega8U2, на смену аппаратному конвертору USB <-> COM (FT232R). Преимуществом данного решения является возможность замены прошивки в интерфейсном контроллере с целью эмуляции произвольного устройства при подключении Arduino к ПК (накопителя, hid-устройства и т.д.). Как это сделать? У интерфейсного контроллера имеется режим DFU – прошивка контроллера ATmega8U2 через подключение через USB. Почти как прошивка центрального контроллера Arduino. Для этого можно воспользоваться фирменной утилитой Flip. Для того чтоб перевести контроллер в этот режим программирования потребуется небольшая аппаратная модернизация Arduino.
Для  Arduino UNO R3 достаточно поставить перемычку.


После этих действий компьютер обнаружит новое устройство и попытается самостоятельно поставить драйвера, но у него ничего не получится. Настало время установить фирменную утилиту Flip от Atmel. Открываем диспетчер задач и видим новое устройство Arduino Uno DFU.

Выберем драйвер из папки недавно установленной утилиты FLIP. В итоге у нас появится новое устройство – ATmega16U2. В дальнейшем при подключении Arduino, устройство будет определять как USB устройство. Теперь нам следует залить HEX файл с инструкциями USB клавиатуры. Чтоб компьютер в дальнейшем распознавал нашу Arduino как usb клавиатуру. Запускаем FLIP.


  • Выбираем в меню Device > Select > ATmega16U2
  • Выбираем в меню Setting > Communication > USB
  • Жмем Open берем прошивку
  • Приступаем к прошивке, жмем Run
По окончании процесса прошивки можно закрыть программу и проверить, как работает устройство. В итоге мой Arduino успешно играл в 2048 почти неделю. Даже на ночь его не выключал. В подтверждение вот мой результат.

Вот так можно превратить Arduino UNO в HID-устройство. Кстати можно не только играться в игры но и разыграть друга, подключив к его компьютеру устройство, которое запустит блокнот и будет писать там анекдоты, либо запускать команды, ведь клавиатура это главный пульт управления компьютером. К сожалению нельзя применить этот метод к плате Arduino Nano. Как уже говорилось ранее – второй контроллер Arduino UNO (ATmega8U2) используется в роли конвертера USB to Serial для определения компьютером Arduino UNO как USB устройство. Можно сделать вывод: реализовать этот метод, без посторонних устройств, возможно лишь при наличии на плате Arduino микроконтроллера запрограммированного как USB-to-serial конвертер. Но что делать, если у вас Arduino Nano или иная плата без конвертера USB to Serial? В таком случае можно купить отдельно конвертер подобный этому.

Чтобы вернуть Arduino UNO к жизни надо перепрошить ATmega16U2
Найти прошивку можно тут:
C:\Program Files\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2
На всякий случай собрал весь софт который использовал в

  - Arduino-HID-Bot-2048.ino - Скетч для Arduino UNO для игры в 2048.
   
  - Arduino-keyboard.hex       - этот hex файл заливаем при помощи FLIP для перевода arduino
в режим USB клавиатуры (но сначала нужно залить основной скетч).

прошиваем вот так!


шьем по isp

делаем клавиатуру

avrdude -p m16 -b 19200 -F -P COM4 -c avrisp -U flash:w:Arduino-keyboard-0.3.hex -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m -U efuse:w:0xF4:m -U lock:w:0x0F:m




"-p m16" это код atmega16u2


делаем копию arduino uno R3

avrdude -p m328p -b 19200 -c avrisp
 -P COM13 -e -U flash:w:ATmegaBOOT_168_atmega328_pro_8MHz.hex

   
  - Arduino-usbserial-uno.hex - этот файл нужен для того чтоб обратно вернуть Arduino UNO
в стандартный режи работы, чтоб она определялась в ПК как виртуальный COM-порт
в котром мы можем загружать скетчи. 
https://vk.com/doc5127466_437873517

http://www.atmel.com/tools/FLIP.aspx


 Дополнительно:

Arduino UNO R3 Mouse HID

 http://pythoneiro.blogspot.ru/2015/04/transformando-seu-arduino-uno-em-um-usb.html





четверг, 28 июля 2016 г.

Удаления файла или каталога по маске в Linux

Удаления файла или каталога по маске

Удаляем файлы и каталоги по заданным критериям или маске. Есть несколько вариантов удаления. Прицеп прост, собрать структуру файлов или директорий и удалить.
Для сбора данных как всегда используем команду find, но многие не смотрели ее дополнительных возможностей. Есть ключ -delete с помощь которого можно сразу и удалить выбранные объекты.
Удаляем все файлы (ключ -type f ) с именем упоминание в имени "*text*" в каталоге ./test/:
find ./test/* -type f -name "*text*" -delete
Удаляем все пустые каталоги по маске
find ./test/* -type d -name "*" -empty -delete
А если каталог или директория заполнена прибегаем к команде rm .

Удаление каталога с файлами

Удаляем конкретный каталоги с файлами.
rm -dfR ./test/dir1
Удаляем каталог с файлами по маске
find ./test/* -type d -name "*dir*" | xargs rm -dfR
Приятного использования и удаления.



 источник1

Удалить файлы, содержащие в названии определенный текст можно следующими способами:
1: locate *часть_имени* | xargs rm
2: find . -name "*~" -type f | xargs rm -f


источник2

Предположим что файловая шара Samba находится у нас по адресу: /home/samba/public в которой уже лежат папки и файлы пользователей.
Тогда запрос принимает вид:

find /home/samba/public -type f -name "~$*.*" -delete


"~$*.*" -маска имени файла, если нужно удалить например: файлы mp3, то будет иметь вид "*.mp3", а если требуется удалять приложения, то "*.exe"
Данное задание можно засунуть в Cron и выполнять по ночам, когда сервер не используется.
Решение подходит для всех дистрибутивов Linux.

вторник, 26 июля 2016 г.

Поиск самой большой папки unix, linux

du —max-depth=1 -B M |sort -rn
 
-h -x забыл
-h — human, что бы не в байтах, а в гигабайтах/магабайтах/килобайтах и т.д. писало
-x — одна файловая система, если внутри просматриваемого каталога примонтирован другой диск, то пропускать его
и вместо —max-depth=1, можно писать -d 1

понедельник, 11 июля 2016 г.

понедельник, 30 мая 2016 г.

скачать файлы с FTP

How FTP Multiple Files from the Command Line

источник

Many times I am challenged to move many similar files from one server to another.  Either I have to remote-desktop on to the server (Windows), or have a session on the server (AIX, Linux).  In these situations, I do not have a nice GUI utility, like FTP Voyager, setup to move my files.  There are some good basic commands in FTP that make life easier to move many like files.
C:\ ftp <my server name>
ftp> bin
ftp> prompt no
ftp> mget <start of the like files> *

Below are commands that I use to move multiple files at in a couple commands.
binary or bin: when you set to binary mode, you’ll receive a message “200 Type set to I”.  The default mode for FTP is ASCII.  Binary mode transmits the raw bytes of a file.  This is useful when moving zipped or executable file.  If you transmit your executable or zipped file in ASCII mode, you may find it corrupted on the receiving server.  To save time & typing, you can type “bin”, and the FTP utility will recognize it as the command “binary”.
prompt no: by default the prompt is set on to check if you want the download the file.  When you set your prompt mode to no, your will get an message “Interactive mode OFF”.  By setting the prompt to no, the FTP utility will automatically download multiple files without prompting.
Below is an example of being prompted for each file & why you may want to avoid this (you have to type either y or n for each file):
— very bad if you have to move hundreds to thousands of files
mget: this command can retrieve multiple files at a time.  View some of the example below:
FTP> mget file01 file02 file03
separate each file with a space
FTP> mget filename*
FTP> mget *.txt
start or finish with the common characters in the file name, and the star (*) can be used as a wildcard character
mput: this command is used like mget to upload multiple file to the remote computer
FTP> mput file01 file02 file03
separate each file with a space
FTP> mput filename*
FTP> mput *.txt
start or finish with the common characters in the file name, and the star (*) can be used as a wildcard character
Why I write this:
When I started working more with linux & AIX operating systems, I remember spending a lot of time to put together all the commands that I would need to upload system patches or to script the movement of log files.  This week, cleaning up my personal folder, I found the notes I had to put these together.  My hope is that these notes helps someone cut down on the number of message board they have to search to find the commands need to accomplish these tasks.

Ftp за NAT

Ftp за NAT проброс портов и настройка диапазона. 

за основу взята статья

Стандартная задача - пробросить ftp за Nat. Небольшая сложность в том, что нужно кроме 21 порта пробросить диапазон дополнительных портов и настроить сам ftp на указаение данного диапозона и ip внешнего интерфейса.
К примеру, выделим для ftp порт 2100 и 10000-10100
Локальный ftp сервер работает на 192.168.122.100 порт 21.

Тогда настройки iptables для "шлюза":

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 2100 -j DNAT --to-destination 192.168.122.100:21
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 10000:10100 -j DNAT --to-destination 192.168.122.100

И в самом ftp надо указать эти нюансы. В случае vsftpd это делается добавлением строк:

pasv_min_port=10000 ;Указываем используемые сервером порты, первый
pasv_max_port=10100 ;и последний
pasv_address=_внешний_ip_шлюза_

В первом приблежении можно считать настроенным.

 Правила firewall на gate:

$IPT -t nat -A PREROUTING -i $REAL_IF -p tcp -m tcp --dport 60021 -j DNAT --to-destination 192.168.0.57:21

$IPT -t nat -A PREROUTING -i $LOCAL_IF -p tcp -m tcp --dport 60021 -j DNAT --to-destination 192.168.0.57:21

 $IPT -t nat -A PREROUTING -i $LOCAL_IF -p tcp -m tcp --dport 10000:10100 -j DNAT --to-destination 192.168.0.57

$IPT -t nat -A PREROUTING -i $REAL_IF -p tcp -m tcp --dport 10000:10100 -j DNAT --to-destination 192.168.0.57



добавить в функцию  на firewallе :
 function default_policy()
{
    /sbin/modprobe ip_conntrack
    /sbin/modprobe ip_conntrack_ftp
    /sbin/modprobe ip_nat_ftp

....
}

 конфиг proftpd:


 Include /etc/proftpd/modules.conf
UseIPv6 off
ServerType standalone
MaxInstances 30
SystemLog   /var/log/proftpd/proftpd.log

TimesGMT off
SetEnv TZ :/etc/localtime


        CharsetLocal KOI8-R
        CharsetRemote CP1251


#UseReverseDNS off

MasqueradeAddress 100.100.100.100

PassivePorts 10000 10100

  <IfModule mod_facts.c>
    FactsAdvertise off
  </IfModule>

ServerName "oen_PR_ftp"
DeferWelcome off
Port 21
MultilineRFC2228 on
DefaultServer on
ShowSymlinks on
TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200
DisplayLogin                    welcome.msg
ListOptions                 "-l"
DenyFilter \*.*/
# Пользователь, под которым будет запускаться FTP-сервер
User proftpd
# Группа, с которой будет запускаться FTP-сервер
Group nogroup
# Маска (права доступа) для файлов (первое значение 022) и каталогов (второе значение 022), создаваемых в каталогах
Umask 022  022
# Разрешить перезаписывать существующие файлы
AllowOverwrite on
# Для каждого пользователя в качестве корневого каталога устанавливаем его домашнюю папку. В этом случае пользователь не сможет выйти выше, т.е. попасть в /var/ftp или /var/ftp/check
DefaultRoot ~

# Настраиваем права доступа к пользовательским каталогам

# для каталога  /ftp/check:
<Directory /var/ftp/check>
# Пусть check имеет полный доступ к своей папке (закачивать файлы, скачивать файлы, создавать папки, удалять )
Umask                022  022
<Limit WRITE>
AllowUser check
</Limit>
</Directory>
# Настраиваем логи
TransferLog /var/log/proftpd/xferlog

# Отключаем проверку командного интерпретатора пользователя
RequireValidShell off
# указываем файл с учетными записями для авторизации пользователей
AuthUserFile        /etc/proftpd/ftpd.passwd
# Include other custom configuration files
Include /etc/proftpd/conf.d/
AllowForeignAddress on








среда, 25 мая 2016 г.

Windows - schedule tasks in command line using schtasks

Windows - schedule tasks in command line using schtasks

source

You may need the following schedules in Windows:
 1) every day ftp file to another computer on 11:00pm
2) every day check new files created and redirect the result to a log file
3) every day dump mysql database
4) check any malware run in schedule

You can use   schtasks in comman prompt.
1) schtasks help
schtasks /?
2) Query existing schedules
schtasks /QUERY /FO LIST   /V
3) Create a new schedule
 schtasks /create /tn TaskName /tr TaskRun /sc schedule [/mo modifier] [/d day]
 [/m month[,month...] [/i IdleTime] [/st StartTime] [/sd StartDate] [/ed EndDate]
 [/s computer [/u [domain\]user /p password]] [/ru {[Domain\]User | "System"} [/rp Password]] /?


Example
I have ftp script: ftp1.txt
open 137.82.***.***
username
password
lcd C:\sql_dumps\mysql_admin
cd dbfile
mput *.sql
y
bye


I create a executable file jiansen_ftp.bat
ftp -s:ftp1.txt

Create a schedule to run jiansen_ftp.bat every day 23:58:00
 schtasks /create /tn "myftp" /tr C:\sql_dumps\jiansen_ftp.bat  /sc daily /st 23:58:00
Video: Windows - schedule tasks in command line using schtasks


четверг, 5 мая 2016 г.

обрезать ffmpeg mp4 видео из консоли бесплатно



There are two ways how to split video files by ffmpeg. The first one is good in itself, more than that - it is faster, but sometimes creates output files with certain flaws. So for those cases there is the second way of splitting video files: it is considerably slower, the output files are bigger, but it seems they are always of the same quality level as input files used.
Way 1:
ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi
Way 2:
ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start> – the beginning of the part of a video ffmpeg is to cut out. Format: 00:00:00.0000, meaning hours:minutes:seconds:milliseconds.
  • <duration> – the duration of the part of a video ffmpeg is to cut out. Same format as above.
Examples:
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi
ffmpeg cuts out a part of the video file starting from 1 hour 19 minutes 0 seconds. The duration of the video sequence cut out is 5 minutes 0 seconds.
качаем:
http://ffmpeg.org/download.html

еще!!:
 http://trac.ffmpeg.org/wiki/Seeking

источник

включить .NET Framework в инсталляционный пакет (не проверено)

Если конкретно, то включить .NET Framework в инсталляционный пакет можно в свойствах проекта: Properties > Publish > Prerequisites, здесь выбираем версию - 2.0, 3.0 или 3.5. Поставив галочку в нужном чекбоксе, публикуем приложение: Build > Publish или прямо из окна свойств.
(Писал по среде Visual Studio 2008. В 2005, если не изменяет память, было несколько иначе, но думаю разберётесь).


Источник.

четверг, 28 апреля 2016 г.

VM autostart Oracle VirtualBox Windows

Логика:(для рабочей станции на windows)
  1. автовход пользователя. Настраивается через Локальные политики ..
  2. стартуем ВМ  скриптом через "Планировщик заданий" . Триггер по входу пользователя.
  3. Блокируем экран пользователя
 пример скрипта

autostartVMs.bat
cd "C:\Program Files\Oracle\VirtualBox"
vboxmanage startvm "vm_name1"
vboxmanage startvm "
vm_name2"

FTP from DOS

Get yourself a DOS prompt, type FTP and hit Enter. You've found 
the built-in command-line FTP program that ships with every copy 
of Windows 95 and NT! That means it's the only thing you KNOW will 
be on someone else's computer. But talking someone through how to 
use FTP is messy. If you need to help someone else out, you're 
better off automating the whole process by supplying them with an 
FTP "script". If you need to learn more about FTP, read on and go 
photocopy the FTP section out of a UNIX or LINUX book.

Before you go further, the sample FTP command lines I give here are 
(like most of my code) for Win9x. If you have NT, don't leave this 
page without checking out the NT difference mentioned at the bottom 
of this page!

FTP supports scripting. You use the "-s:" option to specify a script, 
for example if you name this text SCRIPT.TXT:

open ftp.microsoft.com
anonymous
username@nowhere.com
cd Products
cd Windows
cd Windows95
cd CDRomExtras
cd AdministrationTools
cd ApplicationTools
binary
hash
lcd c:\
get envars.exe
bye

Then you could execute it like this:

ftp -s:SCRIPT.TXT

There is one complication. Some people have more than one 
FTP program. So we need to specify we want to use the original. 
Do it by replacing "ftp" in the above example with %windir%\ftp.exe
for example

%windir%\ftp.exe -s:SCRIPT.TXT

By the way, the "envars.exe" the example script above downloads 
is a zipped file that contains two programs. One allows you to 
create shortcuts from DOS, and the other allows you to set 
system environment variables. Both are for Win9x only.

Here are all the command-line options for FTP:
FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-w:buffer] [-A] [host]

  -v           Suppresses display of remote server responses.
  -n           Suppresses auto-login upon initial connection.
  -i           Turns off interactive prompting during multiple file
               transfers.
  -d           Enables debugging.
  -g           Disables filename globbing (see GLOB command).
  -s:filename  Specifies a text file containing FTP commands; the
               commands will automatically run after FTP starts.
  -a           Use any local interface when binding data connection.
  -A           login as anonymous.
  -w:buffer    Overrides the default transfer buffer size of 4096.
  host         Specifies the host name or IP address of the remote
               host to connect to.

Using the "-A" option logs you in with user and host name you 
specified in your TCPIP setup. Which is why I prefer to specify 
the login name and password in the script.

Here are all the local FTP commands (which you can see by 
typing "help" at an FTP prompt:

!           delete       literal     prompt       send
?           debug        ls          put          status
append      dir          mdelete     pwd          trace
ascii       disconnect   mdir        quit         type
bell        get          mget        quote        user
binary      glob         mkdir       recv         verbose
bye         hash         mls         remotehelp
cd          help         mput        rename
close       lcd          open        rmdir

Just type help (or ?) followed by the command you want a 
description of. For example:
help append
gives this response:
append          Append to a file
Okay, it isn't much. But it's a start. 

You can even turn your script into a batch file:

%windir%\ftp.exe -s:%0
goto done
open ftp.microsoft.com
anonymous
username@nowhere.com
cd Products
cd Windows
cd Windows95
cd CDRomExtras
cd AdministrationTools
cd ApplicationTools
binary
hash
lcd c:\
get envars.exe
bye
:done
@echo off
cls
exit

I only had to add two lines to the beginning of my script 
and four lines to the end to turn it into a batch file. The 
great part is those same lines will turn ANY FTP script into 
a batch file! The DOS batch file will jump over the ftp 
script part, and the FTP program will just return "Invalid 
command" and go on to the next line harmlessly when it hits 
the DOS batch file commands.

But remember -- this and all files I write are for Win95! If
you find yourself using NT/W2K, you'll need to change the 
%windir%\ftp.exe -s:%0
line in the above code to
%windir%\system32\ftp.exe -s:%~f0 
(or %windir%\system32\ftp.exe -s:"%~f0" if the batch file path has embedded spaces)
NT is different in small ways that make big problems.
(Thanks to Joseph Hayes for pointing that one out!)
Also, if you still have problems on NT, you may need to add 
your "account" to your password in the script file. See here 
for more information:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q135858

Now then... Let's assume you don't want to embed your user name 
and password in the FTP batch file or script. Or maybe you want 
to pull the user name from somewhere else. Same problem. You're 
going to have to have your batch file create a separate script 
as it is needed. We'll start with a simple modification of the 
above sample code:

@echo off
>  C:\script.txt echo open ftp.microsoft.com
>> C:\script.txt echo anonymous
>> C:\script.txt echo username@nowhere.com
>> C:\script.txt echo cd Products
>> C:\script.txt echo cd Windows
>> C:\script.txt echo cd Windows95
>> C:\script.txt echo cd CDRomExtras
>> C:\script.txt echo cd AdministrationTools
>> C:\script.txt echo cd ApplicationTools
>> C:\script.txt echo binary
>> C:\script.txt echo hash
>> C:\script.txt echo lcd c:\
>> C:\script.txt echo get envars.exe
>> C:\script.txt echo bye
start /w %windir%\ftp.exe -s:C:\script.txt
del C:\script.txt
cls
exit

Those of you "new" to batch may be confused over the 
"> file echo text" layout. Maybe you are used to 
"echo text > file". They both work the same. The only reason 
I used the unusual layout is that it looks neater and is 
easier to copy and paste.

Now, suppose you had wanted batch file that could be called 
with the user name as parameter one, and the password as 
parameter two. You'd just modify the above code like this:

@echo off
>  C:\script.txt echo open ftp.microsoft.com
>> C:\script.txt echo %1
>> C:\script.txt echo %2
>> C:\script.txt echo cd Products
... and so on

Or maybe you have the user name and password stored in the 
environment as %user% and %pass%. You would do this:

@echo off
>  C:\script.txt echo open ftp.microsoft.com
>> C:\script.txt echo %user%
>> C:\script.txt echo %pass%
>> C:\script.txt echo cd Products
... and so on

Notice at the end of this batch file, I run FTP by using the 
START command with the /W (wait) option. That's so we don't 
delete the script we made until FTP is done using it! Under NT, 
sometimes (quite often) NT won't wait on a program even if you 
specify /w. In those cases, you may have to specify other 
options for START and force FTP to run in the same memory space 
as your batch file.

If you want a few ways to prompt a user for user names and 
passwords, check out the sample code on this page:
http://www.ericphelps.com/batch/samples/samples.htm
or read about it in general here:
http://www.ericphelps.com/batch/userin/index.htm

If you want to embed your user name in your batch file but don't 
want it visible, read my advice here:
http://www.ericphelps.com/batch/samples/obfuscating.txt



::  http://www.ericphelps.com

среда, 27 апреля 2016 г.

FTP-сервер (ProFTPd) Ubuntu14.04.2


FTP-сервер (ProFTPd) на Ubuntu 12.04 LTS 

часть 1 проверена на Ubuntu14.04.2

 
Задача: поднять FTP-сервер (возможно, с шифрованием) в локальной сети, а именно установить и настроить ProFTPd на Ubuntu 12.04 LTS
Источники:
1. http://vdsadmin.ru/ftp-proftp-ftpasswd
2. http://www.proftpd.org/docs/
3. http://www.proftpd.org/docs/directives/linked/config_ref_Limit.html
4. http://www.debianadmin.com/list-of-ftp-clients-available-in-linux.htm
5. https://forums.proftpd.org/smf/index.php?topic=1198.0
6. http://www.masterit.ru/5-besplatnyx-sftp-menedzherov-dlya-windows/
7. http://www.coreftp.com/download.html
8. http://proftpd.org/docs/contrib/mod_tls.html
9. sysadmins.ru/topic347156.html
10. http://www.castaglia.org/proftpd/modules/mod_sftp.html

Выполнение:
Часть 1. Ставим простой FTP-сервер на Ubuntu 12.04 LTS
1. Устанавливаем ProFTPd:
sudo apt-get install proftpd-basic
В процессе установки выбираем ответ standalone, т.е. самостоятельный запуск FTP-сервера, а не через суперсервер inetd.
2. Пусть каталоги будущих пользователей будут находится в /home/ftp . Создаем этот каталог:
sudo mkdir /home/ftp
Пусть у нас будут два пользователя: vasya и petr. Для каждого из них заведем отдельную папку в каталоге /home/ftp:
sudo mkdir /home/ftp/vasya
sudo mkdir /home/ftp/petr
3. Перед тем, как создавать пользователей нашего FTP-сервера, необходимо отметить следующее. Поскольку эти пользователи являются виртуальными по отношению к ОС, то возникает проблема обращения к каталогам и файлам FTP-сервера. Предположение о том, что доступ к файлам и каталогам будет осуществлять сам FTP-сервер с именем proftpd и группой nogroup, неверно. При обращении к кокому-либо файлу будет использоваться UID и GID конкретного пользователя FTP-сервера. Поэтому логично будет создавать пользователей с такими же UID, что и у какого-либо реального пользователя в системе, прописанного в /etc/passwd . Далее в качестве такого пользователя возмем сам proftpd . Чтобы узнать его UID, выполним команду:
cat /etc/passwd | grep proftpd
результат будет примерно таким
proftpd:x:110:65534::/var/run/proftpd:/bin/false
Следовательно, пользователей будем создавать с UID 110.
3.1  Создаем пользователей vasya и petr:
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=vasya --shell=/bin/false --home=/home/ftp/vasya --uid=110 --gid=65500
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=petr --shell=/bin/false --home=/home/ftp/petr --uid=110 --gid=65501
3.2 Сменим владельца и группу для всех созданных каталогов, чтобы пользователи FTP-сервера (с UID=110, как мы уже условились) смогли что-либо делать с ними:
sudo chown -R proftpd:nogroup /home/ftp
4. Правим конфигурационный файл /etc/proftpd/proftpd.conf :
Include /etc/proftpd/modules.conf
# Отключаем использование протокола IP v6
UseIPv6 off
# Имя FTP-сервера
ServerName "Ubunftp"
# Режим запуска FTP-сервера
ServerType standalone
DeferWelcome off
# Порт, который будет слушать FTP-сервер
Port 21
# выдавать многострочные сообщения в стандарте RFC 959 или RFC 2228
MultilineRFC2228 on
DefaultServer on
ShowSymlinks on
# Таймаут на передачу - вошел и не начал передачу (мс.)
TimeoutNoTransfer 600
# Подвисание во время передачи файлов (мс.)
TimeoutStalled 600
# Таймут бездействия после входа (мс.)
TimeoutIdle 1200
# Сообщение, которое будет показываться пользователю при входе
DisplayLogin                    welcome.msg
ListOptions                 "-l"
# Запретить закачивать файлы, начинающиеся на точку
DenyFilter \*.*/
# Максимальное количество дочерних процессов
MaxInstances 30
# Пользователь, под которым будет запускаться FTP-сервер
User proftpd
# Группа, с которой будет запускаться FTP-сервер
Group nogroup
# Маска (права доступа) для файлов (первое значение 022) и каталогов (второе значение 022), создаваемых в каталогах
Umask 022  022
# Разрешить перезаписывать существующие файлы
AllowOverwrite on
# Для каждого пользователя в качестве корневого каталога устанавливаем его домашнюю папку. В этом случае пользователь не сможет выйти выше, т.е. попасть в /home/ftp или /home/ftp/petr
DefaultRoot ~
# Настраиваем права доступа к пользовательским каталогам
# для каталога  /ftp/vasya:
<Directory /home/ftp/vasya>
# Пусть vasya не сможет редактировать содержимое каталога (закачивать файлы, создавать папки, ...)
<Limit WRITE>
DenyALL
</Limit>
# , но сможет читать файлы
<Limit READ>
AllowUser vasya
</Limit>
# и, как исключение из первого правила, удалять их
<Limit DELE>
AllowUser vasya
</Limit>
</Directory>
# для каталога  /ftp/petr:
<Directory /home/ftp/petr>
# Пусть petr имеет полный доступ к своей папке (закачивать файлы, скачивать файлы, создавать папки, удалять )
<Limit WRITE>
AllowUser petr
</Limit>
</Directory>
# Настраиваем логи
TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log
# Отключаем проверку командного интерпретатора пользователя
RequireValidShell off
# указываем файл с учетными записями для авторизации пользователей
AuthUserFile        /etc/proftpd/ftpd.passwd
# Include other custom configuration files
Include /etc/proftpd/conf.d/
5. Перезапускаем ProFTPd:sudo service proftpd restart
sudo service proftpd restart
Должно все работать. Проверить работу FTP-сервера можно так:
 
ftp localhost

Дополнительно настраиваем права (иточник)
sudo chmod 440 /etc/proftpd/ftpd.passwd && sudo chown proftpd.root /etc/proftpd/ftpd.passwd
Еще одна возмодная проблема:

The workaround is to edit the service file, to add a retry.
/etc/init.d/proftpd
Find this line:
start-stop-daemon --stop --signal $SIGNAL --quiet --pidfile "$PIDFILE"
Change to this:
start-stop-daemon --stop --signal $SIGNAL --retry 1 --quiet --pidfile "$PIDFILE"
This change solved it for me.


 Часть 2. FTP-сервер с SSL/TLS-шифрованием на Ubuntu 12.04 LTS
 
6. Сейчас можно прикрутить к нашему серверу SSL/TLS-шифрование. Сначала сгенерируем сертификат и ключ:
openssl req -new -x509 -days 365 -nodes -out /etc/proftpd/proftpd.cert.pem -keyout /etc/proftpd/proftpd.key.pem
 
7. Теперь отредактируем файл конфигурации /etc/proftpd/tls.conf, но сперва скопируем его, на свякий случай:
cp /etc/proftpd/tls.conf /etc/proftpd/tls.conf.old
  и добавляем в /etc/proftpd/tls.conf следующее: 
TLSEngine                  on
TLSLog                     /var/log/proftpd/tls.log
TLSProtocol                SSLv23
TLSOptions                 NoCertRequest
TLSRSACertificateFile      /etc/proftpd/proftpd.cert.pem
TLSRSACertificateKeyFile   /etc/proftpd/proftpd.key.pem
TLSVerifyClient            off
# если хотите всё таки разрешить обычное соединение, поставьте TLSRequired off
TLSRequired                on

8. В конец конфигурационного файла /etc/proftpd/proftpd.conf добавим строку
Include /etc/proftpd/tls.conf
9. Перезапускаем Proftpd:
sudo service proftpd restart 
Сейчас проверим, работает ли шифрование. Установим ftp-ssl :
sudo apt-get install ftp-ssl
и попробуем подключиться:
ftp-ssl localhost
 Если после ввода логина и пароля выходит приглашение ftp> , значит все работает.
На Windows мне не удалось подключиться к такому FTP ни через Total Commander (с плагинами), ни через FileZilla Client: в /var/log/proftpd/tls.log было видно, что соединение заканчивается с ошибкой
SSL/TLS required but absent on control channel, denying ... command
По видимому, эта ошибка возникала из-за того, что клиент начинал подключаться так, как подключается к обычному FTP, в то время, как требовалось установление SSL/TLS сессии.
 Подключиться смог только CoreFTP. Но для этого пришлось в /etc/proftpd/proftpd.conf добавить следующее: 
<IfModule mod_tls.c>
TLSOptions NoSessionReuseRequired
</IfModule>
Эта опция, как я понял, отменяем требование к клиенту работать в одной продолжиющейся сессии. Клиент может выполнять новую команду, создав новую SSL сессию. Это и делает CoreFTP. На рисунке ниже привожу настройки соединения CoreFTP.
 Часть 3. SFTP-сервер на базе ProFTPd и Ubuntu 12.04 
10. Теперь попробуем приктутить SFTP.
Закомментируем все строки в /etc/proftpd/proftpd.conf, относящиеся к использованию tls, а именно:
#<IfModule mod_tls.c>
#TLSOptions NoSessionReuseRequired
#</IfModule>
...
#Include /etc/proftpd/tls.conf
 Продолжаем реадктировать конфигурационный файл /etc/proftpd/proftpd.conf: добавляем следующее
#Если есть модуль SFTP, то применять следующие настройки 
<IfModule mod_sftp.c>
SFTPEngine            on
SFTPHostKey           /etc/ssh/ssh_host_dsa_key
SFTPHostKey           /etc/ssh/ssh_host_rsa_key
SFTPLog               /var/log/proftpd/sftp.log
SFTPCompression       delayed 
SFTPAuthMethods password # метод авторизации - пароль
</IfModule>
 # запрещаем подключаться всем (DenyALL) для того, чтобы пользователи из /etc/passwd не могли подключаться, и разрешаем пользователям vasya и petr  
<Limit LOGIN>
DenyALL
AllowUser vasya, petr
</Limit>
Проверим как работает:
sftp -P 21 petr@localhost
Если после ввода пароля выходит приглашение sftp> , значит работает. Для того, чтобы удостоверится в том, что сервер пускает только пользователей из файла /etc/proftpd/ftpd.passwd , выполним команду:
sftp -P 21 localhost
Даже если введем верный пароль текущего пользователя, все равно получим отказ
Permission denied, please try again.
При использовании SFTP с Windows-машины уже можно легко подключиться через FileZilla client.