LINUX.ORG.RU

Сообщения abr_linux

 

Bash. Разделить строчку на две

Имеется файл, в каждой строке которого имеется два слова, разделённых пробелом. Как разделить в две переменные ети слова? Пробую:

cat text.txt | while read line
do
        word1=`echo $line | sed 's/\(^.*\) .*$/\1/g'`
        word2=`echo $line | sed 's/^.*\( .*$\)/\1/g'`
        #some_stuff
done

Дело в том, что в #some_stuff сравнивается около 80000 таких строк с такого же типа 80000 строками и работает всё очень медленно. Есть ли более быстрые варианты, помимо sed?

abr_linux
()

Можно ли при помощи bash узнать, является ли одно слово анаграммой для второго?

Анаграмма - ето когда кол-во буквы просто переставлены, но количество каждой из них неизменно. Например, «лес» и «сел», «апельсин» и «спаниель» и пр. Как-то можно при помощи bash, возможно, в regexp проверить, являются ли два слова анаграммами друг другу?

abr_linux
()

Regexp. Как найти вхождения, в которых нет заданной строки?

Мне нужно во всех строках в некотором файле найти строки, в которых нет строки ".ru" Что пробую:

egrep -E '.ru' text.file
правильно выводит те строки, которые выводить НЕ надо

Пытаюсь:

egrep -E '\(?!.ru\)' text.file
вобще ничего не выводит? ЧЯНТД?

abr_linux
()

Не разберусь с маршрутизацией (ip route)

Есть шлюз. Вот некоторые настройки:

# ip route
xx.xx.xx.0/24 dev eth1.20  proto kernel  scope link  src xx.xx.xx.207 
xx.xx.xx.0/24 dev eth1  proto kernel  scope link  src xx.xx.xx.205 
192.168.1.0/24 dev eth2  proto kernel  scope link  src 192.168.1.240 
default via xx.xx.xx.205 dev eth1  scope link

xx.xx.xx.205 - наш внешний IP 192.168.1.240 - внутренний адрес шлюза

# iptables -L -t nat -n
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.1.0/24       0.0.0.0/0           mark match !0x1 to:xx.xx.xx.205 

На шлюзе есть ipsec, который соединяет нашу 192.168.1.0/24 подсеть с 192.168.3.0/24 подсетью.

Суть задачи: в сети есть второй роутер с адресом 192.168.1.250, на который надо направить весь интернет трафик. А по текущему каналу оставить только ipsec и один сайт: yy.yy.yy.yy.

Делаю что:

# ip route add 192.168.3.0/24 via xx.xx.xx.205 table 100
# ip route add yy.yy.yy.yy via xx.xx.xx.205 table 100
# ip route add default via 192.168.1.250 table 100
# iptables -t nat -F
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -m mark ! --mark 0x1 -j SNAT --to-source 192.168.1.240
# ip rule add from 192.168.1.0/24 table 100
В результате не работает интернет. По ipsec пакеты ходят, к сайту yy.yy.yy.yy - тоже. Пробую по-другому:
# ip route add 192.168.3.0/24 via xx.xx.xx.205 table 100
# ip route add yy.yy.yy.yy via xx.xx.xx.205 table 100
# ip route add default via 192.168.1.250 table 100
# ip route del default table main
# iptables -t nat -F
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -m mark ! --mark 0x1 -j SNAT --to-source 192.168.1.240
# ip rule add from 192.168.1.0/24 table 100
Не работает ни интернет, ни ipsec.

Оставляю первый вариант, но без правки iptables:

# ip route add 192.168.3.0/24 via xx.xx.xx.205 table 100
# ip route add yy.yy.yy.yy via xx.xx.xx.205 table 100
# ip route add default via 192.168.1.250 table 100
# iptables -t nat -F
# ip rule add from 192.168.1.0/24 table 100
Все пакеты ходят через xx.xx.xx.205

Как надо написать правила, чтобы решить задачу?

abr_linux
()

Поясните по iptables match mark

Сижу читаю конфиги маршрутизации предыдущего админа, не понятны несколько моментов по iptables. Дело в том, что теоретически я знаю, что такое match mark, set mark, а вот до практики дело не доходило.

Есть такие строчки в таблице nat:

Chain POSTROUTING (policy ACCEPT)
SNAT       all  --  172.16.201.172       0.0.0.0/0           mark match !0x1 to:22.33.44.55
SNAT       all  --  10.1.1.5             0.0.0.0/0           mark match !0x1 to:11.22.33.44
SNAT       all  --  192.168.1.0/24       0.0.0.0/0           mark match !0x1 to:11.22.33.44

