/l3/trainings/nt-lnet/2006-02-18/fbsd2/root :1 :2 :3 :4 :5 :6 :7 :8 :9 :10 :11 :12 :13 :14 :15 :16 :17 :18 :19 :20 :21 :22 :23 :24 |
|
#cat /dev/zero | /usr/local/bin/nc -l -p 3000
|
#ls
.ICEauthority .john arp .Xauthority .k5login arp:remote .Xresources .kde b .bash_history .lftp fr .bash_logout .lilalo hi .bash_profile .login log.eci .bashrc .metacity log.ecp .cshrc .mozilla mbox .gconf .nautilus mi.sh .gconfd .profile myfile .gnome .qt mymotd .gnome2 .recently-used mynologin .gnome2_private .ssh mytgz .gstreamer .tcshrc nt.com.ua .gstreamer-0.8 .viminfo ports-supfile .gtkrc .vimrc soft .gtkrc-1.2-gnome2 .xinitrc sum-myfile .history 1.sh xorg.conf.new .inputrc Desktop |
#w
18:15 up 6:03, 5 users, load averages: 0,00 0,00 0,00 USER TTY FROM LOGIN@ IDLE WHAT root v0 - 12:13 53 script -t 0 -q /root/.lila root v1 - 16:39 6 script -t 0 -q /root/.lila user v2 - 12:22 5:31 script -t 0 -q /home/user/ root v3 - 15:20 2:55 script -t 0 -q /root/.lila root p2 linux.nt 17:22 - script -t 0 -q /root/.lila |
#ps aux | grep l3-agent
|
#l3-agent
l3-agent is already running: pid=535; pidfile=/root/.lilalo/l3-agent.pid |
#ps wux | grep l3-agent
root 35008 0,0 0,1 1448 980 p3 R+ 18:15 0:00,00 grep l3-agent |
#rm ~/.l
.lftp/ .lilalo/ .login |
#rm ~/.lilalo/l3-agent.pid
|
#l3-agent
|
#ls ~/.lilalo/
049T1_12:19:47__etc_rc.conf.diff 049T1_12:51:27__etc_rc.conf.diff 049T1_12:54:29__etc_rc.conf.diff 049T1_12:55:38__etc_rc.conf.diff 049T1_12:55:57__etc_rc.conf.diff 049T1_12:58:09__etc_rc.conf.diff 049T1_13:02:21__etc_rc.conf.diff 049T1_13:05:33__etc_rc.cong.diff 049T1_13:05:40__etc_rc.conf.diff 049T1_13:09:34__etc_rc.conf.diff ... ttyv3-1730.info ttyv3-1730.script ttyv3-6444.info ttyv3-6444.script ttyv3-7005.info ttyv3-7005.script ttyv4-2506.info ttyv4-2506.script ttyvb-6068.info ttyvb-6068.script |
#ls ~/.lilalo/.
./ ../ .report.dat |
#ls ~/.lilalo/.report.dat
/root/.lilalo/.report.dat |
#less ~/.lilalo/.report.dat
|
#who
root ttyv0 18 ÆÅ× 12:13 root ttyv1 18 ÆÅ× 16:39 user ttyv2 18 ÆÅ× 12:22 root ttyv3 18 ÆÅ× 15:20 root ttyp2 18 ÆÅ× 17:22 (linux.nt) |
#w
18:24 up 6:12, 5 users, load averages: 0,00 0,16 0,13 USER TTY FROM LOGIN@ IDLE WHAT root v0 - 12:13 1:02 script -t 0 -q /root/.lila root v1 - 16:39 15 script -t 0 -q /root/.lila user v2 - 12:22 5:40 script -t 0 -q /home/user/ root v3 - 15:20 3:04 script -t 0 -q /root/.lila root p2 linux.nt 17:22 - script -t 0 -q /root/.lila |
#w | less
|
#ps aux | grep l3-agent
root 35031 0,0 1,3 17144 13400 ?? Ss 18:16 3:09,88 l3-agent (perl5.8.7) |
#cat /usr/local/bin/l3
l3-agent l3config.pm |
#cat /usr/local/bin/l3
l3-agent l3config.pm |
#less/local/bin/l3config.pm
"daemon_sleep_interval" => "10", "detach" => "yes", "agent_pidfile" => "$ENV{HOME}/.lilalo/l3-agent.pid", use Exporter; "backend_address" => "192.168.15.254", "backend_port" => "18030", "backend_pidfile" => "/tmp/l3-backend.pid", "backend_datafile" => "/var/lilalo/lablogs-xml/backend.xml", @EXPORT = qw(%Config &init_config); "l3-agent" => "l3-agent", ... "course-trainer" => "", ", "course-student" => "", , "skip_wrong" => "no", "filter" => "", ["vi", "pico", "ee", "vim", "nano"], #lm "pagers" => ["more", "less", "zmore", "zless", "info", "show_host" => "no","man", "mc", "trafshow", "screen", "cfdisk", "trafshow-bsd", "yes", "lynx", "links", "cen # Вспомогательные программы #"l3-report" => "./lm-report", ], "l3-report" => "./l3-report", |
#ping 192.168.15.254
PING 192.168.15.254 (192.168.15.254): 56 data bytes 64 bytes from 192.168.15.254: icmp_seq=0 ttl=64 time=0.321 ms ^C --- 192.168.15.254 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.321/0.321/0.321/0.000 ms |
#telnet 192.168.15.254
Trying 192.168.15.254... Connected to linux.nt. Escape character is '^]'. ^] telnet> q Connection closed. |
#w
exit 18:26 up 6:14, 5 users, load averages: 0,11 0,13 0,11 USER TTY FROM LOGIN@ IDLE WHAT root v0 - 12:13 1:04 script -t 0 -q /root/.lila root v1 - 16:39 17 script -t 0 -q /root/.lila user v2 - 12:22 5:42 script -t 0 -q /home/user/ root v3 - 15:20 3:06 script -t 0 -q /root/.lila root p2 linux.nt 18:26 - script -t 0 -q /root/.lila |
#ps aux | grep l3-agent
root 35031 0,0 1,3 17144 13400 ?? Ss 18:16 3:11,64 l3-agent (perl5.8.7) |
#kill 35031
|
#kill 35031
bash: kill: (35031) - No such process |
#grep l3-agent ~/.bash_profile
/usr/local/bin/l3-agent > /dev/null 2>&1 /dev/null |
#l3-agent
|
#ifconfig
xl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=9<RXCSUM,VLAN_MTU> inet6 fe80::204:79ff:fe67:9671%xl0 prefixlen 64 scopeid 0x1 inet 192.168.16.2 netmask 0xffffffc0 broadcast 192.168.16.63 ether 00:04:79:67:96:71 media: Ethernet autoselect (none) status: no carrier fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=8<VLAN_MTU> inet6 fe80::207:e9ff:fe45:d2c%fxp0 prefixlen 64 scopeid 0x2 inet 192.168.15.22 netmask 0xffffff00 broadcast 192.168.15.255 ether 00:07:e9:45:0d:2c media: Ethernet autoselect (100baseTX <full-duplex>) status: active lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 inet 127.0.0.1 netmask 0xff000000 |
#ifconfig fxp0 192.168.16.37/30
|
#ping 192.168.16.38
PING 192.168.16.38 (192.168.16.38): 56 data bytes 64 bytes from 192.168.16.38: icmp_seq=0 ttl=64 time=0.458 ms ^C --- 192.168.16.38 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.458/0.458/0.458/0.000 ms |
#netstat -rn
Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire 127.0.0.1 127.0.0.1 UH 0 0 lo0 192.168.16/26 link#1 UC 0 0 xl0 192.168.16.36/30 link#2 UC 0 0 fxp0 192.168.16.38 00:0a:01:d4:d1:e3 UHLW 1 1 fxp0 1195 Internet6: Destination Gateway Flags Netif Expire ::1 ::1 UH lo0 fe80::%xl0/64 link#1 UC xl0 fe80::204:79ff:fe67:9671%xl0 00:04:79:67:96:71 UHL lo0 fe80::%fxp0/64 link#2 UC fxp0 fe80::207:e9ff:fe45:d2c%fxp0 00:07:e9:45:0d:2c UHL lo0 fe80::%lo0/64 fe80::1%lo0 U lo0 fe80::1%lo0 link#3 UHL lo0 ff01::/32 ::1 U lo0 ff02::%xl0/32 link#1 UC xl0 ff02::%fxp0/32 link#2 UC fxp0 ff02::%lo0/32 ::1 UC lo0 |
#route add 192.168.16.38
route: writing to routing socket: Invalid argument add host 192.168.16.38: Invalid argument |
#route add default 192.168.16.38
add net default: gateway 192.168.16.38 |
#netstat -rn
Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 192.168.16.38 UGS 0 0 fxp0 127.0.0.1 127.0.0.1 UH 0 0 lo0 192.168.16/26 link#1 UC 0 0 xl0 192.168.16.36/30 link#2 UC 0 0 fxp0 192.168.16.38 00:0a:01:d4:d1:e3 UHLW 2 1 fxp0 1174 Internet6: Destination Gateway Flags Netif Expire ::1 ::1 UH lo0 fe80::%xl0/64 link#1 UC xl0 fe80::204:79ff:fe67:9671%xl0 00:04:79:67:96:71 UHL lo0 fe80::%fxp0/64 link#2 UC fxp0 fe80::207:e9ff:fe45:d2c%fxp0 00:07:e9:45:0d:2c UHL lo0 fe80::%lo0/64 fe80::1%lo0 U lo0 fe80::1%lo0 link#3 UHL lo0 ff01::/32 ::1 U lo0 ff02::%xl0/32 link#1 UC xl0 ff02::%fxp0/32 link#2 UC fxp0 ff02::%lo0/32 ::1 UC lo0 |
#ping mail.ru
^C |
#sysctl -a | grep forwq
|
#sysctl -a | grep forw
net.inet.ip.forwarding: 1 net.inet.ip.fastforwarding: 0 net.inet6.ip6.forwarding: 0 |
#ping mail.ru
PING mail.ru (194.67.57.26): 56 data bytes 64 bytes from 194.67.57.26: icmp_seq=0 ttl=112 time=124.561 ms 64 bytes from 194.67.57.26: icmp_seq=1 ttl=112 time=124.732 ms 64 bytes from 194.67.57.26: icmp_seq=2 ttl=112 time=120.811 ms ^C --- mail.ru ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max/stddev = 120.811/123.368/124.732/1.809 ms |
#kldload ipfw
|
#ipfw list
65535 deny ip from any to any |
#ifconfig
xl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=9<RXCSUM,VLAN_MTU> inet6 fe80::204:79ff:fe67:9671%xl0 prefixlen 64 scopeid 0x1 inet 192.168.16.2 netmask 0xffffffc0 broadcast 192.168.16.63 ether 00:04:79:67:96:71 media: Ethernet autoselect (none) status: no carrier fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=8<VLAN_MTU> inet6 fe80::207:e9ff:fe45:d2c%fxp0 prefixlen 64 scopeid 0x2 inet 192.168.16.37 netmask 0xfffffffc broadcast 192.168.16.39 ether 00:07:e9:45:0d:2c media: Ethernet autoselect (100baseTX <full-duplex>) status: active lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 inet 127.0.0.1 netmask 0xff000000 |
#ipfw list
65535 deny ip from any to any |
#ipfw add 65000 allow ip from any to any
65000 allow ip from any to any |
#ipfw add 1000 deny tcp from any to any via fxp0 in setup
01000 deny tcp from any to any via fxp0 in setup |
#ipfw add 1000 deny tcp from any to me via fxp0 in setup
01000 deny tcp from any to me via fxp0 in setup |
#ipfw delete 1000
|
#ipfw list
65000 allow ip from any to any 65535 deny ip from any to any |
#ipfw add 1000 deny tcp from any to any via fxp0 in setup
01000 deny tcp from any to any via fxp0 in setup |
#lynx freebsd.org.ua
|
#ping freebsd.org.ua
PING freebsd.org.ua (212.110.130.74): 56 data bytes 64 bytes from 212.110.130.74: icmp_seq=0 ttl=48 time=147.472 ms ^C --- freebsd.org.ua ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max/stddev = 147.472/147.472/147.472/0.000 ms |
#ipfw list
01000 deny tcp from any to any via fxp0 in setup 65000 allow ip from any to any 65535 deny ip from any to any |
#fetch freebsd.org.ua
fetch: freebsd.org.ua: No such file or directory |
#fetch http://freebsd.org.ua
^Cfetch: transfer interrupted |
#ipfw delete 1000
|
#fetch http://freebsd.org.ua
^Cfetch: transfer interrupted |
#fetch http://www.freebsd.org.ua
www.freebsd.org.ua 100% of 10 kB 81 kBps |
#ls
.ICEauthority .john arp .Xauthority .k5login arp:remote .Xresources .kde b .bash_history .lftp fr .bash_logout .lilalo hi .bash_profile .login log.eci .bashrc .metacity log.ecp .cshrc .mozilla mbox .gconf .nautilus mi.sh .gconfd .profile myfile .gnome .qt mymotd .gnome2 .recently-used mynologin .gnome2_private .ssh mytgz .gstreamer .tcshrc nt.com.ua .gstreamer-0.8 .viminfo ports-supfile .gtkrc .vimrc soft .gtkrc-1.2-gnome2 .xinitrc sum-myfile .history 1.sh www.freebsd.org.ua .inputrc Desktop xorg.conf.new |
#rm www.freebsd.org.ua
|
#ipfw add 1000 deny tcp from any to any via fxp0 in setup
01000 deny tcp from any to any via fxp0 in setup |
#fetch http://www.freebsd.org.ua
www.freebsd.org.ua 100% of 10 kB 12 MBps |
#ipfw delete 1000
|
#ipfw add 1000 deny tcp from any to any via fxp0 in
01000 deny tcp from any to any via fxp0 in |
#fetch http://www.freebsd.org.ua
^Cfetch: transfer interrupted |
#ipfw delete 1000
|
#ipfw delete 1000
ipfw: rule 1000: setsockopt(IP_FW_DEL): Invalid argument |
#ipfw add 1000 deny tcp from any to any via fxp0 in setup
01000 deny tcp from any to any via fxp0 in setup |
#man nmap
|
#man nmap
|
#ipfw list
01000 deny tcp from any to any via fxp0 in setup 65000 allow ip from any to any 65535 deny ip from any to any |
#man nmap
|
#ipfw list
01000 deny tcp from any to any via fxp0 in setup 65000 allow ip from any to any 65535 deny ip from any to any |
#ipfw del 1000
ipfw: DEPRECATED: 'del' matched 'delete' as a sub-string |
#ipfw add 1000 tcp from me to any via fxp0 keep-state
ipfw: invalid action tcp |
#ipfw add 1000 allow tcp from me to any via fxp0 keep-state
01000 allow tcp from me to any via fxp0 keep-state |
#ipfw listr
ipfw: bad command `listr' |
#ipfw list
01000 allow tcp from me to any via fxp0 keep-state 65000 allow ip from any to any 65535 deny ip from any to any |
#ipfw add 2000 deny tcp from any to any
02000 deny tcp from any to any |
#lynx www.freebsd.org.ua
|
#lynx www.linux.org.ru
|
#lynx www.freebsd.org.ua
|
#lynx uafug.org.ua
|
#vi /usr/local/etc/lynx.cfg
396a397 > CHARACTER_SET:koi8-r |
#lynx uafug.org.ua
|
#ipfw list
01000 allow tcp from me to any via fxp0 keep-state 02000 deny tcp from any to any 65000 allow ip from any to any 65535 deny ip from any to any |
#ipfw del 2000
ipfw: DEPRECATED: 'del' matched 'delete' as a sub-string |
#ipfw add 2000 reset tcp from any to any
02000 reset tcp from any to any |
#lynx uafug.org.ua
|
#ipfw -d list
01000 284 117673 allow tcp from me to any via fxp0 keep-state 02000 1664 66560 reset tcp from any to any 65000 11610 500483 allow ip from any to any 65535 4 136 deny ip from any to any ## Dynamic rules (3): |
#ipfw -d list
01000 284 117673 allow tcp from me to any via fxp0 keep-state 02000 1664 66560 reset tcp from any to any 65000 11610 500483 allow ip from any to any 65535 4 136 deny ip from any to any ## Dynamic rules (3): |
#ipfw list
01000 allow tcp from me to any via fxp0 keep-state 02000 reset tcp from any to any 65000 allow ip from any to any 65535 deny ip from any to any |
#lynx uafug.org.ua
|
#ipfw -d list
01000 312 126588 allow tcp from me to any via fxp0 keep-state 02000 1664 66560 reset tcp from any to any 65000 11618 501335 allow ip from any to any 65535 4 136 deny ip from any to any ## Dynamic rules (6): |
#ipfw -d list
01000 312 126588 allow tcp from me to any via fxp0 keep-state 02000 1664 66560 reset tcp from any to any 65000 11618 501335 allow ip from any to any 65535 4 136 deny ip from any to any ## Dynamic rules (6): |
#ipfw list
01000 allow tcp from me to any via fxp0 keep-state 02000 reset tcp from any to any 65000 allow ip from any to any 65535 deny ip from any to any |
#ipfw add 1500 allow udp from me to any via fxp0 keep-state
01500 allow udp from me to any via fxp0 keep-state |
#ipfw add 2100 unreach port udp from any to any
02100 unreach port udp from any to any |
#ipfw -d list
01000 344 131376 allow tcp from me to any via fxp0 keep-state 01500 6 634 allow udp from me to any via fxp0 keep-state 02000 1664 66560 reset tcp from any to any 02100 0 0 unreach port udp from any to any 65000 11618 501335 allow ip from any to any 65535 4 136 deny ip from any to any ## Dynamic rules (13): 01500 1 196 (8s) STATE udp 192.168.16.37 54517 <-> 192.168.15.254 53 01500 1 103 (7s) STATE udp 192.168.16.37 55912 <-> 192.168.15.254 53 01500 1 176 (7s) STATE udp 192.168.16.37 50946 <-> 192.168.15.254 53 |
#host mail.ru
mail.ru has address 194.67.57.26 mail.ru mail is handled by 10 mxs.mail.ru. |
l3-agent l3config.pm
Время первой команды журнала | 17:38:00 2006- 2-18 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Время последней команды журнала | 09:44:38 2006- 2-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Количество командных строк в журнале | 101 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Процент команд с ненулевым кодом завершения, % | 9.90 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Процент синтаксически неверно набранных команд, % | 0.00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Суммарное время работы с терминалом *, час | 0.63 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Количество командных строк в единицу времени, команда/мин | 2.68 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Частота использования команд |
|
В журнал автоматически попадают все команды, данные в любом терминале системы.
Для того чтобы убедиться, что журнал на текущем терминале ведётся, и команды записываются, дайте команду w. В поле WHAT, соответствующем текущему терминалу, должна быть указана программа script.
Команды, при наборе которых были допущены синтаксические ошибки, выводятся перечёркнутым текстом:
$ l s-l bash: l: command not found |
Если код завершения команды равен нулю, команда была выполнена без ошибок. Команды, код завершения которых отличен от нуля, выделяются цветом.
$ test 5 -lt 4 |
Команды, ход выполнения которых был прерван пользователем, выделяются цветом.
$ find / -name abc find: /home/devi-orig/.gnome2: Keine Berechtigung find: /home/devi-orig/.gnome2_private: Keine Berechtigung find: /home/devi-orig/.nautilus/metafiles: Keine Berechtigung find: /home/devi-orig/.metacity: Keine Berechtigung find: /home/devi-orig/.inkscape: Keine Berechtigung ^C |
Команды, выполненные с привилегиями суперпользователя, выделяются слева красной чертой.
# id uid=0(root) gid=0(root) Gruppen=0(root) |
Изменения, внесённые в текстовый файл с помощью редактора, запоминаются и показываются в журнале в формате ed. Строки, начинающиеся символом "<", удалены, а строки, начинающиеся символом ">" -- добавлены.
$ vi ~/.bashrc
|
Для того чтобы изменить файл в соответствии с показанными в диффшоте изменениями, можно воспользоваться командой patch. Нужно скопировать изменения, запустить программу patch, указав в качестве её аргумента файл, к которому применяются изменения, и всавить скопированный текст:
$ patch ~/.bashrc |
Для того чтобы получить краткую справочную информацию о команде, нужно подвести к ней мышь. Во всплывающей подсказке появится краткое описание команды.
Если справочная информация о команде есть, команда выделяется голубым фоном, например: vi. Если справочная информация отсутствует, команда выделяется розовым фоном, например: notepad.exe. Справочная информация может отсутствовать в том случае, если (1) команда введена неверно; (2) если распознавание команды LiLaLo выполнено неверно; (3) если информация о команде неизвестна LiLaLo. Последнее возможно для редких команд.
Большие, в особенности многострочные, всплывающие подсказки лучше всего показываются браузерами KDE Konqueror, Apple Safari и Microsoft Internet Explorer. В браузерах Mozilla и Firefox они отображаются не полностью, а вместо перевода строки выводится специальный символ.
Время ввода команды, показанное в журнале, соответствует времени начала ввода командной строки, которое равно тому моменту, когда на терминале появилось приглашение интерпретатора
Имя терминала, на котором была введена команда, показано в специальном блоке. Этот блок показывается только в том случае, если терминал текущей команды отличается от терминала предыдущей.
Вывод не интересующих вас в настоящий момент элементов журнала, таких как время, имя терминала и других, можно отключить. Для этого нужно воспользоваться формой управления журналом вверху страницы.
Небольшие комментарии к командам можно вставлять прямо из командной строки. Комментарий вводится прямо в командную строку, после символов #^ или #v. Символы ^ и v показывают направление выбора команды, к которой относится комментарий: ^ - к предыдущей, v - к следующей. Например, если в командной строке было введено:
$ whoami
user
$ #^ Интересно, кто я?в журнале это будет выглядеть так:
$ whoami
user
Интересно, кто я? |
Если комментарий содержит несколько строк, его можно вставить в журнал следующим образом:
$ whoami
user
$ cat > /dev/null #^ Интересно, кто я?
Программа whoami выводит имя пользователя, под которым мы зарегистрировались в системе. - Она не может ответить на вопрос о нашем назначении в этом мире.В журнале это будет выглядеть так:
$ whoami user
|
Комментарии, не относящиеся непосредственно ни к какой из команд, добавляются точно таким же способом, только вместо симолов #^ или #v нужно использовать символы #=
1 2 3 4Группы команд, выполненных на разных терминалах, разделяются специальной линией. Под этой линией в правом углу показано имя терминала, на котором выполнялись команды. Для того чтобы посмотреть команды только одного сенса, нужно щёкнуть по этому названию.
LiLaLo (L3) расшифровывается как Live Lab Log.
Программа разработана для повышения эффективности обучения Unix/Linux-системам.
(c) Игорь Чубин, 2004-2008