Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Станьте Детективом! Решайте логические головоломки, чтобы найти преступника! 
Множество уровней и интересных историй! События и задачи дня!

Тебе предстоит раскрывать массу разных дел, в этом тебе поможет известный всем сыщикам метод дедукции.

Детектив - логические головоломки

Головоломки, Казуальные, Логическая

Играть

Топ прошлой недели

  • Oskanov Oskanov 8 постов
  • AlexKud AlexKud 26 постов
  • StariiZoldatt StariiZoldatt 3 поста
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Командная оболочка bash

С этим тегом используют

Linux IT Программирование Все
81 пост сначала свежее
154
Snipers
Snipers
8 лет назад
GNU/Linux

GNU/Linux шпаргалки⁠⁠

Человек много полезностей собрал, может быть, кому-то пригодится.

GNU/Linux шпаргалки Linux, Шпаргалка, Vim, Командная оболочка bash, Python, Сети

Туточке: http://gnulinux.guru

Linux Шпаргалка Vim Командная оболочка bash Python Сети
23
17
PetRiot
8 лет назад
GNU/Linux

Linux. Bash. Выборочная очистка почтовой очереди.⁠⁠

Окей пикабу!

Так как мой предыдущий пост разнесли в пух и прах (вполне заслуженно), я насуплю ещё раз на эти грабли. Но не для получения по голове, а во имя развития и обучения. Как моего персонально, так и всех в общем. Итак.

Есть задача: очистить всю почтовую очередь по шаблону. Какой шаблон - дело ваше. Или удалить весёлое общение двух автоответчиков, или убрать отчёты о недоставленных письмах или просто ради хохмы (что должно караться тапком по загривку). То есть причины мы опустим. Приступим к реализации.

Учтя предыдущи печальный опыт, я добавил комменты в код.

#!/bin/bash


###############################

# Set Default value #

###############################

date_s=$(date +%s)

printf "Starts at %s %s\n" `date '+%Y/%m/%d %H:%M:%S'`


###############################

# Get messages by pattern #

###############################

# if parameter exists

if [[ -n "$1" ]];

then

# 1) Get queue as JSON string

# 2) Get messages by pattern

# 3-5) Remove garbage

# 6) Loop

postqueue -j | grep -i "$1" | sed "s/\":[\ \"\[\{]*/:/g" | sed -e "s/\",\ \"/\ /g" -e "s/,\ \"/\ /g" | sed "s/recipients\://g" | while read msg

do

recipients=""

for item in ${msg:2:-4};

do

case "$item" in

queue_id\:*) id=${item#*\:} ;;

sender\:*) sender=${item#*\:} ;;

address\:*) recipients=`printf "%s %s" $recipients ${item#*\:}` ;;

esac

done

# Remove garbage from "id" value

id=`printf $id | sed "s/[\@\*]//g"`

printf "Delete meessage (ID=%s): from %s to %s\n" $id $sender $recipients

postsuper -d $id

done

fi


###############################

# Get relayed messages #

###############################

postqueue -j | grep -viE "server1.com|server2.ru" | sed "s/\":[\ \"\[\{]*/:/g" | sed -e "s/\",\ \"/\ /g" -e "s/,\ \"/\ /g" | sed "s/recipients\://g" | while read msg

do

recipients=""

for item in ${msg:2:-4};

do

case "$item" in

queue_id\:*) id=${item#*\:} ;;

sender\:*) sender=${item#*\:} ;;

address\:*) recipients=`printf "%s %s" $recipients ${item#*\:}` ;;

esac

done

id=`printf $id | sed "s/[\@\*]//g"`

printf "Delete meessage (ID=%s): from %s to %s\n" $id $sender $recipients

postsuper -d $id

done


###############################

# Finish #

###############################

printf "Ends at %s %s\n" `date '+%Y/%m/%d %H:%M:%S'`

let "date_r = `(date +%s)` - date_s"