ЗЫ. 11.22.33.44, 22.33.44.55 - внешние IP-адреса нашего шлюза (два канала). Что делает здесь «mark match !0x1»?

И вот щё интересные строки в mangle:

Chain PREROUTING (policy ACCEPT)
MARK       all  --  0.0.0.0/0            192.168.3.0/24      MARK xset 0x1/0xffffffff 
Они как-то связаны с IPSec. Я точно знаю, что если их не будет, то из сети 192.168.1.0/24 (нашей сети) пакеты в 192.168.3.0/24 (за ipsec) будут идти напрямую через провайдера, а тот их будет отфутболивать с контекстом «ты хто и куда ломишся??». А при наличии данной строки они инкапсулируются в ipsec и идут уже по правильному направлению. Но как ето происходит не совсем понятно.

abr_linux
()

Возможен ли вывод второго рабочего стола на другой монитор?

В компе стоит AMD-шная карточка. Какая - пока что не имею понятия, но на данный момент не суть важна. Поправте меня, если считаете, что ето не так. На карточке имеется выходы VGA и DVI. В оба включены мониторы, второй монитор - DVI (соединён через переходник, потому что на самом монике разъём только VGA, что тоже пока что не суть важно). Система Ubuntu 10.04. Захожу в «Система» - «Параметры» - «Мониторы», нажимаю определить мониторы - всё прекрасно определяется. Ставлю второй монитор над первым. Пока что всё ок. Но.. Не нравится, что при подведении мышки к верхнему меню, курсор то и дело переезжает в верхний монитор. Посему хочу сделать так, чтобы на верхний монитор выводился какой-нть другой рабочий стол, а мышка ездила только по основному.

Игрался xrandr-ом - понял суть того, как выводится изображение на оба монитора. Но до решения поставленной задачи пока не добрался. Подскажите, возможно ли решить задачу с условиями что описаны выше: без драйверов, одними силами оконного менеджера и Xorg-а? Если нет, то что бы вы посоветовали сделать, чтобы хотя б приблизится к решению?

 , , ,

abr_linux
()

Два провайдера, правила маршрутизации

Добрый день! Есть два интернет канала. Хочу сделать так, чтобы некоторые пакеты на одни адреса шли по одному каналу, остальные - по второму. Что уже получилось. Допустим, мой шлюз, который я настраиваю, имеет адрес 192.168.1.1, шлюз первого провайдера (основной канал) 222.111.211.1, шлюз второго - 192.168.1.2 (обычный роутер внутри локальной сети, ADSL-доступ к второму провайдеру). Необходимо, чтобы пакеты на адрес 8.8.8.8 гулял через 192.168.1.2, остальные - через 222.111.211.1 Пишу маршрут:

route add -host 8.8.8.8 gw 192.168.1.2

route add default gw 222.111.211.1

И записывают SNAT в iptables: iptables -t nat -A POSTROUTING -d 8.8.8.8 -j SNAT --to-source 192.168.1.1

В таком случае пакет на 8.8.8.8 спокойненько проходит через роутер, остальные идут через первый канал.

Вопрос в том, можно ли забабахать такую маршрутизацию при помощи squid? Дело в том, что таких адресов, как 8.8.8.8 из примера может быть сотня. Не забивать же таблицы route и iptables? Если не сложно, то с примерами. Я знаю про опцию tcp_outgoing_address, но я так понимаю, что там-таки route также править надо. В общем, я её сути пока не вкурил и то ли ето вобще..

abr_linux
()

Переброс пакетов со шлюза на шлюз

Сначала вопрос: Как организовать переадресацию пакетов с одного шлюза на другой? Подручные средства: iptables, route, squid.

Теперь суть. У нас имеется шлюз, который в данный момент обрабатывает весь внешний обмен: интернет и ipsec. Чтобы не загружать особо ipsec решили подключить второй интернет и поставили роутер, который находится в локальной сети. В настоящий момент есть идеи по переносу второго роутера на один свитч с первым и балансировка канала по двум провайдерам. Правда, ето может занять довольно много времени и не без глюков для начала (в то время, как важно качество работы в ущерб правильной архитектуре) и как план B я хочу просто перебрасывать некоторые пакеты со шлюза на второй роутер, который во внутренней сети. Так вот, как ето сделать, чтобы пакет мог обработать squid, а потом перекинуть на второй шлюз?

abr_linux
()

Шлюз: два интернет канала, одна сетевая, шейпер

