Поиск по этому блогу

суббота, 27 декабря 2014 г.

Продовження тріального використання Windows 7

Запускаємо в режимі Адміністратора cmd:

у командній строчці вводимо
slmgr.vbs /rearm
або
rundll32 slc.dll,SLReArmWindows
Перезавантажуємось. Все, отримали продовження терміну тріального використання системи ще на 120 діб.

ps: Корисна порада: аби не морочити собі голову з такими ганебними системами як Windows і не мати головного болю вивчаймо і користуємось Linux ;)

понедельник, 1 декабря 2014 г.

Доступ до Mikrotik Router OS по SSH з аутентифікацієй по публічному ключу

Для початку генеруємо сам ключ. Важливе зауваження, не RSA, а DSA.
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home//.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_dsa.
Your public key has been saved in id_dsa.pub.
The key fingerprint is:
...
Копіюємо його на Router OS:
scp /home/<user>/.ssh/id_dsa.pub admin@xxx.xxx.xxx.xxx:
У терміналі Router OS даємо команду:
/user ssh-keys import public-key-file=id_dsa.pub user=UserName
де UserName це той логін який бажаємо аутентифікувати по ключу.

вторник, 21 октября 2014 г.

FB2 читалка для Linux-консоли, fb2 to txt, fb2 to xhtml, fb2 to html

Собственно всё сводится к простому xsl-преобразованию. Для начала рисуем fb2_2_txt.xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fb="http://www.gribuser.ru/xml/fictionbook/2.0">
        <xsl:strip-space elements="*"/>
        <xsl:output method="text" encoding="UTF-8"/>
        <xsl:key name="note-link" match="fb:section|fb:p" use="@id"/>

        <xsl:template match="*">
<!-- <xsl:variable/> -->
<xsl:value-of select="fb:description/fb:title-info/fb:book-title"/>
<xsl:text >
</xsl:text>
<xsl:for-each select="fb:description/fb:title-info/fb:author">    <xsl:call-template name="author"/>
<xsl:text >
</xsl:text>
</xsl:for-each>
<xsl:text >
</xsl:text>

<xsl:if test="fb:description/fb:title-info/fb:sequence">
<xsl:for-each select="fb:description/fb:title-info/fb:sequence"><xsl:call-template name="sequence"/></xsl:for-each>
<xsl:text >
</xsl:text>
</xsl:if>
<xsl:for-each select="fb:description/fb:title-info/fb:annotation">
<xsl:call-template name="annotation"/>
<xsl:text >
</xsl:text>
</xsl:for-each>
                                <!-- BUILD BOOK -->
<xsl:for-each select="fb:body">
<xsl:if test="position()!=1">
<xsl:text >

</xsl:text>
</xsl:if>

<xsl:if test="@name">
<xsl:value-of select="@name"/>
<xsl:text >
</xsl:text>
</xsl:if>
<!-- <xsl:apply-templates /> -->
<xsl:apply-templates/>
</xsl:for-each>
<xsl:text >
</xsl:text>
        </xsl:template>
        <!-- author template -->
<xsl:template name="author">
        <xsl:value-of select="fb:first-name"/>
        <xsl:text> </xsl:text>
        <xsl:if test="fb:middle-name and fb:middle-name!=''">
                <xsl:value-of select="fb:middle-name" />
                <xsl:text> </xsl:text>
        </xsl:if> 
        <xsl:value-of select="fb:last-name"/>
        <xsl:text >
</xsl:text>
</xsl:template>
        <!-- secuence template -->
<xsl:template name="sequence">
<xsl:value-of select="@name"/><xsl:if test="@number"><xsl:text > #</xsl:text><xsl:value-of select="@number"/></xsl:if>
<xsl:if test="fb:sequence">
        <xsl:for-each select="fb:sequence">
<xsl:call-template name="sequence"/>
</xsl:for-each>
</xsl:if></xsl:template>

<!-- description -->
<xsl:template match="fb:description">
<xsl:apply-templates/>
<xsl:text >
</xsl:text>
</xsl:template>
<!-- body -->
<xsl:template match="fb:body">
<xsl:text >
</xsl:text>
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="fb:section">
<xsl:text >
</xsl:text>
<xsl:apply-templates select="./*"/>
</xsl:template>


<!-- section/title -->
<xsl:template match="fb:title">
<xsl:text >

</xsl:text>
<xsl:apply-templates/>
<xsl:text >
</xsl:text>
</xsl:template>

        <!-- subtitle -->
<xsl:template match="fb:subtitle">
<xsl:text >
</xsl:text>
<xsl:apply-templates/>
<xsl:text >

</xsl:text>
</xsl:template>

<!-- p -->
<xsl:template match="fb:p">
<xsl:apply-templates/>
<xsl:text >

</xsl:text>
</xsl:template>

<xsl:template match="fb:p" mode="note">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="fb:title" mode="note">
<xsl:apply-templates mode="note"/><xsl:text disable-output-escaping="yes"> - </xsl:text>
</xsl:template>


<xsl:template match="fb:strong|fb:emphasis|fb:style"><xsl:apply-templates/></xsl:template>

<xsl:template match="fb:a">
<xsl:choose>
<xsl:when test="(@type) = 'note'">
<xsl:choose>
<xsl:when test="starts-with(@xlink:href,'#')"><xsl:for-each select="key('note-link',substring-after(@xlink:href,'#'))">[<xsl:apply-templates mode="note"/>]</xsl:for-each></xsl:when>
<xsl:otherwise><xsl:for-each select="key('note-link',@xlink:href)">[<xsl:apply-templates mode="note"/>]</xsl:for-each></xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<xsl:template match="fb:empty-line">
<xsl:text >

</xsl:text>
</xsl:template>

<!-- annotation -->
<xsl:template name="annotation">
<xsl:apply-templates/>
<xsl:text >
</xsl:text>
</xsl:template>

<!-- epigraph -->
<xsl:template match="fb:epigraph">
<xsl:apply-templates/>
<xsl:text >
</xsl:text>
</xsl:template>

<!-- cite -->
<xsl:template match="fb:cite">
        <xsl:text >

</xsl:text>
        <xsl:apply-templates/>
        <xsl:text >
</xsl:text>
</xsl:template>


        <!-- cite/text-author -->
<xsl:template match="fb:text-author">
        <xsl:text >    </xsl:text>
        <xsl:apply-templates/>
        <xsl:text >
</xsl:text>
</xsl:template>
        <!-- date -->
<xsl:template match="fb:date">
        <xsl:text >    </xsl:text>
        <xsl:apply-templates/>
        <xsl:text >
</xsl:text>
</xsl:template>

<xsl:template match="fb:poem">
<xsl:apply-templates/>
</xsl:template>

        <!-- stanza -->
<xsl:template match="fb:stanza">
<xsl:apply-templates/>
<xsl:text >
</xsl:text>
</xsl:template>
        <!-- v -->
<xsl:template match="fb:v">
<xsl:text >               </xsl:text>
<xsl:apply-templates/>
<xsl:text >
</xsl:text>
</xsl:template>

</xsl:stylesheet>


Затем, в консоли, выполняем:
zcat book.fb2.zip | xsltproc fb2_2_txt.xsl - | less -s

