MC (midnight commander): вы не умеете его готовить.
Да-да. Вы все делаете неверно. MC - хоть и не заменяет консоль, но часто бывает полезен и для некоторых даже незаменим. Пусть он и является лишь оболочкой для ползанья по файловой системе, но очень функциональной оболочкой.
Обычно ведь как: f5 (скопировать), f6 (переместить), f3 (посмотреть), f4 (отредактировать), f8 (удалить), f7 (создать катало) и f10 (выйти).
Это тот набор команд, которым чаще всего пользователь и ограничивается.
Ах да - еще TAB чтобы переключиться из одной панели в другую.
Остаемся в текущей папке при выходе из mc.
Вы замечали, что при выходе из mc вы всегда возвращаетесь в ту папку, в которой были до его запуска. Одним это нравится, а другим нет.
В любом случае такое поведение можно поменять. А служит для этого опция -P, которой передается имя файла, в котором сейчас находится mc.
Зная имя файла по завершению процесса можно всегда вернуться в нужный катало. Для этого есть скрипт mc-wrapper.sh. Прописываем у себя в .bashrc.
alias mc='. /usr/libexec/mc/mc-wrapper.sh'
В вашей системе этот скрипт может лежать по другому адресу. После запуска шелла можно посмотреть на вывод команды alias и удостоверится, что нужный алиас прописан. Таким образом мы будем сохранять каталог после выхода из менеджера.
Выбор файлов
- [insert] (или [ctrl-t]) - выбор текущего файла или снятие выбора с текущего файла (так же позволяет выбирать несколько файлов/папок)
- [+] - выбор файлов и папок имена которых попадают под введенный паттерн
- [/] - убирает выбор с файлов и папок име
- [*] - реверсивное выделение файлов. Инвертирует состояние выбран\не выбран для всех файлов в текущем окне (именно файлов. не папок)
Доступ в шелл
- вы можете вводить любую команду - просто начинаете печатать и она появляется внизу в маленьком приглашении ввода вашего шелла. Нажатие на [enter] запустит ее на исполнение.
- не пытайтесь нажать [tab] в попытках вызвать автодополнение - вы просто смените текущую панель. Чтобы вызвать автодополнение надо нажать последовательность [esc tab]. Тут все как в обычном шелле - первый раз оно пытается дополнить максимально возможную часть команды, а повторное нажатие последовательности показывает ве возможные варианты (да еще и с выбором как в zsh).
- а если надо показать большой терминал? На надо выходить из mc - нажимаете [ctrl-o] и панели файловый менеджер скрывается оставляя вас наедине с консолью. Чтобы его вернуть заново нажимает [ctrl-o].
- [alt-enter] - копирует имя текущего выбранного файла в строку терминала (удобно для передачи имени каким-нибудь командам)
Встроенный просмотрщик [f3] и редактор [f4]
- Встроенный вьювер умеет показывать содержимое разных файлов не просто в сыром режиме (когда в pdf будут видны управляющие инструкции, а в гифке - байты), а в виде документа, который адаптирован для отображения в текстовом виде (конечно если у вас есть сопутствующий софт вроде pdf2text).
- Чтобы увидеть сырые данные жмем [f8] в самом просмотрщике, либо [shift-f3] при открытии файла (а не [f3]).
- Так же mc умеет использовать внешние редакторы и просмотрщики (задаются переменными PAGER и EDITOR в вашем .bashrc). Чтобы включить использование внешних редакторов выбираем соответствующую опцию в настройках
Работа с панелями
- [alt-,] - переключить режим разбиения с вертикального на горизонтальный
- [alt-t] - циклическая смена режима отображения панели
- [alt-i] - синхронизирует вторую панель с текущей (полезно если вам надо быстро открыть одну и ту же папку в двух панелях)
- [ctrl-u] - поменять панели местами
- [alt-o] - если текущий элемент директория, то откроет ее во второй панели и сместит выделение на один элемент вперед. Если же текущий элемент файл - откроет содержимое родительской директории в соседней панели и сместит выделение.
- [ctrl-pgup] - перейти к родительской директории (если включена навигация в стиле lynx, то просто стрелка влево)
- [alt-shift-h] - показать историю перемещения по папкам
- [alt-y] - перейти в предыдущую папку из истории
- [alt-u] - перейти в следующую папку из истории
Поиск
- [alt-?] - открывает диалог поиска файлов
- [alt-s] - быстрый поиск элемента в текущем каталоге по регулярному выражению
- [ctrl-s] - бысрый поиск в текущем каталоге по совпадению
Основные сочетания
- [ctrl-space] - посчитать объем каталога под выделением
- [ctrl-x s] - создать символическую ссылку
- [ctrl-x h] - создать жесткую ссылку
- [ctrl-x o] - открыть редактор сhown на элемент
- [ctrl-x c] - открыть редактор chmod на элемент
- [alt-.] - скрыть\отобразить dot-файлы
Виртуальные файловые системы (vfs)
Эта концепция относительно mc позволяет нам путешествовать по архивам, sftp-серверам, rpm-файлам так, словно мы работаем с локальной файловой системой.
Попробуйте в mc набрать команду
cd ftp://mirror.yandex.ru/
Вы не сможете отличить vfs от локальной системы только по скорости работы. Если у вас есть соответствующий доступ, то даже редактировать файлы на vfs возможно.
Таким нехитрым образом можно попадать внутрь любых других источников, который поддерживаются mc.
Введите cd без параметров и вы попадете в домашнюю директорию.
Полезные команды
- [ctrl-x d] - сраврение директорий
- [ctrl-] - переход в директорию быстрого доступа (и управление этим списком)
Полезные настройки
- левая\правая панель - формат списка. позволяет задать пользовательский формат вывода информации (чтобы посмотреть доступные поля нажмите [f1]
- Конфигурация
- детали операции/подсчитывать размер - в совокупности эти две опции дадут более информативное окно копирования файлов (а если убрать, то копирование будет работать гораздо быстрее)
- Автоматически сохранять настройки - полезно чтобы постоянно не нажимать “сохранить настройки”
- Внешний вид
- строка подсказки - дасть немного больше места на экране если убрать (скроется совет дня)
- равный размер панелей - если мы включим разный режим отображения в каждой из панелей (древовидный и подробный), то получим проводник :)
- Настройка панелей
- автосохранение настроек панелей - будут удобно чтобы каждый раз не выбирать режим отображения панели заново
- навигация в тиле lynx - быстрая навигация стрелками
AngularJS: сервисы, фабрики, провайдеры
Чтоже это за странные service, factory и provider. Казалось бы - выполняют почти одну и туже функцию, подключаются через DI. Зачем их так много?
На абстрактный пример можно глянуть тут (к слову, автор привел очень хороший пример).
Но никто не рассказывает, зачем оно в реальной практике нужно.
Сервис
Он чаще всего используется для создания разделяемого ресурса.
var constructor = function constructor() {
this.foo = 'foo'
this.bar = function bar() {
}
}
.service('someService', constructor)
Когда сервис создается первый раз, то выполняется
var someServiceImpl = new constructor()
И в дальнейшем при подключении зависимостей через DI в объекты будет всегда передаваться someServiceImpl.
Фабрика
это более продвинутая конструкция. Она не является разделяемым ресурсом сама по себе. При каждом использовании фабрики через DI ее значение - это результат вызова фабричной функции.
var factoryFn = function () {
var someClass = function() {}
return someClass;
}
.factory('someFactory', factoryFn)
При первом инстанцировании фабрики будет вызвана функция factoryFn и ее результат - это уже и есть разделяемое между всеми участниками системы значение.
Свое применения фабрика находит в первую очередь для реализации моделей. Как в примере выше. Создается и описывается класс модели someClass и фабрика при инстанцировании возвращает ссылку на него. В последующем можно использовать этот класс как конструктор объектов.
.controller('someController', ['someFactory', function(someFactory) {
// Тут мы успешно инстанцируем новый объект someClass
var someClassImpl = new someFactory();
}])
Провайдер
Это тоже фабрика. Но более продвинутаця. Так же точно при первом инстанцировании провайдера выполняется некая функция и ее результат становится разделяемым значением.
Но вся мощь провайдеров в том, что их можно конфигурировать (в отличие от фабрик или сервисов). Т.е. на этапе инициализации вашего приложения можно передать провайдеру некоторые опции, которые нельзя указать в дальнейшем.
Как пример - библиотека для oauth-авторизации. на этапе конфигурирования в нее передаются токены.
var providerFn = function() {
var someModel = function() {
// это модель
}
this.configure = function() {
// делаем какую-то конфигурацию
}
this.$get = function() {
return new someModel()
}
}
.provider('someProvider', providerFn)
И теперь самое интересное: при подключении провайдера через DI в качестве разделяемого объекта будет выступать то, что вернула функция $get.
В то же время на этапе конфигурирования нам доступен сам инстанс providerFn и мы можем использовать его функционал по конфигурированияю
.config(['someProvider', function(someProvider) {
//...
someProvider.configure(options)
}])
OpenVPN: Настройка на собственном сервере. Часть 4 - конфигурация клиента.
- OpenVPN: Настройка на собственном сервере. Часть 0 — подготовка системы.
- OpenVPN: Настройка на собственном сервере. Часть 1 — сертификаты.
- OpenVPN: Настройка на собственном сервере. Часть 2 — конфигурация сервера.
- OpenVPN: Настройка на собственном сервере. Часть 3 — iptables
- OpenVPN: Настройка на собственном сервере. Часть 4 — конфигурация клиента.
Последняя часть расскажет о том, какие файлы нужно передать клиенту чтобы он мог подключаться к вновь созданному серверу.
В первой части было сказано, что клиенту потребуются следующие файлы ключей:
~/CA/pki/issued/User.crt
~/CA/pki/private/User.key
~/CA/pki/ca.crt
/etc/openvpn/keys/ta.key
Скопируем их в отдельный каталог. Так же в этом каталоге создадим файл connect.ovpn следующего содержания:
client
dev tun
proto udp
remote X.X.X.X 1194
tls-client
ca "ca.crt"
tls-auth "ta.key" 1
cert "User.crt"
key "User.key"
remote-cert-tls server
comp-lzo
tun-mtu 1500
mssfix 1450
verb 3
nobind
Где X.X.X.X - это айпишник вашего сервера.
Передаем пять этих файлов пользователю и теперь на клиенте можно подключаться:
$ sudo openvpn connect.ovpn
OpenVPN: Настройка на собственном сервере. Часть 3 — iptables
- OpenVPN: Настройка на собственном сервере. Часть 0 — подготовка системы.
- OpenVPN: Настройка на собственном сервере. Часть 1 — сертификаты.
- OpenVPN: Настройка на собственном сервере. Часть 2 — конфигурация сервера.
- OpenVPN: Настройка на собственном сервере. Часть 3 — iptables
- OpenVPN: Настройка на собственном сервере. Часть 4 — конфигурация клиента.
В предыдущей части мы наконец-то сервер запустили. Но достучаться до него возможности нет поскольку iptables все еще не настроены и блокируют все подряд.
Как сказали на одном из формумов: в сети есть множество руководств по iptables для openvpn, но ни одно из них не работает.
В продолжении еще одно :)
Разрешаем коннекты к серверу (в прошлый раз мы настроили дефолтный впн через udp. Поэтому здесь мы открываем только подключение udp.
iptables -I INPUT -i eth0 -m state --state NEW -p udp --dport 1194 -j ACCEPT
Обратите внимание, что нужно использовать модификатор -I, который добавит это правило первым к цепочке. Если же использовать -A как рекомендуют некоторые, то правило будет добавлено к цепочке последним. А как мы знаем - последним правилом в цепочке стоит reject. И это значит, что добавляй после него или не добавляй правила - ничего не заработает.
Кстати из-за подобной ошибки (способа добавления правила в цепочку можно порой у некоторых видеть такую ошибку:
TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
TLS Error: TLS handshake failed
Это как раз значит, что сервер не смог ответить на “рукопожатие”. Т.е. порт заблокирован или где-то на пути к серверу не работает форвардинг пакетов.
Теперь разрешим интерфейсу tun коммуникацию с другими интерфейсами в системе.
iptables -I FORWARD -i tun+ -j ACCEPT
iptables -I FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
Включим nat (как вы помните из предыдущей части - сервер настроен в режиме роутера, а не моста - поэтому nat обязателен).
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
В цепочке POSTROUTE чаще всего нет reject. Поэтому смело используем -A.
И последний шаг - разрешить исходящий трафик на tun-инмерфейсе.
iptables -A OUTPUT -o tun+ -j ACCEPT
Теперь самый важный шаг: проверить, что все заработало
$ sudo nmap -sU -p1194 X.X.X.X
Starting Nmap 7.00 ( https://nmap.org ) at 2016-01-24 21:33 MSK
Nmap scan report for X.X.X.X
Host is up (0.089s latency).
PORT STATE SERVICE
1194/udp open|filtered openvpn
Nmap done: 1 IP address (1 host up) scanned in 1.08 seconds
Если у вас похожий вывод - сохраняем правила iptables и генерируем клиентский конфиг в следующей части.
$ sudo /usr/libexec/iptables.init save
Ниже конфиг /etc/sysconfig/iptables, который я приведу для сравнения (если у вас что-то не заработало).
*nat
:PREROUTING ACCEPT [80:8210]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [24:11832]
:POSTROUTING ACCEPT [24:11832]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [66:10292]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i tun+ -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -i tun+ -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -o tun+ -j ACCEPT
COMMIT
OpenVPN: Настройка на собственном сервере. Часть 2 — конфигурация сервера.
- OpenVPN: Настройка на собственном сервере. Часть 0 — подготовка системы.
- OpenVPN: Настройка на собственном сервере. Часть 1 — сертификаты.
- OpenVPN: Настройка на собственном сервере. Часть 2 — конфигурация сервера.
- OpenVPN: Настройка на собственном сервере. Часть 3 — iptables
- OpenVPN: Настройка на собственном сервере. Часть 4 — конфигурация клиента.
Ключи сгенерировали. Теперь можно запускать сервер.
Обращаю внимание, что дальше речь пойдет о дефолтной настройке openvpn в режиме роутера. Это тот режим, когда вам нет необходимости интегрировать подключенных клиентов в локальную сеть.
В случае необхоидмости пустить клиентов в локальную сеть вам потребуется режим моста.
Поддробнее про разные режимы работы можно почитать в официальной документации: https://community.openvpn.net/openvpn/wiki/BridgingAndRouting.
Копируем конфиг сервера
$ sudo cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn
Теперь нужно отредактировать этот конфиг поправив следующие параметры
# пути к сертификатам ставим свои
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key # This file should be kept secret
dh /etc/openvpn/keys/dh.pem
# заставляем клиент направлять весь трафик через сервер (чтобы избежать всяких утечек днс-запросов)
push "redirect-gateway def1 bypass-dhcp"
# пропишем собственные dns
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# защита от флуда
tls-auth /etc/openvpn/keys/ta.key 0 # This file is secret
# сразу после запуска у сервера будут отобраны рутовые права (безопасности больше)
user nobody
group nobody
Если есть желание - можно поправить порт.
Теперь сервер можно активировать и запустить. Толку от этого пока будет мало. поскольку настройкой брандмауэра мы займемся в следующей части.
$ sudo systemctl -f enable openvpn@server.service
$ sudo systemctl start openvpn@server.service