Добрый день! Если не трудно киньте в меня мануалами или дайте советы по настройке такой конфигурации: 2 канала в интернет. Первый - статический адрес прописывается на сетевой. Второй - ADSL через роутер. Скорости разные. Сетевых карт на будущем шлюзе две. Одна из них - локалка. Получается, что нужен алиас для сетевой или есть другие способы? Необходимо поставить шейпер. Тут хотелось бы узнать, как лучше трафик резать, на каждом канале или сразу общий?

abr_linux
()

OpenVPN, условная маршрутизация

Добрый день! Настроен OpenVPN следующим образом:

port 2000
proto tcp
dev tun

ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/gw.crt
key /etc/openvpn/keys/gw.key # This file should be kept secret
dh /etc/openvpn/keys/dh1024.pem

server 172.16.130.0 255.255.255.0 # vpn subnet

ifconfig-pool-persist ipp.txt

push "route 192.168.1.0 255.255.255.0" # home subnet
push "dhcp-option DNS 192.168.1.240" #DNS
push "dhcp-option DOMAIN firm.local" #DNS suffix
push "dhcp-option WINS 192.168.1.240" #WINS

keepalive 10 120

comp-lzo
user nobody
group nogroup
persist-key
persist-tun

status /var/log/openvpn/openvpn-status.log
log-append  /var/log/openvpn/openvpn.log

verb 4
mute 20
client-to-client
client-config-dir /etc/openvpn/ccd

192.168.1.240 - шлюз, на котором запущен OpenVPN. Етот сервер показывает VPN-клиентам сетку 192.168.1.0/24.

Работает всё, как надо за исключением одного. Смысл OpenVPN в том, чтобы сотруднику из дому подключится к сети и запустить 1С.

Действия 1С просты: отправляется broadcast на 255.255.255.255 с запросом на получение ключа и впоследствии один из компов, на котором установлен ключ, отвечает, мол ключ тут, на тебе его данные. Всё ето происходит по UDP.

Проблема в том, что етот броадкаст не доходит до шлюза (сервера VPN). Как победить?

Вывод route print на клиенте (Win7) при запущенной OpenVPN: http://s2.ipicture.ru/uploads/20120619/R57f9mg2.png

Всё, что относится к сети 10.x.x.x - ето Yota, провайдер. 172.16.130.14 - клиентский VPN IP.

abr_linux
()

Настройка OpenVPN

Добрый день! Помогите разобратся с настройкой OpenVPN.

Есть сеть 192.168.1.0/24, есть шлюз с внешним IP 55.55.55.55, есть домашний комп с внешним IP 77.77.77.77. Надо соединить их по OpenVPN. Нарисовал такой конфиг на шлюзе:

port 2000
proto tcp
dev tun

ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/gw.crt
key /etc/openvpn/keys/gw.key # This file should be kept secret
dh /etc/openvpn/keys/dh1024.pem

server 172.16.130.0 255.255.255.0 # vpn subnet

ifconfig-pool-persist ipp.txt

push "route 172.16.130.0 255.255.255.0"
push "route 192.168.1.0 255.255.255.0" # home subnet

keepalive 10 120

comp-lzo
user nobody
group nogroup
persist-key
persist-tun

status /var/log/openvpn/openvpn-status.log
log-append  /var/log/openvpn/openvpn.log

verb 4
mute 20
client-to-client
client-config-dir /etc/openvpn/ccd

Суть в том, что клиент по OpenVPN к серваку подключается и получает адрес 172.16.130.14, сам сервак для себя выбрал адрес 172.16.130.1. Проблема в том, что пинга нет ни между 172.16.130.1 и 172.16.130.14, ни тем более между клиентской машиной и 192.168.1.0 подсетью. ЧЯНТД?

ЗЫ. Делал по мануалу: http://www.volmed.org.ru/wiki/index.php/Настройка_OpenVPN_сервера

abr_linux
()

Yota LTE, раздача на несколько компов, Ubuntu 12.04

Модем Yota поднимает сетевой интерфейс на компе и определяется, как eth1. С пользованием интернет на том компе, куда она подключена проблем нет вобще. Они начинаются, если попробовать выходить в интернет со второго компа, который подключен через свитч. На втором компе шлюзом установлен первый, DNS - «8.8.8.8». Сайты не грузятся в принципе. Выяснил, что гасится всё в момент запроса на DNS-сервер. Каким-то образом етот запрос Yota не пропускает. Причём, только по UDP. Командой «host -T» всё резолвится, как надо. В iptables ситуация такая: *filter :INPUT ACCEPT [4654:1916205] :FORWARD ACCEPT [642:357499] :OUTPUT ACCEPT [5321:2653325] COMMIT *mangle :PREROUTING ACCEPT [9375:4820036] :INPUT ACCEPT [8555:4400019] :FORWARD ACCEPT [655:358399] :OUTPUT ACCEPT [9413:4140131] :POSTROUTING ACCEPT [10055:4497630] [16:960] -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu COMMIT *nat :PREROUTING ACCEPT [431:96586] :INPUT ACCEPT [170:10272] :OUTPUT ACCEPT [1701:115119] :POSTROUTING ACCEPT [1698:114883] [26:1646] -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE COMMIT