Более того, подобное преобразование можно выполнить для преобразования fb2 в xhtml, с сохранением картинок (спасибо tkf http://habrahabr.ru/post/75827/), файл fb2_22_xhtml.xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fb="http://www.gribuser.ru/xml/fictionbook/2.0">
        <xsl:output method="xml" encoding="UTF-8"/>
        <xsl:key name="note-link" match="fb:section" use="@id"/>
        <xsl:template match="/*">
                <html>
                        <head>
                                <xsl:if test="fb:description/fb:title-info/fb:lang = 'ru'">
                                        <meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=UTF-8"/>
                                </xsl:if>
                                <title>
                                        <xsl:value-of select="fb:description/fb:title-info/fb:book-title"/>
                                </title>
                                <style type="text/x-oeb1-css">
                                        A { color : #0002CC }
                                        A:HOVER { color : #BF0000 }
                                        BODY { background-color : #FEFEFE; color : #000000; font-family : Verdana, Geneva, Arial, Helvetica, sans-serif; text-align : justify }
                                        H1{ font-size : 160%; font-style : normal; font-weight : bold; text-align : left; border : 1px solid Black;  background-color : #E7E7E7; margin-left : 0px;  page-break-before : always; }
                                        H2{ font-size : 130%; font-style : normal; font-weight : bold; text-align : left; background-color : #EEEEEE;  border : 1px solid Gray;  page-break-before : always; }
                                        H3{ font-size : 110%; font-style : normal; font-weight : bold; text-align : left;  background-color : #F1F1F1;  border : 1px solid Silver;}
                                        H4{ font-size : 100%; font-style : normal; font-weight : bold; text-align : left; border : 1px solid Gray;  background-color : #F4F4F4;}
                                        H5{ font-size : 100%; font-style : italic; font-weight : bold; text-align : left; border : 1px solid Gray;  background-color : #F4F4F4;}
                                        H6{ font-size : 100%; font-style : italic; font-weight : normal; text-align : left; border : 1px solid Gray;  background-color : #F4F4F4;}
                                        SMALL{ font-size : 80% }
                                        BLOCKQUOTE{ margin-left :4em; margin-top:1em; margin-right:0.2em;}
                                        HR{ color : Black }
                                        UL{margin-left: 0}
                                        .epigraph{width:50%; margin-left : 35%;}
                                </style>
                        </head>
                        <body>


                                                <h4 align="center">
                                                <xsl:value-of select="fb:description/fb:title-info/fb:book-title"/>
                                                </h4>

<xsl:for-each select="fb:description/fb:title-info/fb:coverpage/fb:image">
                <xsl:call-template name="image"/>
                </xsl:for-each>

                                <xsl:for-each select="fb:description/fb:title-info/fb:annotation">

                                        <div>
                                                <xsl:call-template name="annotation"/>
                                        </div>
                                        <hr/>
                                </xsl:for-each>
                                <!-- BUILD TOC -->
                                <ul>
                                        <xsl:apply-templates select="fb:body" mode="toc"/>
                                </ul>
                                <hr/>
                                <!-- BUILD BOOK -->
                                <xsl:for-each select="fb:body">
                                        <xsl:if test="position()!=1">
                                                <hr/>
                                        </xsl:if>
                                        <xsl:if test="@name">
                                                <h4 align="center">
                                                        <xsl:value-of select="@name"/>
                                                </h4>
                                        </xsl:if>
                                        <!-- <xsl:apply-templates /> -->
                                        <xsl:apply-templates/>
                                </xsl:for-each>
                        </body>
                </html>
        </xsl:template>
        <!-- author template -->
        <xsl:template name="author">
                <xsl:value-of select="fb:first-name"/>
                <xsl:text disable-output-escaping="no"> </xsl:text>
                <xsl:value-of select="fb:middle-name"/> 
         <xsl:text disable-output-escaping="no"> </xsl:text>
                <xsl:value-of select="fb:last-name"/>
                <br/>
        </xsl:template>
        <!-- secuence template -->
        <xsl:template name="sequence">
                <LI/>
                <xsl:value-of select="@name"/>
                <xsl:if test="@number">
                        <xsl:text disable-output-escaping="no">, #</xsl:text>
                        <xsl:value-of select="@number"/>
                </xsl:if>
                <xsl:if test="fb:sequence">
                        <ul>
                                <xsl:for-each select="fb:sequence">
                                        <xsl:call-template name="sequence"/>
                                </xsl:for-each>
                        </ul>
                </xsl:if>
                <!--      <br/> -->
        </xsl:template>
        <!-- toc template -->
        <xsl:template match="fb:section|fb:body" mode="toc">
                <xsl:choose>
                        <xsl:when test="name()='body' and position()=1 and not(fb:title)">
                                <xsl:apply-templates select="fb:section" mode="toc"/>
                        </xsl:when>
                        <xsl:otherwise>
                                <li>
                                        <a href="#TOC_{generate-id()}"><xsl:value-of select="normalize-space(fb:title/fb:p[1] | @name)"/></a>
                                        <xsl:if test="fb:section">
                                                <ul><xsl:apply-templates select="fb:section" mode="toc"/></ul>
                                        </xsl:if>
                                </li>
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:template>
        <!-- description -->
        <xsl:template match="fb:description">
                <xsl:apply-templates/>
        </xsl:template>
        <!-- body -->
        <xsl:template match="fb:body">
                <div><xsl:apply-templates/></div>
        </xsl:template>

        <xsl:template match="fb:section">
                <a name="TOC_{generate-id()}"></a>
                <xsl:if test="@id">
                        <xsl:element name="a">
                                <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
                        </xsl:element>
                </xsl:if>
                <xsl:apply-templates/>
        </xsl:template>


        <!-- section/title -->
        <xsl:template match="fb:section/fb:title|fb:poem/fb:title">
                <xsl:choose>
                        <xsl:when test="count(ancestor::node()) < 9">
                                <xsl:element name="{concat('h',count(ancestor::node())-3)}">
                                        <a name="TOC_{generate-id()}"></a>
                                        <xsl:if test="@id">
                                                <xsl:element name="a">
                                                        <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
                                                </xsl:element>
                                        </xsl:if>
                                        <xsl:apply-templates/>
                                </xsl:element>
                        </xsl:when>
                        <xsl:otherwise>
                                <xsl:element name="h6">
                                        <xsl:if test="@id">
                                                <xsl:element name="a">
                                                        <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
                                                </xsl:element>
                                        </xsl:if>
                                        <xsl:apply-templates/>
                                </xsl:element>
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:template>
        <!-- section/title -->
        <xsl:template match="fb:body/fb:title">
                <h1><xsl:apply-templates mode="title"/></h1>
        </xsl:template>

        <xsl:template match="fb:title/fb:p">
                <xsl:apply-templates/><xsl:text disable-output-escaping="no"> </xsl:text><br/>
        </xsl:template>
        <!-- subtitle -->
        <xsl:template match="fb:subtitle">
                <xsl:if test="@id">
                        <xsl:element name="a">
                                <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
                        </xsl:element>
                </xsl:if>
                <h5>
                        <xsl:apply-templates/>
                </h5>
        </xsl:template>
        <!-- p -->
        <xsl:template match="fb:p">
                <div align="justify"><xsl:if test="@id">
                                <xsl:element name="a">
                                        <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
                                </xsl:element>
                        </xsl:if>    <xsl:apply-templates/></div>
        </xsl:template>
        <!-- strong -->
        <xsl:template match="fb:strong">
                <b><xsl:apply-templates/></b>
        </xsl:template>
        <!-- emphasis -->
        <xsl:template match="fb:emphasis">
                <i>       <xsl:apply-templates/></i>
        </xsl:template>
        <!-- style -->
        <xsl:template match="fb:style">
                <span class="{@name}"><xsl:apply-templates/></span>
        </xsl:template>
        <!-- empty-line -->
        <xsl:template match="fb:empty-line">
                <br/>
        </xsl:template>
        <!-- link -->
        <xsl:template match="fb:a">
                <xsl:element name="a">
                        <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
                        <xsl:attribute name="title">
                                <xsl:choose>
                                        <xsl:when test="starts-with(@xlink:href,'#')"><xsl:value-of select="key('note-link',substring-after(@xlink:href,'#'))/fb:p"/></xsl:when>
                                        <xsl:otherwise><xsl:value-of select="key('note-link',@xlink:href)/fb:p"/></xsl:otherwise>
                                </xsl:choose>
                        </xsl:attribute>
                        <xsl:choose>
                                <xsl:when test="(@type) = 'note'">
                                        <sup>
                                                <xsl:apply-templates/>
                                        </sup>
                                </xsl:when>
                                <xsl:otherwise>
                                        <xsl:apply-templates/>
                                </xsl:otherwise>
                        </xsl:choose>
                </xsl:element>
        </xsl:template>
        <!-- annotation -->
        <xsl:template name="annotation">
                <xsl:if test="@id">
                        <xsl:element name="a">
                                <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
                        </xsl:element>
                </xsl:if>
                <h3>Annotation</h3>
                <xsl:apply-templates/>
        </xsl:template>
        <!-- epigraph -->
        <xsl:template match="fb:epigraph">
                <blockquote class="epigraph">
                        <xsl:if test="@id">
                                <xsl:element name="a">
                                        <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
                                </xsl:element>
                        </xsl:if>
                        <xsl:apply-templates/>
                </blockquote>
        </xsl:template>
        <!-- epigraph/text-author -->
        <xsl:template match="fb:epigraph/fb:text-author">
                <blockquote>
                        <i><xsl:apply-templates/></i>
                </blockquote>
        </xsl:template>
        <!-- cite -->
        <xsl:template match="fb:cite">
                <blockquote>
                <xsl:if test="@id">
                        <xsl:element name="a">
                                <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
                        </xsl:element>
                </xsl:if>
                <xsl:apply-templates/>
                </blockquote>
        </xsl:template>
        <!-- cite/text-author -->
        <xsl:template match="fb:text-author">
                <blockquote>
                <i>       <xsl:apply-templates/></i></blockquote>
        </xsl:template>
        <!-- date -->
        <xsl:template match="fb:date">
                <xsl:choose>
                        <xsl:when test="not(@value)">
                                   <xsl:apply-templates/>
                                <br/>
                        </xsl:when>
                        <xsl:otherwise>
                                   <xsl:value-of select="@value"/>
                                <br/>
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:template>
        <!-- poem -->
        <xsl:template match="fb:poem">
                <blockquote>
                        <xsl:if test="@id">
                                <xsl:element name="a">
                                        <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
                                </xsl:element>
                        </xsl:if>
                        <xsl:apply-templates/>
                </blockquote>
        </xsl:template>

        <!-- stanza -->
        <xsl:template match="fb:stanza">
                <xsl:apply-templates/>
                <br/>
        </xsl:template>
        <!-- v -->
        <xsl:template match="fb:v">
                <xsl:if test="@id">
                        <xsl:element name="a">
                                <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
                        </xsl:element>
                </xsl:if>
                <xsl:apply-templates/><br/>
        </xsl:template>
        <!-- image -->
        <xsl:template match="fb:image" name="image">
                <div align="center">
                        <img border="1">
                                <xsl:choose>
                                        <xsl:when test="starts-with(@xlink:href,'#')">
                                                <xsl:attribute name="src"><xsl:text>data:</xsl:text><xsl:variable name="href" select="substring-after(@xlink:href,'#')" /><set variable="href" expression="substring-after(@xlink:href,'#')"/><xsl:value-of select="//fb:binary[@id=$href]/@content-type" disable-output-escaping="yes" /><xsl:text>;base64,</xsl:text><!--<xsl:value-of select="substring-after(@xlink:href,'#')"/>--><xsl:value-of select="//fb:binary[@id=$href]"  disable-output-escaping="yes"/></xsl:attribute>

                                        </xsl:when>
                                        <xsl:otherwise>
                                                <xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
                                        </xsl:otherwise>
                                </xsl:choose>
                        </img>
                </div>
        </xsl:template>
</xsl:stylesheet>

Далее, например, так:
zcat book.fb2.zip | xsltproc fb2_22_xhtml.xsl - | lynx -force_html -stdin -dump -nolist | less

пятница, 3 октября 2014 г.

Как получить список поддоменов доменного имени?

Возник вопрос, а как можно получить список всех поддоменов доменного имени?
Наприме, возьмём два домена ukrhub.net и olden.org.ua - какие тут есть поддомены третьего и четвёртого уровней, соответственно?
Для ответа на поставленный вопрос нам потребуется два инструмента - whois и dig.
Для начала через whois узнаем нейм-сервера зон:
~$ whois ukrhub.net | awk '$1~/^Name$/ && $2~/^Server:$/ { print $3 }' | sort -u
NS190.UKRHUB.NET
NS94.UKRHUB.NET
~$ whois olden.org.ua | awk '$1~/^nserver:/ { print $2 }' | sort -u
ns2.olden.org.ua
ns.olden.org.ua

Далее к нейм-серверам зон через dig отсылаем запрос axfr:
~$ dig @ns2.olden.org.ua olden.org.ua +multiline +nottlid -t axfr

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @ns2.olden.org.ua olden.org.ua +multiline +nottlid -t axfr
; (1 server found)
;; global options: +cmd
olden.org.ua.           IN SOA  olden.org.ua. oldengremlin.gmail.com. (
                                2014042900 ; serial
                                86400      ; refresh (1 day)
                                7200       ; retry (2 hours)
                                3600000    ; expire (5 weeks 6 days 16 hours)
                                172800     ; minimum (2 days)
                                )
olden.org.ua.           IN NS   ns.olden.org.ua.
... 8< skip-skip 8< ...
www.olden.org.ua.       IN CNAME olden.org.ua.
olden.org.ua.           IN SOA  olden.org.ua. oldengremlin.gmail.com. (
                                2014042900 ; serial
                                86400      ; refresh (1 day)
                                7200       ; retry (2 hours)
                                3600000    ; expire (5 weeks 6 days 16 hours)
                                172800     ; minimum (2 days)
                                )
;; Query time: 1 msec
;; SERVER: 212.90.160.2#53(212.90.160.2)
;; WHEN: Fri Oct  3 09:25:59 2014
;; XFR size: 22 records (messages 1, bytes 554)

~$ dig @ns.ukrhub.net ukrhub.net +multiline +nottlid -t axfr

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @ns.ukrhub.net ukrhub.net +multiline +nottlid -t axfr
; (1 server found)
;; global options: +cmd
ukrhub.net.             IN SOA  ns94.ukrhub.net. hostmaster.ukrhub.net. (
                                2014093000 ; serial
                                3600       ; refresh (1 hour)
                                1800       ; retry (30 minutes)
                                1209600    ; expire (2 weeks)
                                7200       ; minimum (2 hours)
                                )
ukrhub.net.             IN NS   ns94.ukrhub.net.
... 8< skip-skip 8< ...
zemkadast-nop.ukrhub.net. IN A  212.90.170.202
ukrhub.net.             IN SOA  ns94.ukrhub.net. hostmaster.ukrhub.net. (
                                2014093000 ; serial
                                3600       ; refresh (1 hour)
                                1800       ; retry (30 minutes)
                                1209600    ; expire (2 weeks)
                                7200       ; minimum (2 hours)
                                )
;; Query time: 15 msec
;; SERVER: 212.90.160.2#53(212.90.160.2)
;; WHEN: Fri Oct  3 09:29:33 2014
;; XFR size: 944 records (messages 1, bytes 24617)

Однако тут же отмечу, что использовать запрос axfr выйдет не для всех зон. Почему? Да потому, что по большому счёту он открывает путь к "уязвимости" известной как Valve и системными администраторами, которым не чужда информационная безопасность, фиксится - трансфер зон разрешается лишь для доверенных ip. К примеру, попытка axfr запросов для доменов xda-developers.com, fb.com и vk.com, в той или иной степени, будут не успешными и список поддоменов таким образом нам получить не получится:
~$ DOMAIN=xda-developers.com; for NS in $( whois ${DOMAIN} | awk '$1~/^Name$/ && $2~/^Server:$/ { print $3 }' | sort -u ); do dig @${NS} ${DOMAIN}  +multiline +nottlid -t axfr; done

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @NS1.XDA-DEVELOPERS.COM xda-developers.com +multiline +nottlid -t axfr
; (1 server found)
;; global options: +cmd
; Transfer failed.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @NS2.XDA-DEVELOPERS.COM xda-developers.com +multiline +nottlid -t axfr
; (1 server found)
;; global options: +cmd
; Transfer failed.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @NS3.XDA-DEVELOPERS.COM xda-developers.com +multiline +nottlid -t axfr
; (1 server found)
;; global options: +cmd
; Transfer failed.

~$ DOMAIN=fb.com; for NS in $( whois ${DOMAIN} | awk '$1~/^Name$/ && $2~/^Server:$/ { print $3 }' | sort -u ); do dig @${NS} ${DOMAIN}  +multiline +nottlid -t axfr; done
;; Connection to 69.171.239.12#53(69.171.239.12) for fb.com failed: connection refused.
;; Connection to 69.171.239.12#53(69.171.239.12) for fb.com failed: connection refused.
;; Connection to 69.171.255.12#53(69.171.255.12) for fb.com failed: connection refused.
;; Connection to 69.171.255.12#53(69.171.255.12) for fb.com failed: connection refused.

~$ DOMAIN=vk.com; for NS in $( whois ${DOMAIN} | awk '$1~/^Name$/ && $2~/^Server:$/ { print $3 }' | sort -u ); do dig @${NS} ${DOMAIN}  +multiline +nottlid -t axfr; done

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @NS1.VKONTAKTE.RU vk.com +multiline +nottlid -t axfr
; (2 servers found)
;; global options: +cmd
vk.com.                 IN SOA  ns1.vkontakte.ru. ncc.vkontakte.ru. (
                                2014093001 ; serial
                                3600       ; refresh (1 hour)
                                900        ; retry (15 minutes)
                                604800     ; expire (1 week)
                                900        ; minimum (15 minutes)
                                )
; Transfer failed.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @NS2.VKONTAKTE.RU vk.com +multiline +nottlid -t axfr
; (2 servers found)
;; global options: +cmd
vk.com.                 IN SOA  ns1.vkontakte.ru. ncc.vkontakte.ru. (
                                2014093001 ; serial
                                3600       ; refresh (1 hour)
                                900        ; retry (15 minutes)
                                604800     ; expire (1 week)
                                900        ; minimum (15 minutes)
                                )
; Transfer failed.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @NS3.VKONTAKTE.RU vk.com +multiline +nottlid -t axfr
; (2 servers found)
;; global options: +cmd
vk.com.                 IN SOA  ns1.vkontakte.ru. ncc.vkontakte.ru. (
                                2014093001 ; serial
                                3600       ; refresh (1 hour)
                                900        ; retry (15 minutes)
                                604800     ; expire (1 week)
                                900        ; minimum (15 minutes)
                                )
; Transfer failed.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @NS4.VKONTAKTE.RU vk.com +multiline +nottlid -t axfr
; (2 servers found)
;; global options: +cmd
vk.com.                 IN SOA  ns1.vkontakte.ru. ncc.vkontakte.ru. (
                                2014093001 ; serial
                                3600       ; refresh (1 hour)
                                900        ; retry (15 minutes)
                                604800     ; expire (1 week)
                                900        ; minimum (15 minutes)
                                )
; Transfer failed.

А вот попытка "выстрелить" по доменам tlc.ks.ua, unio.kherson.ua и plusnet.ks.ua оказалась вполне успешной:
~$ for DOMAIN in tlc.ks.ua unio.kherson.ua plusnet.ks.ua; do for NS in $( whois ${DOMAIN} | awk '$1~/^nserver:/ { print $2 }' | sort -u ); do dig @${NS} ${DOMAIN}  +multiline +nottlid -t axfr; done; done

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @ns01.tlc.ks.ua tlc.ks.ua +multiline +nottlid -t axfr
; (2 servers found)
;; global options: +cmd
tlc.ks.ua.              IN SOA  virtual2.ks-host.com. support.ks-host.com. (
                                2014082507 ; serial
                                10800      ; refresh (3 hours)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
tlc.ks.ua.              IN TXT  "v=spf1 ip4:62.149.13.45 a mx ~all"
tlc.ks.ua.              IN NS   ns01.tlc.ks.ua.
tlc.ks.ua.              IN NS   ns02.tlc.ks.ua.
tlc.ks.ua.              IN NS   ns03.tlc.ks.ua.
tlc.ks.ua.              IN MX   10 mail.tlc.ks.ua.
tlc.ks.ua.              IN A    62.149.13.45
ftp.tlc.ks.ua.          IN A    62.149.13.45
imap.tlc.ks.ua.         IN A    62.149.13.45
mail.tlc.ks.ua.         IN A    62.149.13.45
ns01.tlc.ks.ua.         IN AAAA 2a03:6300:1:12::13:45
ns01.tlc.ks.ua.         IN A    62.149.13.45
ns02.tlc.ks.ua.         IN A    77.120.125.20
ns03.tlc.ks.ua.         IN AAAA 2001:1608:10:38::87b0:f63a
ns03.tlc.ks.ua.         IN A    84.200.213.106
pop.tlc.ks.ua.          IN A    62.149.13.45
smtp.tlc.ks.ua.         IN A    62.149.13.45
www.tlc.ks.ua.          IN A    195.38.16.2
tlc.ks.ua.              IN SOA  virtual2.ks-host.com. support.ks-host.com. (
                                2014082507 ; serial
                                10800      ; refresh (3 hours)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
;; Query time: 1 msec
;; SERVER: 62.149.13.45#53(62.149.13.45)
;; WHEN: Fri Oct  3 09:50:45 2014
;; XFR size: 19 records (messages 1, bytes 489)


; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @ns02.tlc.ks.ua tlc.ks.ua +multiline +nottlid -t axfr
; (1 server found)
;; global options: +cmd
; Transfer failed.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @ns03.tlc.ks.ua tlc.ks.ua +multiline +nottlid -t axfr
; (2 servers found)
;; global options: +cmd
; Transfer failed.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @ns02.ks-host.com.ua unio.kherson.ua +multiline +nottlid -t axfr
; (1 server found)
;; global options: +cmd
; Transfer failed.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @ns03.ks-host.com.ua unio.kherson.ua +multiline +nottlid -t axfr
; (2 servers found)
;; global options: +cmd
; Transfer failed.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @ns04.ks-host.com.ua unio.kherson.ua +multiline +nottlid -t axfr
; (2 servers found)
;; global options: +cmd
unio.kherson.ua.        IN SOA  virtual2.ks-host.com. support.ks-host.com. (
                                2014091001 ; serial
                                10800      ; refresh (3 hours)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
unio.kherson.ua.        IN TXT  "v=spf1 ip4:62.149.13.45 a mx ~all"
unio.kherson.ua.        IN NS   ns02.ks-host.com.ua.
unio.kherson.ua.        IN NS   ns03.ks-host.com.ua.
unio.kherson.ua.        IN NS   ns04.ks-host.com.ua.
unio.kherson.ua.        IN MX   10 mail.unio.kherson.ua.
unio.kherson.ua.        IN A    62.149.13.45
ftp.unio.kherson.ua.    IN A    62.149.13.45
mail.unio.kherson.ua.   IN A    62.149.13.45
pop.unio.kherson.ua.    IN A    62.149.13.45
smtp.unio.kherson.ua.   IN A    62.149.13.45
www.unio.kherson.ua.    IN A    62.149.13.45
unio.kherson.ua.        IN SOA  virtual2.ks-host.com. support.ks-host.com. (
                                2014091001 ; serial
                                10800      ; refresh (3 hours)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
;; Query time: 1 msec
;; SERVER: 62.149.13.45#53(62.149.13.45)
;; WHEN: Fri Oct  3 09:50:45 2014
;; XFR size: 13 records (messages 1, bytes 382)

;; Connection to 77.121.4.19#53(77.121.4.19) for plusnet.ks.ua failed: timed out.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @ns.plusnet.ks.ua plusnet.ks.ua +multiline +nottlid -t axfr
; (1 server found)
;; global options: +cmd
plusnet.ks.ua.          IN SOA  plusnet.ks.ua. hostmaster.plusnet.ks.ua. (
                                2013102200 ; serial
                                86400      ; refresh (1 day)
                                7200       ; retry (2 hours)
                                3600000    ; expire (5 weeks 6 days 16 hours)
                                172800     ; minimum (2 days)
                                )
plusnet.ks.ua.          IN NS   ns.plusnet.ks.ua.
plusnet.ks.ua.          IN NS   ns2.plusnet.ks.ua.
plusnet.ks.ua.          IN MX   10 mail.plusnet.ks.ua.
plusnet.ks.ua.          IN A    77.121.4.50
*.plusnet.ks.ua.        IN A    77.121.4.50
clan.plusnet.ks.ua.     IN A    77.121.4.50
cs.plusnet.ks.ua.       IN A    77.121.4.50
ban.cs.plusnet.ks.ua.   IN A    77.121.4.50
data.cs.plusnet.ks.ua.  IN A    77.121.4.50
datasvit.cs.plusnet.ks.ua. IN A 77.121.4.50
forum.cs.plusnet.ks.ua. IN A    77.121.4.50
gungame.cs.plusnet.ks.ua. IN A  77.121.4.50
monitor.cs.plusnet.ks.ua. IN A  77.121.4.50
plusnet.cs.plusnet.ks.ua. IN A  77.121.4.50
stats.cs.plusnet.ks.ua. IN A    77.121.4.50
ftp.plusnet.ks.ua.      IN CNAME plusnet.ks.ua.
localhost.plusnet.ks.ua. IN A   127.0.0.1
m.plusnet.ks.ua.        IN A    93.79.167.142
mail.plusnet.ks.ua.     IN A    77.121.4.50
ns.plusnet.ks.ua.       IN A    77.121.4.50
ns2.plusnet.ks.ua.      IN A    77.121.4.19
rc.plusnet.ks.ua.       IN A    77.121.4.50
ts.plusnet.ks.ua.       IN A    77.121.4.50
vik.plusnet.ks.ua.      IN A    77.121.4.50
www.plusnet.ks.ua.      IN CNAME plusnet.ks.ua.
plusnet.ks.ua.          IN SOA  plusnet.ks.ua. hostmaster.plusnet.ks.ua. (
                                2013102200 ; serial
                                86400      ; refresh (1 day)
                                7200       ; retry (2 hours)
                                3600000    ; expire (5 weeks 6 days 16 hours)
                                172800     ; minimum (2 days)
                                )
;; Query time: 108 msec
;; SERVER: 77.121.4.50#53(77.121.4.50)
;; WHEN: Fri Oct  3 09:50:53 2014
;; XFR size: 27 records (messages 1, bytes 612)

четверг, 4 сентября 2014 г.

Устанавливаем Viber на Debian Wheezy

Строим chroot

# mkdir -p /srv/chroot/testing
# debootstrap testing /srv/chroot/testing http://http.debian.net/debian
# cat > /srv/chroot/testing/usr/sbin/policy-rc.d <<EOF
exit 101
EOF
# chmod a+x /srv/chroot/testing/usr/sbin/policy-rc.d

Устанавливаем и настраиваем schroot

# aptitude install schroot
# vim /etc/schroot/schroot.conf
добавляем следующее содержимое
[testing-desktop]
description=Debian testing
type=directory
personality=linux
preserve-environment=true
directory=/srv/chroot/testing
users=olden
profile=desktop

[testing-minimal]
description=Debian testing
type=directory
personality=linux
preserve-environment=true
directory=/srv/chroot/testing
root-users=root
profile=default
aliases=default
Меняем olden на свой username. Редактируем /etc/schroot/desktop/fstab, должны быть раскомментированы строки:
/var/lib/dbus   /var/lib/dbus   none    rw,bind         0       0
/run            /run            none    rw,bind         0       0
/run/shm        /run/shm        none    rw,bind         0       0

Чрутимся:

# schroot -c testing-minimal
# dpkg-divert --divert /usr/bin/ischroot.debianutils --rename /usr/bin/ischroot
# ln -s /bin/true /usr/bin/ischroot
# apt-get install aptitude
# aptitude update && aptitude full-upgrade
# aptitude install task-kde-desktop

Выходим из root-ового schroot-а.

Далее, проверяем:
$ schroot -c testing-desktop
или даже так:
schroot -c testing-desktop -- xterm

Устанавливаем Viber.

Для начала скачиваем Viber
# schroot -c testing-minimal
# cd /tmp
# wget http://download.cdn.viber.com/cdn/desktop/Linux/viber.deb
# dpkg -i viber.deb
Запускаем и тестируем Viber
$ schroot -c testing-desktop -- /opt/viber/Viber
Вроде бы как и всё. Заработало. ;) Остались вопросы, можно посмотреть ещё один how-to https://wiki.math.cmu.edu/iki/wiki/tips/20140716-viber.html

среда, 20 августа 2014 г.

Perl feature

feature (особенность) - Perl прагма для включения нового функционала. Детальное описание feature можно найти в perldoc, а тут приведу лишь некий краткий анонс.

В общем случае feature в perl-коде включаются следующим образом:
 use feature qw(say switch);
given ($foo) {
    when (1)          { say "\$foo == 1" }
    when ([2,3])      { say "\$foo == 2 || \$foo == 3" }
    when (/^a[bc]d$/) { say "\$foo eq 'abd' || \$foo eq 'acd'" }
    when ($_ > 100)   { say "\$foo > 100" }
    default           { say "None of the above" }
}
use feature ':5.10'; # загружает все feature доступные в perl 5.10
use v5.10;           # неявно загружает :5.10 feature
Как правило невозможно добавит в perl-скрипт новый синтаксис, не нарушая существующий код. Использование feature даёт возможность минимизировать этот риск. Новые синтаксические конструкции могут быть включены лишь в часть кода и будут разбираться лишь тогда когда соответствующая прагма находится в области видимости. Тем не менее использование префикса CORE::префикса позволяет использовать все новые ключевые слова Perl, независимо от использование директивы feature. Например:
use feature "say";
say "test0";
или
CORE::say "test0";

no feature - отключает действие feature:
use feature 'say';
say "say is available here";
{
    no feature 'say';
    print "But not here.\n";
}
say "Yet it is here.";

use feature 'say' - включает использование Perl6 функции say.
Функция say аналогична print, но к выводу добавляет "\n".
Эта feature доступна с версии Perl 5.10.

use feature 'state' - сообщает компилятору о включении переменных состояния (state).
Для детального ознакомления изучаем Persistent Private Variables.
Эта feature доступна с версии Perl 5.10.
use feature 'state';
sub gimme_another { state $x; return ++$x }
Пример с использованием анонимной функции:
use feature 'state';
sub create_counter {
    return sub { state $x; return ++$x }
}

use feature 'unicode_strings' - сообщает компилятору использовать правила Unicode во всех строковых операциях, попадающих в сферу его действия feature. Это же относится и к регулярным выражениям. При этом внутреннее представление не изменяется, меняется лишь их интерпретация.
Рекомендуется изучить Perl Unicode Bug во избежание сюрпризов и недоразумений.
Эта функция доступна начиная с Perl 5.12; была почти полностью реализована в Perl 5.14; и продлена в Perl 5.16, чтобы перекрыть quotemeta.

use feature 'fc' - говорит компилятору включить поддержку функции fc.
fc EXPR - возвращает регистронезависимую версию EXPR.
lc($this) eq lc($that)    # Wrong!
    # или
uc($this) eq uc($that)    # Also wrong!
    # или
$this =~ /^\Q$that\E\z/i  # Right!
Теперь можно писать так
fc($this) eq fc($that)

Комплектное включение feature
  Комплект  Включенные особенности
  --------- -----------------
  :default  array_base
  :5.10     say state switch array_base
  :5.12     say state switch unicode_strings array_base
  :5.14     say state switch unicode_strings array_base
  :5.16     say state switch unicode_strings
            unicode_eval evalbytes current_sub fc
  :5.18     say state switch unicode_strings
            unicode_eval evalbytes current_sub fc
  :5.20     say state switch unicode_strings
            unicode_eval evalbytes current_sub fc
Включение подверсии в feature не оказывает никакого эффекта. Например
use feature ":5.14.0";    # тоже, что и ":5.14"
use feature ":5.14.1";    # тоже, что и ":5.14"

Неявная загрузка feature.
Вместо загрузки отдельных feature можно позволить Perl неявно загрузить всё самому.
Для "однострочников" можно вместо -e использовать -E.
В скриптах - указать минимально используемую версию Perl. То есть:
use v5.10.0;
неявно сделает:
no feature ':all';
use feature ':5.10';

среда, 16 апреля 2014 г.

Примеры использования sed

Синтаксис команды Описание
sed 's/Nick/John/g' report.txt
Заменяет каждое вхождение Nick на John в файле report.txt
sed 's/Nick|nick/John/g' report.txt
Заменяет каждое вхождение Nick или nick на John.
sed 's/^/ /' file.txt >file_new.txt
Добавляет 8 пробелов слева от текста для улучшения качества печати.
sed -n '/Of course/,/attention you \
pay/p' myfile
Выводит один абзац, начинающийся с "Of course" и заканчивающийся на "attention you pay"
sed -n 12,18p file.txt
Выводит только строки 12-18 файла file.txt
sed 12,18d file.txt
Выводит весь файл file.txt за исключением строк с 12 по 18
sed G file.txt 
Удваивает пробелы в file.txt
sed -f script.sed file.txt
Записывает все команды в script.sed и выполняет их.
sed '5!s/ham/cheese/' file.txt
Заменяет ham на cheese в file.txt за исключением 5-й строки
sed '$d' file.txt
Удаляет последнюю строку
sed '/[0-9]\{3\}/p' file.txt
Печатает только строки с тремя последовательными цифрами
sed '/boom/!s/aaa/bb/' file.txt
Если найден "boom", заменить aaa на bb
sed '17,/disk/d' file.txt
Удаляет все строки, начиная с 17-й, до "disk"
echo ONE TWO | sed "s/one/unos/I"
Заменяет one на unos независимо от регистра, поэтому будет напечатано "unos TWO"
sed 'G;G' file.txt
Утраивает пробелы в файле
sed 's/.$//' file.txt
Способ замены dos2unix :)
sed 's/^[ ^t]*//' file.txt
Удаляет все пробелы перед каждой строкой в file.txt
sed 's/[ ^t]*$//' file.txt
Удаляет все пробелы в конце каждой строки в file.txt
sed 's/^[ ^t]*//;s/[ ^]*$//' file.txt
Удаляет все пробелы в начале и в конце каждой строки в file.txt
sed 's/foo/bar/' file.txt
Заменяет foo на bar только в первом вхождении в строке.
sed 's/foo/bar/4' file.txt
Заменяет foo на bar только в четвертом вхождении в строке.
sed 's/foo/bar/g' file.txt
Заменяет foo на bar для всех вхождений в строке.
sed '/baz/s/foo/bar/g' file.txt
Заменить foo на bar только если строка содержит baz.
sed '/./,/^$/!d' file.txt
Удалить все последовательные пустые строки за исключением EOF
sed '/^$/N;/\n$/D' file.txt
Удалить все последовательные пустые строки, но оставить верхнюю пустую строку.
sed '/./,$!d' file.txt
Удалить все начальные пустые строки
sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' \ 
 file.txt
Удалить все замыкающие пустые строки
sed -e :a -e '/\\$/N; s/\\\n//; ta' \ 
 file.txt
Если файл заканчивается обратным сплешем, соединить его со следующим (полезно для скриптов оболочки)
sed '/regex/,+5/expr/'
Соответствует regex плюс 5 следующих строк
sed '1~3d' file.txt
Удалить каждую третью строку, начиная с первой.
sed -n '2~5p' file.txt
Печатать каждую пятую строку, начиная со второй.
sed 's/[Nn]ick/John/g' report.txt
Другой способ записи некоторых приведенных выше примеров. Вы можете предложить свой?
sed -n '/RE/{p;q;}' file.txt
Печатает только первое соответствие RE (регулярного выражения)
sed '0,/RE/{//d;}' file.txt
Удаляет только первое соответствие
sed '0,/RE/s//to_that/' file.txt
Изменяет только первое соответствие
sed 's/^[^,]*,/9999,/' file.csv
Заменяет первое поле на 9999 в CSV-файле
s/^ *\(.*[^ ]\) *$/|\1|/;
s/" *, */"|/g;
: loop
s/| *\([^",|][^,|]*\) *, */|\1|/g;
s/| *, */|\1|/g;
t loop
s/ *|/|/g;
s/| */|/g;
s/^|\(.*\)|$/\1/;
Скрипт sed для конвертирования CSV-файла в файл с вертикальной чертой в качестве разделителя (работает только с некоторыми типами CSV, со встроенными кавычками и запятыми).
sed ':a;s/\(^\|[^0-9.]\)\([0-9]\+\)\\
([0-9]\{3\}\)/\1\2,\3/g;ta' file.txt
Меняет формат чисел в file.txt с 1234.56 на 1.234.56
sed -r "s/\<(reg|exp)[a-z]+/\U&/g"
Переводит любое слово, начинающееся с reg или exp в верхний регистр.
sed '1,20 s/Johnson/White/g' file.txt
Производит замену Johnson на White только в строках 1 - 20.
sed '1,20 !s/Johnson/White/g' file.txt
Предыдущий пример наоборот (заменяет везде, кроме строк 1-20)
sed '/from/,/until/ { s/\/magenta/g; \ 
s/\/cyan/g; }' file.txt
Заменяет только между "from" и "until"
sed '/ENDNOTES:/,$ { s/Schaff/Herzog/g; \ 
s/Kraft/Ebbing/g; }' file.txt
Заменяет только со слова "ENDNOTES:" и до EOF
sed '/./{H;$!d;};x;/regex/!d' file.txt
Печатает абзац только если он содержит regex
sed -e '/./{H;$!d;}' -e 'x;/RE1/!d;\
/RE2/!d;/RE3/!d' file.txt
Печатает абзацы только если они содержат RE1, RE2 и RE3
sed 's/14"/fourteen inches/g' file.txt
Так вы сможете использовать двойные кавычки
sed 's/\/some\/UNIX\/path/\/a\/new\\
/path/g' file.txt
Работа с путями Unix
sed 's/[a-g]//g' file.txt
Удаляет все символы, начиная с a и заканчивая g из файла file.txt
sed 's/\(.*\)foo/\1bar/' file.txt
Заменяет только последнее соответствие foo на bar
sed '1!G;h;$!d' 
Замена команды tac
sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1\
/;//D;s/.//'
Замена команды rev
sed 10q file.txt
Замена команды head
sed -e :a -e '$q;N;11,$D;ba' \ 
file.txt
Замена команды tail
sed '$!N; /^\(.*\)\n\1$/!P; D' \ 
file.txt
Замена команды uniq
sed '$!N; s/^\(.*\)\n\1$/\1/;\ 
t; D' file.txt
Обратная команда (что эквивалентно uniq -d)
sed '$!N;$!D' file.txt
Эквивалент tail -n 2
sed -n '$p' file.txt
... tail -n 1 (или tail -1)
sed '/regexp/!d' file.txt
Эквивалент grep
sed -n '/regexp/{g;1!p;};h' file.txt
Печатает строку, находящуюся перед первым соответствием регулярному выражению, но не включающую само соответствие
sed -n '/regexp/{n;p;}' file.txt
Печатает строку, находящуюся после первого соответствия регулярному выражению, но не включающую само соответствие
sed '/pattern/d' file.txt
Удаляет строки, соответствующие шаблону pattern
sed '/./!d' file.txt
Удаляет все пустые строки из файла
sed '/^$/N;/\n$/N;//D' file.txt
Удаляет все следующие друг за другом пустые строки, за исключением первых двух
sed -n '/^$/{p;h;};/./{x;/./p;}'\ 
file.txt
Удаляет последнюю строку каждого абзаца
sed '/^$/q'
Получает заголовок письма
sed '1,/^$/d'
Получает тело письма
sed '/^Subject: */!d; s///;q'
Получает тему письма
sed 's/^/> /'
Цитирует сообщение, вставляя "> " перед каждой строкой
sed 's/^> //'
Обратная команда (убирает цитирование из сообщения)
sed -e :a -e 's/<[^>]*>//g;/

Удаляет HTML-теги
sed '/./{H;d;};x;s/\n/={NL}=/g'\
 file.txt | sort \ 
| sed '1s/={NL}=//;s/={NL}=/\n/g'
Сортирует абзацы в file.txt в алфавитном порядке
sed 's@/usr/bin@&/local@g' path.txt
Заменяет /usr/bin на /usr/bin/local в path.txt
sed 's@^.*$@<<<&>>>@g' path.txt
Попробуйте и увидите :)
sed 's/\(\/[^:]*\).*/\1/g' path.txt
При условии, что path.txt содержит $PATH, выводит только первый путь в каждой строке
sed 's/\([^:]*\).*/\1/' /etc/passwd
Замена awk - показывает только пользователей из файла passwd
echo "Welcome To The Geek Stuff" | sed \ 
's/\(\b[A-Z]\)/\(\1\)/g'
(W)elcome (T)o (T)he (G)eek (S)tuff
Понятно без объяснений
sed -e '/^$/,/^END/s/hills/\ 
mountains/g' file.txt
Заменяет "hills" на "mountains", но только в блоках текста, начинающихся с пустой строки и заканчивающихся строкой с тремя символами "END", включительно.
sed -e '/^#/d' /etc/services | more
Показывает файл services без закомментированных строк
sed '$s@\([^:]*\):\([^:]*\):\([^:]*\
\)@\3:\2:\1@g' path.txt
Меняет порядок элементов в последней строке файла path.txt на обратный
sed '/regex/{x;p;x;}' file.txt
Вставляет новую строку выше каждой строки, соответствующей регулярному выражению
sed '/AAA/!d; /BBB/!d; /CCC/!d' file.txt
Ищет соответствие AAA, BBB и CCC в любом порядке
sed '/AAA.*BBB.*CCC/!d' file.txt
Ищет соответствие AAA, BBB и CCC в заданном порядке
sed -n '/^.\{65\}/p' file.txt
Печатает строки длиной 65 символов и более
sed -n '/^.\{65\}/!p' file.txt
Печатает строки длиной 65 символов и менее
sed '/regex/G' file.txt
Вставляет пустую строку под каждой строкой
sed '/regex/{x;p;x;G;}' file.txt
Вставляет пустую строку над и под каждой строкой
sed = file.txt | sed 'N;s/\n/\t/'
Нумерует строки в file.txt
sed -e :a -e 's/^.\{1,78\}$/\
 &/;ta' file.txt
Выровнять текст по правому краю
sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e \
's/\( *\)\1/\1/' file.txt
Выровнять текст по центру


Изучаем команды Linux: sed

вторник, 18 марта 2014 г.

Сборка Wireshark с поддержкой pcap

Сборка Wireshark/Tshark по Debian не позволяет открывать ссылки наподобие rpcap://172.31.4.16/eth1, пишет "No such device exists":
$ sudo tshark -ni rpcap://172.31.4.16/eth1

Всё дело в том, что изначально не включён параметр --with-pcap-remote. Исправляем это недоразумение.
Качаем архив в Wireshark · Download, распаковываем. Предположим, что это wireshark-1.10.6.tar.bz2:
$ tar xjf wireshark-1.10.6.tar.bz2
$ cd wireshark-1.10.6/

Далее, редактируем debian/rules отыскиваем CONFIGURE_FLAGS и добавляем в конец --with-pcap-remote. Это можно сделать, например, так:
$ sed -i "s/^\(CONFIGURE_FLAGS=.*\)--with-pcap-remote\(.*\)/\1\2/;s/^\(CONFIGURE_FLAGS=.*\)/\1 --with-pcap-remote/" debian/rules

Далее собираем deb-пакеты, для архитектуры по-умолчанию и, например, i386 (686):
$ dpkg-buildpackage
$ dpkg-buildpackage -ai386

В принципе можно ограничиться только своей архитектурой ;) Далее:
$ cd ..
$ sudo dpkg -i wireshark-common_1.10.6_amd64.deb wireshark_1.10.6_amd64.deb tshark_1.10.6_amd64.deb

четверг, 27 февраля 2014 г.

Ubuntu и разрешения Flash для доступа к камере и микрофону

Столкнулся с проблемой, в Ubuntu выводилась, но не нажималась кнопка "Разрешить" для Flash, когда приложение пыталось обратиться к камере и микрофону.
Решается просто. По ссылке Панель «Параметры конфиденциальности веб-сайтов» можно настроить конфиденциальность для конкретного сайта. Так-же можно настроить:

  • Панель «Глобальные параметры конфиденциальности»
  • Панель «Глобальные параметры хранения»
  • Панель «Глобальные параметры безопасности»
  • Панель «Параметры воспроизведения защищенного содержимого»
  • Панель «Параметры хранения веб-сайтов»
  • Панель «Пиринговая сеть»

http://www.macromedia.com/support/documentation/ru/flashplayer/help/settings_manager09.html

среда, 26 февраля 2014 г.

Windows XP - нет отзыва ни от клавиатуры, ни от мышки

Принесли "тазик" с "неработающей" Windows XP. Выяснилось, что сама ОС загружается, но вот беда, после загрузки нет отзыва ни от клавиатуры, ни от мышки. При этом если зайти в BIOS или банально загрузиться в Live CD то всё работает как часы.
Вылечилось следующим образом. Для начала снимаем винчестер, подключаем его к любой работающей Windows XP и проделываем следующие нехитрые манипуляции:

  1. запускаем Regedit;
  2. выделяем раздел HKEY_LOCAL_MACHINE;
  3. переходим в меню Файл → Загрузить куст → указываем папку с "упавшей" системой \WINDOWS\system32\config, открываем файл system;
  4. задаём имя куста, например SYS;
  5. зайходим в разделы HKEY_LOCAL_MACHINE\SYS\ControlSet00#\Control\Class, где # = 1, 2, ...;
  6. в подразделе {4D36E96B-E325-11CE-BFC1-08002BE10318} удаляем параметр LowerFilters (если есть) и задаём UpperFilters = kbdclass (тип параметра должен быть REG_MULTI_SZ); у меня тут был указан какой-то "левый" класс;
  7. в подразделе {4D36E96F-E325-11CE-BFC1-08002BE10318} удаляем параметр LowerFilters (если есть) и задаём UpperFilters = mouclass;
  8. выделяем раздел HKEY_LOCAL_MACHINE\SYS → меню Файл → Выгрузить куст.
Перегружаемся. Наблюдаем чудо - стали видны и мышь, и клавиатура.

вторник, 18 февраля 2014 г.

Установка nodejs в Debian Wheezy

Стоит ли говорить о том, что в базовом дистрибутиве Debian Wheezy пакета nodejs нет? Это нормально, в этом весь Debian. Зато пакет nodejs есть в репозитории backports для Wheezy.
Давайте его (backports) подключим. Создаём файл настроек /etc/apt/sources.list.d/wheezy-backports.list следующего содержания:
deb http://ftp.us.debian.org/debian wheezy-backports main contrib non-free
после чего делаем
sudo aptitude update
Если вдруг, по каким-либо причинам, увидим ошибку GPG с предупреждением об NO_PUBKEY то выполняем простой сценарий:
KEY=0123456789ABCDEF; gpg --keyserver keys.gnupg.net --recv-keys $KEY; gpg --armor --export $KEY | sudo apt-key add -
после чего опять выполняем
sudo aptitude update
и замечаем, что ошибка исчезла. После этого запросим список пакетов nodejs и убедимся, что они есть:
aptitude search ^nodejs
Установить нужные пакеты можно, например, так:
aptitude install nodejs nodejs-dev


четверг, 6 февраля 2014 г.

Перепрошивка D-Link DIR-300 с DD-WRT на Wive-NG-RTNL

Перед прошивкой обязательно убедитесь, что в вашем маршрутизаторе 32мб DRAM, так как в противном случае прошивка Wive-NG-RTNL не будет работать. В прошивке DD-WRT это можно узнать на закладке status/sys-info.
Необходимо скопировать прошивку в маршрутизатор с помощью tftp, ftp или wget (скачал Wive_WR-150N-RT3050-1T1R.4.7.8.RU.06022014.bin.zip, распаковал его и выложил Wive_WR-150N-RT3050-1T1R.4.7.8.RU.06022014.bin к на web-сервер). Прошивка типа 2T2R необходима для работы с чипсетом Ralink 3052 и 1T1R для чипсета Ralink 3050.
Далее заходим на свой dd-wrt маршрутизатор по ssh и выполняем следующие не хитрые команды:
root@DD-WRT:~# cd /tmp
root@DD-WRT:~# wget http:/url/Wive_WR-150N-RT3050-1T1R.4.7.8.RU.06022014.bin
root@DD-WRT:~# mtd erase linux
root@DD-WRT:~# mtd -f write Wive_WR-150N-RT3050-1T1R.4.7.8.RU.06022014.bin linux
root@DD-WRT:~# reboot
После перезагрузки точка загрузится с новой прошивкой. Логин и пароль изменятся на стандартные для Wive-NG: Admin/Admin (да, да, именно с большой буквы).

Вернуть dd-wrt прошивку обратно можно, например, так:
cd /tmp
wget ftp://login:password@ip/ddwrtconsole.bin 
mtd_write erase Kernel_RootFS
mtd_write write ddwrtconsole.bin Kernel_RootFS

Для смены MAC адреса на WAN порту необходимо ввести команды:
nvram_set 2860 CHECKMAC NO
nvram_set 2860 WAN_MAC_ADDR 00:xx:xx:xx:xx:xx 
reboot