Агрессивный Linux - Сарказм
Вольный перевод:
Команды терминала:
Любовь - не найдена
Счастье - не найдено
мир / покой - ненайден
убить - вы должны точно указать кого убить !
Всем добра и больше линукса :-)
P.S. байанометр не ругался...
Вольный перевод:
Команды терминала:
Любовь - не найдена
Счастье - не найдено
мир / покой - ненайден
убить - вы должны точно указать кого убить !
Всем добра и больше линукса :-)
P.S. байанометр не ругался...
Короткий очерк. Вообще об эту тему поломано немало копий. Большинство людей, когда слышит про Linux, начинают заводить разговор типа "фу, консоль, прошлый век". А между прочим там есть мощнейший язык сценариев, который "был питоном задолго до того, как это стало мейнстримом", т.е при сравнительно невысоком пороге вхождения позволяет оптимизировать и автоматизировать все и вся. Ну, как без примера? Вот однострочный скрипт, который выжимает данные с популярного трекера в формате:
магнет-линк
название
curl -s http://mega-tor.org/top | grep -A 3 "a class=\"downgif\"" | grep -o -E "magnet.{54}|a href=\"/torrent.*</a>" | sed -e 's/a href=\"\/torrent.*">//g'
Понять, как это работает можно, ознакомившись с конвеером, утилитами в примере и регэкспами. Аналогичным образом можно работать с любым сайтом без скриптовой выдачи, да и вообще с любыми текстовыми файлами.
Может я и говорю очевидные вещи, но тем не менее. Изучать стоит.Здравствуйте. Давно хотел запилить ролик о использовании GPIO на одноплатнике (в видео фигурирует Raspberry Pi B) и недавно сподобился. Подробности в видео.
Спасибо за внимание.
ПС: Текстовая версия видео (для неосиливших) - http://73-it.ru/odnoplatnye-kompyutery/gpio/upravlenie-gpio-...
Комментарий находится здесь: https://www.opennet.ru/tips/2963_ubuntu_windows_bash_wsl.sht...
Наверняка, многие уже наслышаны или даже пользуются Ubuntu, встроенной в Windows 10.
Инструкций по установке на русском языке в интернете море. На пикабу наверняка такой баян тоже писали несколько раз, но я не проверял. Если будут у кого-нибудь вопросы - пишите в комментарии.
УДАЛЕНИЕ
Допустим, у тебя мелкий ssd на компьютере, а эту Ubuntu ставил "на поиграться", и наигрался. А теперь обратно нужно вернуть драгоценный ресурс ssd и удалить ненужную ubuntu.
В "Программы и компоненты" ты не увидишь Ubuntu в виде установленной программы, как бы это было когда-то давно в виде wubi.
А если и галочку уберешь в компонентах Windows - тоже ничего не изменится.
Всё просто.
1. Правый клик на Пуск -> Командная строка(администратор)
2. Пишем lxrun /uninstall /full, жмём Enter (Если /home удалять не надо, то ключ /full не нужен).
ПЕРЕУСТАНОВКА
Необходимость перестановки системы может возникнуть в любой "непонятной ситуации". Можно так же "поиграться" с этой Ubuntu и наломать там дров, а разгребать лень (себе то хоть в этом признайтесь :)
1. Правый клик на Пуск -> Командная строка(администратор)
2. Пишем lxrun /uninstall /full, жмём Enter (Если /home удалять не надо, то ключ /full не нужен)
3. Пишем lxrun /install /y, жмём Enter и ждём пока свеженькая Ubuntu скачается из Магазина (Ключ /y позволит отлучиться от компьютера на время установки).
4. В какой-то момент установщик попросит ввести имя пользователя и пароль. Сделай это.
Осторожно! Дальше будет яваскрипт, консоль и баш!
Вконтактик имеет интересную фичу под названием "Подарки". Один только минус -- она платная. Для тех, кто студент или просто по идейным соображениям желает н....ть систему, сей мануал.
В конце у нас получится что-то типа:
1. Заходим на страницу подарков в браузере, типа google chrome
2. Тыкаем на первую картинку правой кнопкой и выбираем пункт "Inspect"
3. Открывается консоль типа вот так:
4. Находим родительский тэг DIV. В данном случае -- это gifts_box_birthday
5. Переключаемся на вкладку Console и пишем там наш адский скрипт:
var src=[]; $$('#gifts_box_birthday img.gift_img').forEach(function(img, index){src.push('wget ' + img.src + ' --output-document=' + index + '.jpg')}); src.join('\n')
6. Нажимаем ENTER и копируем результат
7. Открываем терминал, создаём временную директорию и идём туда:
mkdir --parents /tmp/fuck-da-vkontakt; cd /tmp/fuck-da-vkontakt
8. Вставляем результат в окно терминала и выполняем там скачку этих всех картинок. По окончании команда ls покажет нам, что файлики скачались.
9. Финальный аккорд нашего действа — запуск команды, которая все картинки красиво в одну картинку сложит. В линуксе есть команда montage из пакета imagemagick. Её и запустим, находясь в папке с файлами:
montage *.jpg fuck-da-vkontakt.png
10. В итоге у нас получится результат, типа такого. Много маленьких файликов и рядом один большой, слитый.
ps: Данная штука полезна, когда у вас есть мильён файликов, а их надо слить в один файлик и в скриншот он никак не хочет помещаться.
http://gnulinux.guru/bash_cheatsheet.pdf
Отличный комплект самых часто используемых команд.
Лично себе распечатал и заламинировал. Очень удобно.
Вот и пришло время заключительной части. В 1-ой части мы сделали код более читабельным, во 2-ой части мы избавились от множества регулярных выражений и лишнего кода. В этой части, мы избавимся от временных файлов и распределим вывод.
Во второй части я совсем забыл про не столь критичные, но всё же замечания в комментариях. Так вместо #!/bin/bash советовали #!/usr/bin/env bash и вместо [ ] использовать [[ ]]. Перед началом разбора, применим эти замечания и получим:
#!/usr/bin/env bash
####PART 1####
if [[ -z "$1" ]]; then
echo "Error: missing argument" 1>&2 ; exit 1
fi
f_out="$(mktemp)"
f_tmp="$(mktemp)"
trap "rm -f $f_out $f_tmp" EXIT
####PART 2####
echo "*********************************************"
echo "Get A records from DNS:"
dig +short {www.,}$1 A | tee "$f_out"
####PART 3####
echo "*********************************************"
echo "Get NS records from DNS:"
dig +short $1 NS | while read nsserv
do
nsname=${nsserv:0:-1}
echo "=================================="
echo "NS: $nsname"
dig +short @$nsname $1 A | tee -a $f_out
done
####PART 4####
echo "*********************************************"
echo "Resolve ip range from whois service:"
sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 $f_out | uniq > $f_tmp
rm $f_out
cat $f_tmp | while read ip
do
echo "Get ip range for $ip"
whois $ip | grep -E -i "inetnum|route|netrange|cidr" >> $f_out
done
####PART 5####
echo "*********************************************"
echo "Result"
echo "*********************************************"
sort $f_out | uniq | while read range
do
echo "${range:16}"
done
Для начала, хотелось бы сказать, что для больших данных, запись в файл может быть предпочтительнее, чем хранение в переменной. Но в нашем случае информации не так много, поэтому лучше использовать переменные и(или) массивы. Также стоит заменить, что все команды echo, лучше заменить на команду printf.
В 1-ой части кода происходит создание временных файлов, что для нас уже не актуально и можно удалить. Получим:
if [[ -z "$1" ]]; then
printf -- "%s\n" "Error: missing argument" 1>&2 ; exit 1
fi
Далее в каждой из частей происходит выписывание звездочек, заголовка и результата операции. В таком варианте ясно какие шаги выполняет скрипт, но скрипт будет сложнее использовать, т.к. нельзя будет просто записать конечный результат в файл. Поэтому, лучше выписывать промежуточные этапы не на stdout, а на stderr. Так мы улучшим скрипт и не повлияем на функциональность, т.к. всегда можно сделать 2>&1. Cделаем для этого функцию verbose:
function verbose {
printf -- "%s\n" "$1" 1>&2
}
Звездочки с заголовком выписываются в каждой части, поэтому для этого добавим функцию print_header:
function print_header {
verbose "*********************************************"
verbose "$1"
}
Теперь изменим 2-ую часть. Вместо временных файлов запишем результат в перемененную records. Так мы получим:
####PART 2####
print_header "Get A records from DNS:"
records="$(dig +short {www.,}$1 A)"
verbose "$records"
Поработаем над 3-ей частью, пошлём вывод на stderr и добавим новые ip в переменную records:
####PART 3####
print_header "Get NS records from DNS:"
dig +short $1 NS | while read nsserv
do
nsname=${nsserv:0:-1}
verbose "=================================="
verbose "NS: $nsname"
ns_records="$(dig +short @$nsname $1 A)"
verbose "$ns_records"
records+=ns_records
done
А вот с 4-ой частью возникли проблемы. В данной строке:
whois $ip | grep -E -i "inetnum|route|netrange|cidr" >> $f_out
после проведение grep, терялся \n на конце последней строки. В этом примере это не было проблемой, т.к. >> добавлял текст в конец файла и сам ставил новую строку(\n) между старым и новым текстом. Но когда я переписал на переменные, то проблема дала о себе знать и пришлось добавлять символ \n для каждого результата этой команды. Однако появилась одна пустая строка в конце результата, но удалить её было просто:
result="${result%$'\n'}
4-ая часть после изменений:
####PART 4####
print_header "Resolve ip range from whois service:"
records="$(sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 <<<"$records" | uniq)"
result=''
while read ip
do
verbose "Get ip range for $ip"
result+="$(whois $ip | grep -E -i "inetnum|route|netrange|cidr")"$'\n'
done <<< "$records"
result="${result%$'\n'}
Немного изменим 5-ую часть:
####PART 5####
print_header "Result:"
sort <<< "$result" | uniq | while read range
do
printf -- "%s\n" "${range:16}"
done
После всех изменений, мы получим:
#!/usr/bin/env bash
function verbose {
printf -- "%s\n" "$1" 1>&2
}
function print_header {
verbose "*********************************************"
verbose "$1"
}
####PART 1####
if [[ -z "$1" ]]; then
printf -- "%s\n" "Error: missing argument" 1>&2 ; exit 1
fi
####PART 2####
print_header "Get A records from DNS:"
records="$(dig +short {www.,}$1 A)"
verbose "$records"
####PART 3####
print_header "Get NS records from DNS:"
dig +short $1 NS | while read nsserv
do
nsname=${nsserv:0:-1}
verbose "=================================="
verbose "NS: $nsname"
ns_records="$(dig +short @$nsname $1 A)"
verbose "$ns_records"
records+=ns_records
done
####PART 4####
print_header "Resolve ip range from whois service:"
records="$(sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 <<<"$records" | uniq)"
result=''
while read ip
do
verbose "Get ip range for $ip"
result+="$(whois $ip | grep -E -i "inetnum|route|netrange|cidr")"$'\n'
done <<< "$records"
result="${result%$'\n'}"
####PART 5####
print_header "Result:"
sort <<< "$result" | uniq | while read range
do
printf -- "%s\n" "${range:16}"
done
Возможно код стал немного хуже читаться, но за-то мы избавились от временных файлов. А стоит ли оно того, решать только вам.
Заключение:
Последняя часть возможно вышла слегка сумбурна, но сказывается то, что на весь разбор ушло значительно больше времени, чем планировалось. Если с глазу на глаз можно быстро объяснить суть ошибок, то данный формат заставляет думать над каждым словом и писать предельно чётко. Однако, вижу что данный разбор, для достаточного для меня количества людей, пришёлся по душе и это радует.
Опять же, за это время уже были замечены темы, о которых бы стоило подробно написать и надеюсь это будет мною сделано. Плюс ко всему, уже появился новый пост от PetRiot, который хотя-бы вкратце, но можно будет разобрать. Поэтому новые посты будут и надеюсь достаточно скоро, но в комментариях буду отвечать регулярно.
Спасибо всем за внимание и поддержку, надеюсь данный разбор оказался для вас полезен!