Вопросов несколько по данной теме. 1. Куда могут деватся проходящие UDP-запросы к DNS-серверам и как поймать хоть какие-то сообщения? 2. Каким образом резолвит адреса первый комп, если у него в /etc/resolv.conf стоит одиноко «127.0.0.1»? 3. Почему их не резолвит второй комп, если DNS-ом у него будет стоять первый?

abr_linux
()

Рекурсивные функции

Увидел задачку, немного в ступор впал:

#include «stdio.h»
int fact_rec2(int n)
{
int a;
if(n<1) return 0;
if(n==1) return 1;
a=n*fact_rec2(n-1);
return a;//почему эту строчку можно не писать?
}

int main(int argc, char* argv[])
{
int x;//=0;
scanf(«%d»,&x);
printf(«%d\n»,fact_rec2(x));
return 0;
}

Ето какая-та фича рекурсивных функций или оптимизации. Или я просто туплю?

abr_linux
()

Создание своего мини liveCD

Добрый вечер!

Хочу создать свою систему, которая загрузится и просто появится приглашение sh.

Вот, что делаю (из-под Ubuntu 10.04):

1. Скомпилил ядро (3.2.1):

$ make defconfig && make

2. Затем собираю загрузочный диск: $ mkdir -p fs/isolinux

$ cp /usr/lib/syslinux/isolinux.bin fs/isolinux

$ cat «DEFAULT Linux

LABEL Linux

KERNEL bzImage

APPEND initrd=initrd root=/dev/ram0» > fs/isolinux/isolinux.cfg

3. Собираю initrd:

$ dd if=/dev/zero of=fs/isolinux/initrd bs=1M count=4

$ mke2fs fs/isolinux/initrd

$ mkdir initrd.fs

$ mount -o loop fs/isolinux/inird initrd.fs/

4. Компилю busybox (1.19.3):

$ make defconfig && make

$ make CONFIG_PREFIX=$HOME/live/initrd.fs install

5. Создаю устройство ram0:

$ mkdir initrd.fs/dev

$ touch initrd.fs/dev/ram0

6. Собираю iso-шник:

$ mkisofs -l -r -J -hide-rr-moved -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -V «bbLive» -o live.iso fs/

При загрузке пишет:

RAMDISK: ext2 filesystem found at block 0

RAMDISK: Loading 4096Kib [1 disk] into ram disk... done

VFS: Mounted root (ext2 filesystem) readonly on device 1:0

devtmpfs: mounted

Freeing unused kernel memory: 956k freed

Write protecting the kernel read-only data: 10240k

Freeing unused kernel memory: 200k freed

Freeing unused kernel memory: 1620k freed

Kernel panic - not syncing: No init found. Try passing init= option to kernel.

Причём, когда я собирал в первый раз по мануалу, который на данный момент утерял, системка уже загружалась и работала, видел приглашение sh. Счас сделал всё по памяти и по нескольким другим мануалам - работать заставить не удаётся. Init на месте - в /sbin. Что он хочет?

abr_linux
()

Создание своего LiveCD

Создаю небольшой LiveCD, который при запуске должен выполнить один скрипт (поиск разделов диска, их монтирование, поиск и редактирование файлов на примонтированных разделах) и завершить работу. Что уже получилось: Создал initrd, в котором установил собранный статически busybox (1.19.3). Ядро скачал самое последнее (3.2.1), собрал пока что по дефолтным настройкам. Ну и загрузчик - isolinux. Что получается: после загрузки системы имею командную строку sh и полный набор из busybox. Что не получается: при попытке создать каталог выскакивает ошибка, что файловая система доступна в режиме только чтения. Плюс ко всему, не могу примонтировать ни один раздел диска, хотя /dev/sda, /dev/sda1, /dev/sda2 и /dev/sda3 присутствуют. Пробовал двумя способами: создавал в initrd заранее каталог /mnt/sda1, прописывал в /etc/init.d/rcS строку «mount /dev/sda1 /mnt/sda1». В данном случае каталог sda1 из /mnt пропадал после загрузки системы. Во втором случае я пытался монтировать устройство уже в загруженной системе. В данном случае система мне пишет, что /mnt/sda1 не существует, хотя «ls /mnt» прекрасно видит етот каталог.