printf "Runtime: %s %s\n" `date -u -r $date_r +%T`

Что делает скрипт?

1) Подготовка. Вывожу время запуска и запоминаю его (в секундах)

2) Если есть параметр, то начинаю искать.

3) В любом случае ищу сообщения, не имеющие отношение к моим серверам (например, server1.com и server2.ru). Сделал просто так... Для примера... Кто в себе уверен - удаляйте.

4) Вывожу время окончание и время работы.

Как происходит поиск?

Я воспользовался выводом postqueue в формате JSON. Почему именно так? потому что результат возвращается в одну (!) строчку за сообщение и я легко могу найти любое "попадание" по шаблону.

Так, как формат JSON древовидный, то приходится очищать вывод от разных символов: всяческие скобки, запятые и подгонять под удобные для обработки формат.

После получения мега-форматированных строк ( в которых есть символы переноса строки) я их перебираю, и, благодаря case-у вытаскиваю нужное мне. За один проход. После - вывод необходимой информации (по вкусу. можно закомментить, но тогда и скрипт был бы проще =)).

При вызове указать параметр (адресант, адресат или текст сообщения(??)). Либо ничего не указывать. =) Конечно же, запуск от имени root и иже с ним, так как postsuper требует повышения прав.

К тухлым помидорам морально готов =(.

P.S. Скрипт отчасти на коленке. То есть: очередь находит корректно, удалять мне (к счастью) пока нечего. Да и в куске

id=`printf $id | sed "s/[\@\*]//g"`

может быть затык. Добавил этот костыль, так как помню, что в очереди могут быть сообщения, начинающиеся с символов @ и *

Показать полностью
[моё] Linux Командная оболочка bash Скрипт Длиннопост Текст
17
18
bashman
8 лет назад
GNU/Linux

Разбор скрипта для командной строки Linux. Часть 2⁠⁠

В прошлой части разбора нам удалось сократить и сделать код более читабельным. В этой части, мы попробуем изучить используемые в скрипте инструменты и сделать код ещё лучше.


Хоть скрипт теоретически был рассчитан на любые доменные имена. На деле, проверка на доменной имя pikabu.ru, дала следующий результат:

91.228.152.0 - 91.228.155.255
MNT-FIRSTCOLO
91.228.152.0/22

Как видим, 2-я строчка тут явно лишняя. Из этого делаем вывод, что скрипт не работает правильно для всех доменов. В вопросе нахождения сетей, которые принадлежат домену, я увы недостаточно компетентен. Поэтому моей целью будет лишь добиться схожего результата и разобрать общие проблемы, которые актуальны для большинства скриптов.

И так, код который мы получили в конце первой части:

#!/bin/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:"
# Octet regex
o_re="(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
# IP regex
ip_re="$o_re\.$o_re\.$o_re\.$o_re"

dig $1 A | grep "^$1" | grep -o -E "$ip_re" | tee "$f_out"

dig $1 A | grep "^www.$1" | grep -o -E "$ip_re" | tee -a "$f_out"

####PART 3####

echo "*********************************************"
echo "Get NS records from DNS:"
dig $1 NS | grep "^$1" | awk {'print $NF}' | while read nsserv
do
nsname=${nsserv:0:${#nsserv}-1}
echo "=================================="
echo "NS: $nsname"
dig @$nsname $1 A | grep "^$1" | grep -o -E "$ip_re" | tee -a $f_out
done
####PART 4####
echo "*********************************************"
echo "Resolve ip range from whois service:"
sort -h $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

Плюс ко всему, код был разделён на 5 частей, для лучшей навигации.

Для начала, вернемся ко 2-ой части кода. А конкретно к этим строкам:

dig $1 A | grep "^$1" | grep -o -E "$ip_re" | tee "$f_out"
dig $1 A | grep "^www.$1" | grep -o -E "$ip_re" | tee -a "$f_out"

Лишь на данном моменте тут была замечена ошибка. Предположительно, автор хотел получить данные как по доменному имени vk.com, так и www.vk.com, однако забыл дописать это программе dig. Внесем правки:

dig $1 A | grep "^$1" | grep -o -E "$ip_re" | tee "$f_out"
dig www.$1 A | grep "^www.$1" | grep -o -E "$ip_re" | tee -a "$f_out"

Далее было замечено, что программа dig умеет принимать множество доменных имен, воспользуемся этим:

dig {www.,}$1 A | grep -E "^(www.|)$1" | grep -o -E "$ip_re" | tee "$f_out"

Уже лучше, вместо 2-ух строк, теперь лишь одна.


Программа dig выписывает множество лишней информации:

; <<>> DiG 9.9.5-9+deb8u6-Debian <<>> vk.com A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10732
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;vk.com. IN A
;; ANSWER SECTION:
vk.com. 33 IN A 87.240.131.118
vk.com. 33 IN A 87.240.131.117
vk.com. 33 IN A 87.240.131.120
;; Query time: 0 msec
;; SERVER: 192.168.3.1#53(192.168.3.1)
;; WHEN: Fri Jun 24 16:27:13 CEST 2016
;; MSG SIZE rcvd: 83

Автор дальнейшими действиями извлекает из этого вывода ip адреса. Но если посмотреть мануал к программе dig, то мы увидим что есть опция +short, которая выписывает лишь ip адреса, без лишней информации. Так, мы можем сократить команду, всего до:

dig +short {www.,}$1 A | tee "$f_out"

И как следствие, мы получаем нужный нам результат, без лишних команд и регулярных выражений. Поэтому обычно советую, перед тем как писать сложные конструкции, сначала изучите инструмент с которым вы работаете.

Теперь можем перейти к 3-ей части, начнем с первых команд:

dig $1 NS | grep "^$1" | awk {'print $NF}'

Снова используя параметр +short, получится:

dig +short $1 NS

Далее, результат с этой команды посылается в цикл while:

dig +short $1 NS | while read nsserv
do
nsname=${nsserv:0:${#nsserv}-1}
echo "=================================="
echo "NS: $nsname"
dig @$nsname $1 A | grep "^$1" | grep -o -E "$ip_re" | tee -a $f_out
done

Думаю сразу видно, что к последней команде в цикле можно применить опцию +short:

dig +short @$nsname $1 A | tee -a $f_out

Так мы опять избавились от лишних действий.


Но вернемся к перемененной nsname, тут автор хочет удалить точку на конце переменной. В коде это было сделано без внешних программ(sed,awk,...), что очень хорошо, но можно ещё проще:

nsname=${nsserv:0:-1}

Подробнее о всех возможностях работы со значениями переменных, можете прочитать на bash-hackers.org.

В 4-ой части кода, есть не очень красивые решения, которые связаны с временными файлами, мы исправим это во время избавления от временных файлов. Так же не понятно, зачем в sort был использован параметр -h(human-numeric-sort). Т.к. sort использован только для дальнейшего uniq, то можно использовать sort  без параметров. Но мы будем использовать более правильную сортировку ip адресов:

sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 $f_out | uniq > $f_tmp

В данном случае, ip адреса будут отсортированы по числовым значениям каждого столбца.

5-я часть кода, это только вывод результата, возможно я бы по другому выписал сети, т.к. выписывание после 16 символа, это не самый лучший вариант, но это не столь важно.


Переменные o_re и ip_re, нам уже ни к чему, поэтому можем их удалить.


После всех правок код выглядит следующим образом:

#!/bin/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 в скриптах? И ради примера, есть задачка на echo в комментариях.


Спасибо за внимание, надеюсь данный пост окажется для вас полезным.


P.s. если был непонятен как-то шаг или конструкция в коде, то жду ваших вопросов в комментариях.

Показать полностью
[моё] Командная оболочка bash Скрипт Программирование Linux Длиннопост Текст
11
40
bashman
8 лет назад
GNU/Linux

Разбор скрипта для командной строки Linux. Часть 1⁠⁠

Недавно в сообществе GNU/Linux появился пост с программой для Shell-а от PetRiot. В комментариях началось обсуждение целесообразности самой программы, но этот вопрос мне не интересен в полной мере, а вот качество самого кода хотелось бы улучшить. Поэтому я решил проанализировать код скрипта и дать пару советов как можно улучшить и сократить код. Надеюсь данный разбор будет полезен как для автора скрипта, так и для остальных читателей.

Начнем с первой строчки:

#!/bin/sh

Shell(sh) - самый старый интерпретатор командной строки, увы у него отсутствует множество возможностей, поэтому лучше использовать /bin/bash.


Данный код работает и в sh, но в дальнейшем мы будем использовать bash:

#!/bin/bash

Далее идет создание(запись названия файлов в переменные) временных файлов:

f_out=.get_ip_ranges
f_tmp=.ips

О том, что эти файлы временные, нам говорит то, что в конце их удаляют:

rm $f_out
rm $f_tmp

Тут сразу бы хотелось отметить несколько вещей:

1) создание временных файлов не всегда хорошо само по себе

2) названия могут конфликтовать с другими файлами, так мы можем случайно затереть важный файл с таким же названием

3) удаление временных файлов в конце кода. В случае ошибки удаление может не сработать(для данного случая маловероятно, но мы же стремимся к хорошему коду)


Первый пункт слишком спорный, поэтому я его проигнорирую.

Но всегда можно обсудить вопрос целесообразности временных файлов, в комментариях к посту.


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

f_out="$(mktemp)"
f_tmp="$(mktemp)"

Теперь временные файлы однозначно уникальные, но нужно обеспечить их удаление в конце работы программы(в конце работы программы != в конце кода программы).


Для решения 3 пункта, используем команду trap:

trap "rm -f $f_out $f_tmp" EXIT

Команда trap запустит посланный ей код сразу после завершения программы, тем самым мы можем быть уверенны что файлы будут удалены. Также мы добавили параметр -f команде rm, который нужен для игнорирования ошибок и убирает вопросы о удалении.

Перед тем как перейти к следующей части, хотелось бы добавить ещё одну важную деталь в скрипт - проверку входных параметров.


Автор забыл упомянуть, что для запуска скрипта нужно обязательно послать один аргумент - название сайта. Если этого не сделать, то работа программы будет не очевидна. Добавим в начало проверку:

if [ -z "$1" ]; then
echo "Error: missing argument" 1>&2 ; exit 1
fi

Если первый аргумент пустой, то выписывается текст ошибки на stderr и программа завершается. В дальнейшем данное решение можно улучшить, создав функцию для ошибок.

Теперь начало кода выглядит так:

#!/bin/bash


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

Идем дальше:

dig $1 A | grep "^$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"

dig $1 A | grep "^$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" > $f_out
dig $1 A | grep "^www.$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
dig $1 A | grep "^www.$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" >> $f_out

Тут начинаются любимые всеми регексы. Увы читабильность кода плохая, поэтому попробуем это исправить:

# Octet regex

o_re="(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"

# IP regex

ip_re="$o_re\.$o_re\.$o_re\.$o_re"


dig $1 A | grep "^$1" | grep -o -E "$ip_re"

dig $1 A | grep "^$1" | grep -o -E "$ip_re" > $f_out

dig $1 A | grep "^www.$1" | grep -o -E "$ip_re"

dig $1 A | grep "^www.$1" | grep -o -E "$ip_re" >> $f_out

Мы создали переменную o_re где находится повторяющая часть ip_re регекса и саму переменную ip_re.


Теперь код короче, но можно сократить ещё:

# Octet regex

o_re="(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
# IP regex
ip_re="$o_re\.$o_re\.$o_re\.$o_re"


dig $1 A | grep "^$1" | grep -o -E "$ip_re" | tee "$f_out"
dig $1 A | grep "^www.$1" | grep -o -E "$ip_re" | tee -a "$f_out"

Используя команду tee мы выписали результат команды в командную строку и одновременно в файл $f_out.

Исправив с учетом этого остальную часть кода и получим:

#!/bin/bash


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


echo "*********************************************"

echo "Get A records from DNS:"

# Octet regex

o_re="(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"

# IP regex

ip_re="$o_re\.$o_re\.$o_re\.$o_re"


dig $1 A | grep "^$1" | grep -o -E "$ip_re" | tee "$f_out"

dig $1 A | grep "^www.$1" | grep -o -E "$ip_re" | tee -a "$f_out"


echo "*********************************************"

echo "Get NS records from DNS:"

dig $1 NS | grep "^$1" | awk {'print $NF}' | while read nsserv

do

nsname=${nsserv:0:${#nsserv}-1}

echo "=================================="

echo "NS: $nsname"

dig @$nsname $1 A | grep "^$1" | grep -o -E "$ip_re" | tee -a $f_out

done


echo "*********************************************"

echo "Resolve ip range from whois service:"

sort -h $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


echo "*********************************************"

echo "Result"

echo "*********************************************"

sort $f_out | uniq | while read range

do

echo "${range:16}"

done


Так код выглядит уже лучше. Для дальнейших исправлений надо углубиться в работу программы, поэтому это будет в следующей части разбора.


Спасибо за внимание, надеюсь данный пост окажется для вас полезным.

P.s. прошу прощение за орфографические ошибки, мне бы точно не помешал разбор моего текста с орфографической точки зрения :)

Показать полностью
[моё] Командная оболочка bash GNU Программирование Shell Linux Скрипт Текст Длиннопост
12
29
Cortana
Cortana
8 лет назад
GNU/Linux

Text-Fu [Часть 3]⁠⁠

Содержание:

Часть 1

Часть 2

7. paste (вставить)

Команда вставить похожа на команду cat, она сливает строки в файле вместе. Давайте создадим новый файл со следующим содержимым:

sample2.txt
The
quick
brown
fox

Давайте объединим все эти строки в одну линию:

$ paste -s sample2.txt

Ограничитель по-умолчанию TAB, так что сейчас у нас одна строка с TABами, разделяющими каждое слово.

Давайте изменим ограничитель (-d) на что-нибудь более читаемое:

$ paste -d ' ' -s sample2.txt

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

Упражнения:

Попробуйте вставить несколько файлов вместе, что получится?

8. head (голова)

Давайте скажем, что у нас есть очень длинный файл, есть много, из чего выбирать, пойдем дальше и cat /var/log/syslog. Вы должны увидеть кучу текста. Что, если бы мы просто хотели просмотреть первые строчки в этом файле? Мы можем это сделать с командой head, по-умолчанию, head показывает первые 10 строчек файла.

$ head /var/log/syslog

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

$ head -n 15 /var/log/syslog

Флаг -n (number / число) нужен для указания числа строк.

Упражнения:

Что делает следующая команда и почему?

$ head -c 15 /var/log/syslog

9. tail (хвост)

Так же как и команда head, команда tail позволяет увидеть последние 10 строк файла по-умолчанию.

$ tail /var/log/syslog

По аналогии с head, вы можете изменять количество строк, которые вы хотите видеть.

$ tail -n 10 /var/log/syslog

Другая замечательная опция - флаг -f (follow / следить), который будет следить за файлом по мере его роста. Попробуйте выполнить следующую команду и посмотрите, что произойдет.

$ tail -f /var/log/syslog

Ваш syslog будет непрерывно изменяться, пока вы взаимодействуете с вашей системой, и используя tail -f вы можете видеть все, что добавляется в этот файл.

Упражнения:

Посмотрите на руководство по команде tail и прочитайте о других опциях, которые мы не обсудили.

$ man tail
Показать полностью
[моё] GNU Linux Командная оболочка bash Текст Урок
13
29
Niomin
9 лет назад
GNU/Linux

Ещё немного про консоль.⁠⁠

Я решил рассказать немного про используемые мной полезности.

Во-первых, только что прочитал про рекомендацию использовать питон в качестве калькулятора.

Если нужно что-то с точностью до целых, то не нужно никакого питона:

echo $((10+15))

echo $((15/2))

Последнее выдаст 7.

Для большей точности, честно говоря, я бы рекомендовал консоль браузера (f12 из него), там оно как-то мощнее и удобнее для математики :)


Другая полезная штука, которую я где-то спёр — сделать алиас sudo !! на что-нибудь. У меня это fuck :)

То есть в консоли можно писать что-то в духе:

apt-get install -y screenfetch

fuck


И про то, как сохранять свои макросы/шорткаты/ещё что: есть файлик ~/.bashrc. Он запускается при запуске баша. То есть всё необходимое стоит писать в него.


Не знаю, что ещё накапитанить, для начала будет так :)

[моё] Linux Командная оболочка bash Консоли Текст
17
86
Cortana
Cortana
9 лет назад
GNU/Linux

Консоль Linux [Часть 4]⁠⁠

13. rm (Remove / удалить)

Думаю, что сейчас у нас появилось множество файлов, давайте удалим несколько. Для того, чтобы удалить файлы вы можете использовать команду rm. Команда rm (remove / удалить) используется для удаления файлов и директорий.

$ rm file1

Будьте осторожны при использовании rm, т.к. не существует волшебной корзины, из которой вы сможете достать удаленные файлы. Однажды исчезнув, они исчезнут навсегда, так что будьте осторожны.

К счастью, существуют меры безопасности, так что очередной Вася не сможет удалить кучу важных файлов. Защищенные от записи файлы спросят ваше подтверждение перед тем, как удалить их. Если директория также защищена от записи, то ее тоже будет не легко удалить.

Но если вам все равно, вы все таки можете удалить множество важных файлов.

$ rm -f file1

Флаг -f или force (насильно) прикажет rm удалить все файлы не зависимо от того, защищены они от записи или нет, без уведомления пользователя (до тех пор, пока у вас есть соответствующие права).

$ rm -i file

Добавление флага -i, также как и к другим командам, будет выдавать запросы на удаление файлов или директорий.

$ rm -r directory

Вы не можете удалить каталог по-умолчанию, поэтому вам нужно добавить флаг -r для удаления всех файлов и подкаталогов, которые у вас есть.

Вы также можете удалить каталог с командой rmdir.

$ rmdir directory

Упражнения:

1. Создайте файл -file (не забудьте тире!).

2. Удалите этот файл.

14. find (найти)

Со всеми теми файлами, которые есть у вас в системе, вам нужно подсуетиться, чтобы найти какой-то один. Для этого мы можем использовать команду find (найти)!

$ find /home -name puppies.jpg

Для find вам нужно задать директорию, в которой вы будете искать, и что вы хотите найти, в этом случае мы пытались найти файл по имени puppies.jpg.

Вы можете указать тип файла, который вы пытетесь найти.

$ find /home -type d -name MyFolder

Как видите, я указал тип файла, который я ищу как директорию (d) и имя MyFolder.

Есть одна крутая вещь, find не останавливается на поиске только внутри данной директории, а продолжает искать то, что вы ищете внутри подкаталогов, которые могут быть в директории.

Задания:

Найдите файл из корневой директории, у которого в названии есть слово net.

15. help (помощь)

Linux имеет несколько встроенных иструментов, которые помогут вам узнать для чего используется та или иная команда, и какие флаги доступны для команды. Первый инструмент, help, встроенная в bash команда, которая предоставит вам помощь для других команд bash (echo, logout, pwd и т.д.)

$ help echo

Эта команда даст вам описание и опции, которые вы можете использовать для запуска echo. Для других исполняемых программ существует традиция иметь функцию --help или что-то вроде того.

$ echo --help

Не все разработчики, которые выпускают программы, следуют этой традиции, поэтому, возможно, вам стоит постараться самим, чтобы найти помощь к программе.

Упражнения:

Выполните команду help на командах echo, logout и pwd.

16. man (manual / руководство)

Надеюсь, что у этих программ есть руководство, чтобы мы могли узнать больше информации о них. К счастью оно есть и носит название справочных страниц (man pages)! Вы можете просмотреть руководство для команд с помощью man.

$ man ls

Справочные страницы (man pages) - справочники, которые встроены в большинство операционных систем Linux. Они предоставляют документацию о командах и других аспектах системы.

Упражнения:

Попробуйте выполнить man на нескольких командах, чтобы получить больше информации о них.

17. whatis (что такое)

Уфф, пока мы узнали совсем немного команд, если вы сомневаетесь о том, что делает команда, то вы можете использовать команду whatis. Эта команда предоставит краткое описание консольных программ.

$ whatis cat

Описание исходит со справочных страниц каждой команды. Если вы запустите whatis cat, то вы увидите небольшую заметку с кратким описанием.

Упражнения:

Запустите комнду whatis на команде less.

18. alias (Алиас, псевдоним)

Иногда печатание команд может стать частым делом, и если вам потребуется написать длинную команду множество раз, лучше всего создать алиас. Для того, чтобы создать алиас для команды, просто введите alias, имя и присвойте его команде.

$ alias foobar='ls -la'

Теперь вместо набор ls -ls, вы можете напечатать foobar и команда исполнится, довольно интересно. Помните, что эта команда не сохраняет ваши алиасы после перезагрузки, так что если вам понадобится постоянный алиас, поместите его в:

~/.bashrc

или в похожие файлы, если они сохраняются после перезагрузки.

Вы можете удалить алиасы с командой unalias:

$ unalias foobar

Упражнения:

Создайте несколько алиасов, затем удалите их.

19. exit (выход)

Вы проделали хорошую работу, пройдя через эти основы. Но мы затронули только вершину айсберга, теперь, после того как вы научились ползать, вы должны научиться ходить.


Сейчас вы можете похлопать себя по спине и отдохнуть. Для выхода из консоли вы можете использовать команду exit (выход):

$ exit

Или команду logout (выход из системы):

$ logout

Или, если вы работали с терминалом с GUI, вы можете просто закрыть консоль.

Вместе с консолью закрывается и наш курс. Спасибо за внимание.

0124

Показать полностью
[моё] Linux GNU Командная строка Командная оболочка bash Длиннопост Текст
72
45
Cortana
Cortana
9 лет назад
GNU/Linux

Консоль Linux [Часть 3]⁠⁠

Содержание:

Часть 1

Часть 2

9. history (история)

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

$ history

Хотите запусть команду, которую запускали до этого момент, просто нажмите стрелку вверх.

Хотите запустить команду, введенную ранее, без ее набора? Используйте !!. Если вы ввели cat file1 и хотите запустить ее еще раз, вы можете просто набрать !!, это выполнит последнюю команду, которую вы запускали.

Другой способ пробежаться по истории - ctrl + R, это команда обратного (Reverse) поиска, если вы нажмете ctrl + R и начнете печатать часть команды, которую вы хотите, команда покажет вам совпадения, по которым вы можете перемещаться нажав ctrl + R снова. Найдя нужную команду, нажмите Enter.

В нашем терминале образовался беспорядок, не так ли? Давайте его немного почистим, используйте команду clear (очистить) для очистки экрана.

$ clear

Так лучше, не правда ли?

Пока мы говорим об этих полезных вещах, одна из наиболее полезных функций в любой командной среде - автозавершение по tab. Если вы начнете печатать начало команды, файла, директории и т.д. и нажмете клавишу Tab, она автоматически завершит ввод, основываясь на том, что было найдено в директории, если не найдено других названий, начинающихся на те же буквы. Например, если вы хотите ввести команду chrome, вы можете ввести chr и нажать Tab, которая дополнит слово до chrome.

Упражнения:

Поперемещайтесь по истории ваших команд используя клавиши Вверх и Вних. Поиграйтесь с обратным поиском на ctrl + R.

10. cp (Copy / копировать)

Давайте начнем создавать копии файлов. Во многом похоже на копирование и вставку файлов в других операционных системах, оболчка дает нам более простой способ сделать это.

$ cp mycoolfile /home/pete/Documents/cooldocs

mycoolfile - это файл, который вы хотите скопирова и /home/pete/Documents/cooldocs - это то, куда вы хотите скопировать файл.

Вы можете копировать несколько файлов и директорий используя wildcard (подстановочный знак). Wildcard - символ, который может быть заменен на выбранный шаблон, давая большую гибкость при поиске. Вы можете использовать подстановочные знаки в любой команде для большей гибкости.

* wildcard всех wildcard'ов, используется для обозначения любых символов или строк

? используется для обозначения одного символа

[] используется для обозначения любого символа в скобках

$ cp *.jpg /home/pete/Pictures

Это скопирует все файлы с расширением .jpg в текущей директории в каталог Pictures.

Полезно дополнить команду флагом -r (recursively/рекурсивно), которая рекурсиво скопирует файлы и директории внутри каталога.

Попробуйте выполнить cp на директории, которая содержит несколько файлов в вашу директорию Documents. Не сработало? Это потому что необходимо также скопировать файлы и каталоги с флагом -r

$ cp -r Pumpkin/ /home/pete/Documents

Заметьте одну вещь, если вы копируете файл в директорию, которая содержит файл с таким же именем, то этот файл будет перезаписан на то, что вы копируете. Это плохо, если у вас есть файл, который вы не хотите случайно перезаписать. Вы можете использовать флаг -i (interactive/интерактивно), чтобы получить запрос на перезапись файла.

$ cp -i mycoolfile /home/pete/Pictures

Упражнения:

Скопируйте несколько файлов, будьте осторожны, не перезапишите что-нибудь важное.

11. mv (Move / переместить)

Используется, чтобы перемещать файлы и переименовывать их. Довольно похоже на команду cp, касательно флагов и функциональности.

Вы можете переименовать файлы вот так:

$ mv oldfile newfile

Или вы можете переместить файл в другую директорию:

$ mv file2 /home/pete/Documents

А также перемещать больше, чем один файл:

$ mv file_1 file_2 /somedirectory

Директории тоже можно переименовывать:

$ mv directory1 directory2

Также как и cp, если вы перемещаете файл или директорию, mv может что-либо перезаписать. Так что вы можете использовать флаг -i для получения запроса на перезапись.

mv -i directory1 directory2

Давайте скажем, что вы хотели переместить файл с перезаписью первого. Вы можете сделать резервную копию (backup) этого файла и переименовать его старую версию с помощю -b.

$ mv -b directory1 directory2

Упражнения:

Переименуйте файл, затем переместите его в другой каталог.

12. mkdir (Make Directory / создать каталог)

Нам потребуются несколько каталогов для того, чтобы хранить те файлы, над которыми мы работем. Для этого нам пригодится команда mkdir (make directory / создать каталог), которая создаст новую директорию, если она еще не существует. Вы можете создавать несколько директорий в одно и то же время.

$ mkdir books paintings

Вы также можете создавать подкаталоги с флагом -p (parent / родитель).

$ mkdir -p books/hemmingway/favorites

Упражнения:

Создайте несколько директорий и переместите туда несколько файлов.

Показать полностью
[моё] Linux GNU Командная строка Командная оболочка bash Длиннопост Текст
32
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии