sudo !! — запустить последнюю команду от имени рута. Полезно, если вы забыли добавить sudo в начале строки.

python -m SimpleHTTPServer — сделать доступной текущую директорию по адресу http://$HOSTNAME:8000/.

^foo^bar — выполнить предыдущую команду, но с заменой. Например, попробуйте запустить echo «tprogezr», а затем ^z.

ctrl-x e — зажать Ctrl и не отпуская x, затем e. Запускает редактор, чтобы можно было удобно составить большую сложную команду.

пробел команда — выполнить команду, но не запоминать её в истории.

‘ALT+.’ или ‘ .’ — поместить аргумент последней команды в консоль.

reset — восстановить терминал после вывода в него сырых бинарных данных или других ошибок формирования текста на экране.

mount | column -t — информация о текущих смонтированных файловых системах с удобным оформлением по столбцам.

echo “ls -l” | at midnight — выполнить команду в указанное время.

curl ifconfig.me — получить свой внешний IP.

ssh -N -L2001:localhost:80 somemachine — создать туннель от 80 порта на удалённой машине до 2001 на локальной.

man ascii — быстрый доступ к таблице ASCII.

dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp — перенаправить звук с вашего микрофона на колонки на удалённой машине.

arecord -f dat | ssh -C user@host aplay -f dat — более современный вариант предыдущей команды.

ctrl+u […] ctrl+y — запомнить текущую набираемую команду, а затем восстановить. Например, если в процессе набора команды вы что-то забыли, а затем хотите вернуться и продолжить.

wget -random-wait -r -p -e robots=off -U mozilla http://www.example.com — выкачать весь сайт.

curl -u user:pass -d status=”Tweeting from the shell” [http://twitter.com/statuses/update.xml]; — сделать твит через curl.

(cd /tmp && ls) — перейти к директории, выполнить там команду, вернуться к предыдущей директории.

И так, для начала скачиваем софтину:

Если у Вас нет git, то делаем в Debian/Ubuntu:

apt-get install git

или в RH-based системах:

yum install git

Далее всё просто:
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto --help

После выполнения вышеописанной команды letsencrypt-auto подтянет все необходимые зависимости.

Далее, необходимо запустить генерацию сертификата, и чтобы не возиться с автоматическим добавлением ключа к вебсерверу (мало ли как он у нас настроен?), сообщим, что мы хотим сами вручную добавить его на вебсервер:

./letsencrypt-auto certonly --manual

После чего letsencrypt спросит имя доменов, для которых мы хотим сгенерировать сертификат, их нужно указать через пробел (например, domain.com www.domain.com) и приватный ключ а также попросит разрешения на запоминание вашего IP (не знаю, зачем это) и закинуть по указанному адресу файл с определённым именем и хешем:


http://domain.com/.well-known/acme-challenge/ТутДлинноеИмяФайлаБезРасширенияНаАнглийском

с содержимым:

КакойТоХешОснованныйНаИмениФайла.ИЕщёКакомТоКлючеНаАнглийском

Будьте внимательны, если Вы указали два домена или больше (в том числе и субдомена), то для каждого домена (или субдомена) будет свой файл и свой хеш и их нужно закидывать и проверить доступность, иначе сгенерировать сертификаты и ключи не удастся и процедуру придётся повторять.

Если всё проделали правильно, то в /etc/letsencrypt/live/domain.com будут лежать файл сертификата cert.pem и ключа privkey.pem

Поскольку наиболее популярный фронтенд — это nginx, то опишу, также, как должна выглядеть секция server{} с включенной поддержкой SSL (HTTPS):

Включаем принудительно перенаправление HTTP->HTTPS

server {
listen aaa.bbb.ccc.ddd:80;
server_name domain.com www.domain.com;
location / {
return 301 https://domain.com$request_uri;


                }
}

Так выглядит виртуальный хост с указанными сертификатом и ключём:

server {
listen aaa.bbb.ccc.ddd:443 ssl;
server_name domain.com www.domain.com;
keepalive_timeout   60;
...
ssl_certificate       /etc/letsencrypt/live/domain.com/cert.pem;
ssl_certificate_key   /etc/letsencrypt/live/domain.com/privkey.pem;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers  "RC4:HIGH:!aNULL:!MD5:!kEDH";
add_header Strict-Transport-Security 'max-age=604800';
...
}

Проверяем конфиг nginx:

nginx -t

И если всё хорошо, применяем новую конфигурацию:

nginx -s reload

Enjoy your food!

В статье будет описана работа с протоколом IMAP, на примере очистки папки сообщений от системы мониторинга, в моём случае эта папка называется alerts.

1. Чтобы подключиться к почтовому серверу, работающему на IMAP используя шифрование SSL/TLS необходимо в консоли выполнить команду:

openssl s_client -crlf -ign_eof -connect mail.mailserver.com:993

сервер выдаст кучу информации, последней строкой будет

* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN AUTH=CRAM-MD5 AUTH=DIGEST-MD5] MAIL

2. Далее, авторизуемся:

. login [email protected] мойпароль

Сервер должен ответить:

. OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVE] Logged in

В противном случае неверное имя или пароль и нужно будет снова переходить к п.1

3. Получаем список папок нашего аккаунта:

. list """*"

Ответом должно быть что-то вроде этого:

* LIST (\HasNoChildren) "." blabla
* LIST (\HasNoChildren) "." Trash
* LIST (\HasNoChildren) "." Drafts
* LIST (\HasNoChildren) "." Sent
* LIST (\HasNoChildren) "." alerts
* LIST (\HasNoChildren) "." INBOX
. OK List completed.

4. Получить количество сообщений в любой из вышеуказанных папок можно командой:

. status alerts (messages)

Вместо alerts может быть любая папка из списка выше. В моём случае, сообщения из nagios-а храняться в папке alerts, поэтому чистить буду именно эту папку.

5. Удаляем папку alerts, где, в моём случае, хранятся сообщения от системы мониторинга:

. delete alerts

Снова должно быть сообщение OK

6. Создаём папку alerts снова:

. create alerts

Таким образом я быстро удалил 16к писем и почтовик прогрузил оставшиеся 500 достаточно быстро.

7. Отключение

. logout

P.S. если Вы используется Mozilla Thunderbird, также может потребоваться удалить вручную файлы этой папки из ~/.thunderbird/BLABLA.default/ImapMail/mail.mailserver.com/ (alerts.msf и alerts)

Генерируем приватный ключ:

openssl genrsa -out /etc/exim/dkim.key 2048

На основе приватного, генерируем публичную часть ключа:

openssl rsa -in dkim.key -pubout

В текущей папке файл dkim.key – приватный ключ и тот хеш, что будет выведен на экран – публичный ключ.

Копируем содержимое публичного ключа и добавляем следующую запись в DNS для необходимого домена:

mailxxx._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=хеш_публичного_ключа_без_пробелов_и_переносов"

 

Копируем и добавляем её на NS сервер в зону нашего домена

 

Меняем права на приватный ключ, чтобы не было проблем с его доступностью для exim:

chmod 755 /etc/exim/dkim.key

 

Копируем конфигурационный файл exim себе, на случай некорректных изменений:

cp /etc/exim/exim.conf /home/login/

где login — ваш логин

 

Редактируем конфиг exim:

edit /etc/exim/exim.conf

 

Перед секцией remote_smtp добавляем следующее:

# DKIM
DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_FILE = /etc/exim/dkim.key
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
DKIM_SELECTOR = mailxxx
DKIM_CANON = relaxed

 

В секции remote_smtp после директивы driver = smtp добавляем следующее:

dkim_domain = DKIM_DOMAIN
dkim_selector = mailxxx
dkim_private_key = DKIM_PRIVATE_KEY

 

Далее проверяем конфиг

exim -bV

 

и если нет ошибок, то перезапускаем exim:

/etc/init.d/exim restart

 

Проверяем, корректно ли работает подписывание DKIM ключём писем:

exim -v login@gmail.com

 

где вместо login — ваш логин (кэп), gmail.com — если у Вас почта на GMail

и вставляем туда примерно такой текст:

 

From: testmailbox@domain.com
To: login@gmail.com
Subject: Testing mail number1
Text of test message

 

Нажимаем Ctrl+D для отправки, смотрим лог события и выходим по Ctrl+C

В пришедшем письме в исходном сообщении (или по-другому говоря, оригинале) должна присутствовать запись о DKIM, похожая на это:

 

dkim=pass [email protected]
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=domain.com; s=mailxxx;
	h=Date:Message-Id:Subject:To:From; bh=4va6Om8rQAC1qwOFl25GK4pspjLbTsksnYxam9/wNvU=;
	b=c7gPxW6HRILCS3xhlsRYa62SkSPzoAceCzcPDWUFynmUhjvElO/xAGIy3NV3k/RUxoPp2fA2OG6y1sUS5rEbMcW+tMZ0gU4ukO03rvodp9OWHixuV+OFCHih/JjZz2eF9kPPjoT02cD/5Ldj6BlZ77jQc/FGRkQX+1+RmxpFvzM=;

 

Обновляем список доступных пакетов
apt-get update

Устанавливаем OpenVPN
apt-get install openvpn

Защита соединения в OpenVPN в данном случае строится на использовании сертификатов и ключей для сервера и для клиентов. Для их генерации в пакете OpenVPN имеются специальные скрипты, расположенные в /usr/share/doc/openvpn/examples/easy-rsa/2.0 Перед началом работы скопируем их, чтобы не изменять оригиналы.

(для старых версий openvpn)

mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa

С лета 2013 года easy-rsa не входит в OpenVPN и команда указанная выше не сработает(не найдет easy-rsa), тогда делаем доп команду:

sudo apt-get install easy-rsa

и копируем из другого места:

mkdir /etc/openvpn/easy-rsa
cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa
mv /etc/openvpn/easy-rsa/easy-rsa /etc/openvpn/easy-rsa/2.0

Переходим в созданную директорию, где и займёмся генерацией ключей и сертификатов

cd /etc/openvpn/easy-rsa/2.0

Редактируем файл переменных

nano vars

Здесь нужно добавить следующие строки:

# По умолчанию здесь просто openssl, которого нет в директории, в результате чего мы получим ошибку, если не укажем существующий. Я выбрал последнюю версию. Указывается без расширения .conf.
export OPENSSL=»openssl»

# В самом низу файла добавить
export KEY_ALTNAMES=»VPNsUS»

копируем конфиг openssl

cp openssl-1.0.0.cnf openssl.cnf

Загружаем переменные

source ./vars

Очищаем от старых сертификатов и ключей папку keys и создаем серийный и индексные файлы для новых ключей

./clean-all

Подтверждаем очистку.

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

./build-ca

Создаем ключ сервера

A challenge password []: Заполняется произвольным значением, насколько я понял это нужно только для создания ключа и больше нам не потребуется.

./build-key-server server

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

Можно сразу создать ключи для клиента, перейдя в соответствующую часть статьи. Я вынес в отдельный раздел, т.к. ключи клиента могут генерироваться не один раз, чтобы было понятнее с чего начать в том случае когда нужно добавить клиента.

Создаем ключ Диффи Хельман

./build-dh

Cоздаем ключ для tls-аутификации

openvpn —genkey —secret keys/ta.key

Перемещаем сертификаты

cp -r /etc/openvpn/easy-rsa/2.0/keys/ /etc/openvpn/

Создание файла конфигурации сервера

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
cd /etc/openvpn
gunzip -d /etc/openvpn/server.conf.gz

nano /etc/openvpn/server.conf

port 1194
proto udp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # This file should be kept secret
dh /etc/openvpn/keys/dh2048.pem
server 172.30.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
tls-auth ta.key 0 # This file is secret
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
tls-server
tls-auth /etc/openvpn/keys/ta.key 0
tls-timeout 120
auth SHA1
cipher BF-CBC
push «redirect-gateway def1»
push «dhcp-option DNS 8.8.8.8»
status /var/log/openvpn-status.log
log /var/log/openvpn.log

Можно запускать наш сервер OpenVPN

service openvpn restart

В /etc/sysctl.conf расскомментируем #net.ipv4.ip_forward=1 после чего
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p

iptables -t nat -A POSTROUTING -s 172.30.0.0/24 -o venet0:0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 172.30.0.0/24 -j SNAT —to 5.45.x.x
вместо venet0:0 указать имя внешнего интерфейса сервера (смотреть командой ifconfig),
вместо 5.45.x.x — указать внешний IP Вашего сервера,

iptables-save

Создание ключей и сертификатов

Ключи клиента создаются на сервере

Переходим в созданную директорию, где и замёмся генерацией ключей и сертификатов

cd /etc/openvpn/easy-rsa/2.0

Загружаем переменные

source vars

Создаем ключ клиента

Common Name (eg, your name or your server’s hostname) []: нужно вписать название файла ключа, в данном случае client

./build-key client

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

./build-key-pass client

Теперь нужно не забыть скопировать ключи (ca.crt, dh1024.pem, client.crt, client.key, ta.key) на клиента OpenVPN в /etc/openvpn/keys/

mv /etc/openvpn/keys/ /etc/openvpn/keys_backup
mv /etc/openvpn/easy-rsa/2.0/keys/ /etc/openvpn/

Создание файла конфигурации клиента, это делается на домашнем компьютере в любом простом текстовом редакторе вроде блокнота:

client
dev tun
proto udp
remote 5.45.x.x 1194
resolv-retry infinite
ca ca.crt
cert client.crt
key client.key
tls-client
tls-auth ta.key 1
auth SHA1 # по-умолчанию. Можно MD5
cipher BF-CBC
remote-cert-tls server
comp-lzo
persist-key
persist-tun

вместо 5.45.x.x — нужно вписать внешний IP вашего сервера

И сохраняем с именем client.ovpn в отдельную папку, например «C:\Program Files\OpenVPN\config»

В этой же папке, где мы сохранили client.ovpn, создаём ещё 4 пустых файла, и называем их:
ca.crt
ta.key
client.crt
client.key

и заполняем их содержимым, которое берём из (текст копируем прямо из консоли)
cat /etc/openvpn/keys/ca.crt
cat /etc/openvpn/keys/ta.key
cat /etc/openvpn/keys/client.key
cat /etc/openvpn/keys/client.crt

Сохраняем и запускаем соединение.

Добавление в автозагрузку:

update-rc.d openvpn defaults

It will be upload files of any type in folder $uploaddir:

<!DOCTYPE HTML>
<HTML>
  <HEAD>
    <meta charset="utf-8">
    <title>upload</title>
  </HEAD>
  <BODY>
    <h1>Upload file service</h1>
    <hr>
<?php
$uploaddir = './files/';


if(isset($_FILES['userfile'])){
    foreach ($_FILES['userfile']['name'] as $key => $value) {
        echo "<b>".$value."</b>";
        $uploadfile = $uploaddir.basename($_FILES['userfile']['name'][$key]);
        if (copy($_FILES['userfile']['tmp_name'][$key], $uploadfile)){
            echo "OK<br>";
        }
        else {
            echo "Error";
            //exit;
        }
        echo "<p><b>Name</b>: ".$_FILES['userfile']['name'][$key]."</p>";
        echo "<p><b>Mime-type</b>: ".$_FILES['userfile']['type'][$key]."</p>";
        echo "<p><b>Size</b>: ".$_FILES['userfile']['size'][$key]."</p>";
        echo "<p><b>TMP Name</b>: ".$_FILES['userfile']['tmp_name'][$key]."</p>";
        echo "<hr>";
    }
}
?>
    <form method="post" enctype="multipart/form-data">
      <input type="file" name="userfile[]" multiple="true">
      <input type="submit" value="upload">
    </form>
  </BODY>
</HTML>


Для того, чтобы примонтировать WebDAV в FreeBSD 9.2 нам нужно установить порт:

pkg_add fusefs-sshfs

cd /usr/ports/sysutils/fusefs-wdfs/
make install clean

/usr/local/etc/rc.d/fusefs start

Создаём точку монтирования:

mkdir /home/user/yandex.disk

Монтируем таким образом:

wdfs https://webdav.yandex.ru /home/user/yandex.disk -o accept_sslcert,username=LOGIN,password=PASSWORD

Если нужно, чтобы пользователи могли монтировать, нужно проделать следующее:

sysctl vfs.usermount=1

chmod 766 /dev/fuse

chmod 766 /dev/fuse0

/usr/local/etc/rc.d/fusefs restart

Добавляем в автозагрузку:

echo ‘fusefs_enable=”YES”‘ >> /etc/rc.conf

Возможно, на каком-то из этапов понадобится подгрузить модуль:

kldload fuse_module/fuse.ko

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

Редактируем ~/.config/lxsession/Lubuntu/desktop.conf

Находим секцию и меняем значение laptop_mode на yes:

[State]
laptop_mode=yes

Сохраняем, перезагружаем систему.

Почему-то часто забываю как правильно написать формат команды в /etc/sudoers (во FreeBSD /usr/local/etc/sudoers), чтобы вызывать sudo su без ввода пароля, оставлю же это здесь:

user     ALL=(ALL) NOPASSWD: ALL