По мануалам из гугла читал, что загрузка выполняется в два етапа. Сначала в /dev/ram0 монтируется файловая система initrd, после етого в /dev/ram1 создаётся другая файловая система, с которой пользователь потом и работает.

У меня вопросы такие. То, что первоначальная файловая система в read-only режиме - ето нормально, или необходимо прописать какую-ту настройку при компиляции busybox'а? Ну и что мне сделать, чтобы при загрузке системы с моего LiveCD, можно было в ней создавать папки и файлы и монтировать разделы диска?

abr_linux
()

Сборка специфической системы

Добрый день! Есть задача собрать небольшую систему, суть которой сводится к довольно простой задаче: при запуске она выполняет некоторый набор скриптов и затем уходит в перезагрузку. То есть, участие человека в ней не так уж и необходимо. Также, там навряд ли нужна будет поддержка сети и некоторых других мелочей, которые по стандарту идут счас во всех дистрибутивах. На основе чего можно такую систему собрать? Я сам пока думаю, что подойдёт либо Gentoo, либо сразу LFS. Что можете вы посоветовать?

abr_linux
()

Наблюдение за сетью

Добрый день! Только что столкнулся с такой проблемой, и думаю, что не в первый раз. У нас в компании довольно обширная локальная сеть, структура ячеистая. И возникла ситуация, что один канал начал кем-то забиваться. Канал соединяет два офиса. Он важен для сети, но сам по себе довольно тонок - две витые пары, 300 метров, скорость гигабитная. Соединяет он довольно большое количество компьютеров и какие компы забивают канал выяснить не удалось (благо, проблема сама отпала). Большинство клиентов - ubuntu 10.04, малая часть - ето 5 компов с WinXP и один Win2003 Server.
Помимо етого есть IP-камеры, соединяющиеся отдельным каналом, который, однако приходит одним проводом в общую сеть. Подскажите, есть ли какая-нть программулина или система, которая бы могла наблюдать все соединения между компами в такой сети и собирать централизовано статистику по соединениям? Чтобы в нужный момент времени знать, кто из компов работает на тёмную сторону.

abr_linux
()

Найти все теги, в которых нет заданной подстроки

Необходимо при помощи regexp найти все последовательности «<a>текст</a>», причём если в тексте встретится строка «111» (например «<a>пролдж111фыва</a>»), то данный тег не должен соответствовать шаблону.
У меня максимум, что получилось, это такой шаблон: «/<a>[^4]*<\/a>/», но он бракует только строки с символом «4» между тегами. А мне необходимо браковать строку из более одного символа. Как?

abr_linux
()

Авторизация PAM + AD, узнать имя пользователя

Проблема не в том, чтобы узнать, какое имя ввёл пользователь, а в том, какая папка создастся в /home.
Объясню ситуацию. Домен AD, PAM, samba настроены так, чтобы можно было под доменным пользователем авторизоватся. Встаёт вопрос автовыполнения некоего скрипта, который создаёт некоторые файлы в домашней директории. Скрипт выполняется, но в нём данные берутся из переменной $PAM_USER, в которой регистр точно тот же, которым ввёл имя пользователь (напиример uSeR). Но если папки пользователя в /home не существует, PAM её создаёт исключительно в нижнем регистре (/home/user).
Получается, при первом входе, если пользователь побаловался регистром, в /home появляются сразу две папки: uSeR и user. Соответственно, мой скрипт пишет нужные файлы в /home/uSeR, а родная папка пользователя остаётся чистой.
Скрипт написан на bash. Вопрос: как узнать домашнюю папку пользователя, если она создаётся только во время авторизации.

abr_linux
()

PAM

Настроена аутентификация по AD (Win 2003 Server). В /etc/pam.d/common-auth на локальных машинах прописано:

auth optional pam_exec.so /usr/bin/script.sh
В данный момент script.sh успешно выполняется при входе в систему за исключением одного случая: если в домене пользователю задать обязательную смену пароля при следующей авторизации, то при входе на локальную машину выдаётся сообщение «You must change password» и скрипт не выполняется, хотя пользователь локально авторизуется. Терзают меня смутные сомнения, что прописанное в /etc/pam.d/common-auth не просматривается в данном случае в принципе. Каким образом поменять настройки, чтобы script.sh выполнялся при любой успешной локальной авторизации?

abr_linux
()

RSS подписка на новые темы