Журнал лабораторных работ

Содержание

Журнал

Пятница (11/22/13)

/dev/pts/5
15:39:00
#apt-get install libsrtp0-dev

15:39:00
#help | less
15:39:00
#ls

15:39:00
#ls

15:39:00
#vim /etc/asterisk/cdr_mysql.conf
15:39:00
#mysql -u root -p

15:39:00
# s

15:39:00
#history

15:39:00
#apt-cache search openssl dev

15:39:00
#make config

15:39:00
#help | grep tone
                                                                                                             history | grep 'apt-get install' | tail
                               #./configure --disable-xmldoc --with-srtp --with-
-ssl --with-pri --with-dahdi --with-tonezone-disable-xmldoc --with-srtp --with-
/dev/pts/16
15:39:02
#ssh 192.168.15.4
root@192.168.15.4's password:
Linux liniux4 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Nov 22 15:19:09 2013 from linux0.local
l3-agent is already running: pid=16715; pidfile=/root/.lilalo/l3-agent.pid
root@liniux4:~# find / -name \*vaw
...
liniux4*CLI> dahdi
destroy  restart  set      show
liniux4*CLI> quit
Asterisk cleanly ending (0).
Executing last minute cleanups
root@liniux4:~#
root@liniux4:~#
root@liniux4:~# exit
logout
Connection to 192.168.15.4 closed.
15:43:11
#ssh 192.168.15.3
root@192.168.15.3's password:
Linux linux3 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Nov 22 15:51:07 2013 from linux0.local
l3-agent is already running: pid=3682; pidfile=/root/.lilalo/l3-agent.pid
root@linux3:~# asterisk -rvvvv
...
aspell/   asterisk/
root@linux3:~# ls /var/lib/asterisk/
agi-bin    astdb.sqlite3  images  phoneprov  static-http
astdb      documentation  keys    sounds
astdb.bak  firmware       moh     sqlite.db
root@linux3:~# ls /var/lib/asterisk/sounds/
en  ru  tts
root@linux3:~# exit
logout
Connection to 192.168.15.3 closed.
15:50:19
#ыÑssh 192.168.15.1
#!/bin/sh
for CHANNEL in `< channels.txt`
    file=/tmp/${RANDOM}.call
do
    cat <<EOF > $file
Channel: $CHANNEL
Context: 123
Ext chown asterisk:asterisk $file
    mv $file /var/spool/asterisk/outgoing
~
...
root@linux1:/home/user# scp
::1:             ff02::2:         linux1:          Pictures/
channels.txt     img              linux1.unix.nt:  Public/
Desktop/         ip6-allnodes:    localhost:       Templates/
Documents/       ip6-allrouters:  Music/           Videos/
Downloads/       ip6-localhost:   pescyvsem.sh
ff02::1:         ip6-loopback:    pescyvsem.txt
root@linux1:/home/user# exit
logout
Connection to 192.168.15.1 closed.
15:57:03
#ssh 192.168.15.4
[internal]
exten => 5000,1,Answernels.txt`
exten => 5000,n,Playback(demo-thanks)
do
    cat <<EOF > $file
exten => _80XX,1,Answer
exten => _80XX,n,Record(/var/tmp/asterisk/records/record${EXTEN:2}:gsm)
exten => _80XX,n,Playback(/var/tmp/asterisk/records/record${EXTEN:2})
exten => 8100,1,VoiceMailMain()le
exten => 8101,1,MeetMe(101,r)
...
[Nov 22 17:04:52] NOTICE[31787]: pbx_spool.c:402 attempt_thread: Call completed to SIP/liverpool/2302
  == Spawn extension (local, 2191, 1) exited non-zero on 'SIP/manchester-00000035'
[Nov 22 17:06:14] NOTICE[31775]: pbx_spool.c:402 attempt_thread: Call completed to SIP/manchester/2201
liniux4*CLI>
Disconnected from Asterisk server
Asterisk cleanly ending (0).
Executing last minute cleanups
root@liniux4:~# exit
logout
Connection to 192.168.15.4 closed.
прошло 14 минут
16:11:21
#vim /usr/local/bin/asterisk-block-users.pl
--- /dev/null	2013-11-17 18:31:26.295171800 +0200
+++ /usr/local/bin/asterisk-block-users.pl	2013-11-22 17:13:17.780470637 +0200
@@ -0,0 +1,78 @@
+#!/usr/bin/perl -w
+# Crontab Schedule - runs every 2 minutes and writes to log file
+#   */2 * * * * perl /root/check-failed-regs2.pl &> /var/log/fail.log 2>&1
+#
+# IP Tables Configuration - do this first
+#  iptables -N asterisk
+#  iptables -A INPUT -j asterisk
+#  iptables -A FORWARD -j asterisk
+#
+
+use strict;
+use warnings;
+my (@failhost);
+my %currblocked;
+my %addblocked;
+my $action;
+
+# Set the path and filename for the Asterisk log file
+open (MYINPUTFILE, "/var/log/asterisk/full") or die "\n", $!, "Does log file file exist\?\n\n";
+
+while (<MYINPUTFILE>) {
+   my ($line) = $_;
+   chomp($line);
+# Test for no patching peer
+   if ($line =~ m/\' failed for \'(.*?)\' - No matching peer found/) {
+      push(@failhost,$1);
+   }
+# Test for wrong password
+   if ($line =~ m/\' failed for \'(.*?)\' - Wrong password/) {
+      push(@failhost,$1);
+   }
+}
+# Loads the existing list of entries in the asterisk iptable.  Check path.
+my $blockedhosts = `/sbin/iptables -n -L asterisk`;
+
+while ($blockedhosts =~ /(.*)/g) {
+   my ($line2) = $1;
+   chomp($line2);
+   if ($line2 =~ m/(\d+\.\d+\.\d+\.\d+)(\s+)/) {
+      $currblocked{ $1 } = 'blocked';
+   }
+}
+
+if (@failhost) {
+   &count_unique(@failhost);
+   while (my ($ip, $count) = each(%addblocked)) {
+# Already blocked - ignore      
+      if (exists $currblocked{ $ip }) {
+         print "$ip already blocked\n";
+      } else {
+# Private network address, probably internal, fix the offending sip device
+      if ($ip =~ /^172\./) {
+         print "$ip is screwed up - fix the phone!\n";
+      } else {
+# block address with too many failed requests - tweak via $count >= 4
+         if ($count >= 4) {
+            $action = `iptables -I asterisk -s $ip -j DROP`;
+            print "$ip blocked. Failed attempts: $count\n";
+         } else {
+            print "$ip NOT blocked. Only $count failed attempt(s).\n";
+         }}
+      }
+   }
+} else {
+# Uncomment next line for verification of operation/debugging
+#   print "no failed registrations.\n";
+}
+
+sub count_unique {
+    my @array = @_;
+    my %count;
+    map { $count{$_}++ } @array;
+    map {($addblocked{ $_ } = ${count{$_}})} sort keys(%count);
+}
+
+
+
+
16:13:17
#mv /usr/local/bin/asterisk-block-users.pl /usr
                                                                          usr
/local/bin/check-failed-regs.pl
16:13:30
#ls -l /usr/local/bin/check-failed-regs.pl
-rw-r--r-- 1 root staff 2149 Nov 22 17:13 /usr/local/bin/check-failed-regs.pl
16:13:33
#vim /usr/local/bin/check-failed-regs.pl
--- /tmp/l3-saved-14288.403.6336	2013-11-22 17:13:51.000000000 +0200
+++ /usr/local/bin/check-failed-regs.pl	2013-11-22 17:14:04.224471192 +0200
@@ -16,7 +16,7 @@
 my $action;
 
 # Set the path and filename for the Asterisk log file
-open (MYINPUTFILE, "/var/log/asterisk/full") or die "\n", $!, "Does log file file exist\?\n\n";
+open (MYINPUTFILE, "/var/log/asterisk/messages") or die "\n", $!, "Does log file file exist\?\n\n";
 
 while (<MYINPUTFILE>) {
    my ($line) = $_;
16:14:04
#ls /var/log/asterisk/
cdr-csv  cdr-custom  cel-custom  messages
16:14:06
#vim /usr/local/bin/check-failed-regs.pl
16:15:55
#!/usr/bin/perl -w
ile: /tmp/crontab.G6MYBE/crontab
                                 # Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# GNU nano 2.2.6
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
...
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
                              [ Read 22 lines ]
No modification made
16:16:03
#export EDITOR=vim

16:16:08
#crontab -e
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
...
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
~
16:16:36
#vim /usr/local/bin/check-failed-regs.pl
16:17:26
#crontab -l | tail -2
* * * * * perl /usr/local/bin/check-failed-regs.pl &> /var/log/asterisk/fail.log 2>&1
16:23:22
#perl /usr/local/bin/check-failed-regs.pl
iptables: No chain/target/match by that name.
192.168.15.8:5060 NOT blocked. Only 1 failed attempt(s).
16:23:45
#ls /var/log/asterisk/
cdr-csv  cdr-custom  cel-custom  fail.log  messages
16:24:26
#ls -l /var/log/asterisk/
total 64
drwxr-xr-x 2 root     root      4096 Nov 22 14:45 cdr-csv
drwxr-xr-x 2 root     root      4096 Nov 22 14:45 cdr-custom
drwxr-xr-x 2 root     root      4096 Nov 22 14:45 cel-custom
-rw-r--r-- 1 root     root         0 Nov 22 17:24 fail.log
-rw-rw---- 1 asterisk asterisk 47390 Nov 21 15:41 messages
16:24:29
#vim /usr/local/bin/check-failed-regs.pl
--- /tmp/l3-saved-14288.28092.2741	2013-11-22 17:24:52.000000000 +0200
+++ /usr/local/bin/check-failed-regs.pl	2013-11-22 17:25:07.756479045 +0200
@@ -53,7 +53,7 @@
          print "$ip is screwed up - fix the phone!\n";
       } else {
 # block address with too many failed requests - tweak via $count >= 4
-         if ($count >= 4) {
+         if ($count >= 1) {
             $action = `iptables -I asterisk -s $ip -j DROP`;
             print "$ip blocked. Failed attempts: $count\n";
          } else {
16:25:07
#head /usr/local/bin/check-failed-regs.pl
#!/usr/bin/perl -w
# Crontab Schedule - runs every 2 minutes and writes to log file
#   */2 * * * * perl /root/check-failed-regs2.pl &> /var/log/fail.log 2>&1
#
# IP Tables Configuration - do this first
#  iptables -N asterisk
#  iptables -A INPUT -j asterisk
#  iptables -A FORWARD -j asterisk
#
16:25:09
#iptables -N asterisk

16:26:53
#su - user
l3-agent is already running: pid=15429; pidfile=/home/user/.lilalo/l3-agent.pid
user@linux0:~$ for i in `seq 1 8`; do rsync -a /usr/local/bin/ root@192.168.1
5.$i:/usr/local/bin/; done
user@linux0:~$ exit
logout
16:27:11
#grep 192.168.15.8 /var/log/asterisk/messages
[Nov 19 10:57:20] NOTICE[5058] chan_sip.c: Registration from '<sip:motreal@192.168.15.254>' failed for '192.168.15.8:5060' - Wrong password
[Nov 21 11:10:24] NOTICE[6368] chan_sip.c:    -- Registration for 'quebec@192.168.15.8' timed out, trying again (Attempt #2)
[Nov 21 11:10:44] NOTICE[6368] chan_sip.c:    -- Registration for 'quebec@192.168.15.8' timed out, trying again (Attempt #3)
[Nov 21 11:11:04] NOTICE[6368] chan_sip.c:    -- Registration for 'quebec@192.168.15.8' timed out, trying again (Attempt #4)
[Nov 21 11:11:24] NOTICE[6368] chan_sip.c:    -- Registration for 'quebec@192.168.15.8' timed out, trying again (Attempt #5)
[Nov 21 11:11:44] NOTICE[6368] chan_sip.c:    -- Registration for 'quebec@192.168.15.8' timed out, trying again (Attempt #6)
[Nov 21 11:12:04] NOTICE[6368] chan_sip.c:    -- Registration for 'quebec@192.168.15.8' timed out, trying again (Attempt #7)
[Nov 21 14:34:34] NOTICE[6368] chan_sip.c: Call from 'quebec' (192.168.15.8:5060) to extension '3301' rejected because extension not found in context 'default'.
16:27:44
#cat >> /var/log/asterisk/messages
[Nov 19 10:57:20] NOTICE[5058] chan_sip.c: Registration from '<sip:motreal@192
.168.15.254>' failed for '192.168.15.9:5060' - Wrong password
16:28:56
#grep 192.168.15.9 /var/log/asterisk/messages
.168.15.254>' failed for '192.168.15.9:5060' - Wrong password
16:29:27
#tail -1 /var/log/asterisk/messages
[Nov 19 10:57:20] NOTICE[5058] chan_sip.c: Registration from '<sip:motreal@192.168.15.254>' failed for '192.168.15.9:5060' - Wrong password
16:29:38
#crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
...
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
* * * * * perl /usr/local/bin/check-failed-regs.pl &> /var/log/asterisk/fail.log 2>&1
16:30:21
#ls -l /var/log/asterisk/fail.log
-rw-r--r-- 1 root root 0 Nov 22 17:30 /var/log/asterisk/fail.log
16:30:23
#dae
l3script: dae: command not found
16:30:28
#date
Fri Nov 22 17:30:30 EET 2013
16:30:39
#date
Fri Nov 22 17:30:59 EET 2013
16:30:59
#date
Fri Nov 22 17:31:02 EET 2013
16:31:02
#date
Fri Nov 22 17:31:03 EET 2013
16:31:03
#iptables -L asterisk -n
Chain asterisk (0 references)
target     prot opt source               destination
DROP       all  --  192.168.15.8         0.0.0.0/0
16:31:15
#ls /var/log/
alternatives.log   dpkg.log           mail.info          syslog.1
apt/               exim4/             mail.log           syslog.2.gz
aptitude           faillog            mail.warn          syslog.3.gz
asterisk/          fontconfig.log     messages           syslog.4.gz
auth.log           fsck/              mysql/             user.log
btmp               gdm3/              mysql.err          wtmp
ConsoleKit/        installer/         mysql.log          Xorg.0.log
daemon.log         kern.log           news/              Xorg.1.log
debug              lastlog            pm-powersave.log   Xorg.1.log.old
dmesg              lpr.log            speech-dispatcher/
dmesg.0            mail.err           syslog
16:31:15
#less /var/log/messages
16:32:39
#iptables -A INPUT -j asterisk

16:32:55
#ping 192.168.15.8
PING 192.168.15.8 (192.168.15.8) 56(84) bytes of data.
^C
--- 192.168.15.8 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2016ms
16:33:17
#iptables -D INPUT -j asterisk

16:33:21
#ping 192.168.15.8
PING 192.168.15.8 (192.168.15.8) 56(84) bytes of data.
64 bytes from 192.168.15.8: icmp_req=1 ttl=64 time=0.413 ms
64 bytes from 192.168.15.8: icmp_req=2 ttl=64 time=0.180 ms
^C
--- 192.168.15.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.180/0.296/0.413/0.117 ms
16:35:49
#vim /etc/asterisk/sip.conf
16:37:31
#[3301]
[default]
; CHANNEL(secure_signalling)
; CHANNEL(secure_media)
[menu]
exten => s,1,Answer
exten => s,n,Background(/var/tmp/asterisk/records/record00)
exten => s,n,WaitExten(3)
exten => s,n(main),Background(/var/tmp/asterisk/records/record01)
exten => s,n,WaitExten(3)
exten => s,n,Background(/var/tmp/asterisk/records/record02)
...
-- INSERT --                                                2,1           Top
-- INSERT --                                                2,1           Top
exten => s,n,Hangup
exten => 0,1,Playback(/var/tmp/asterisk/records/record11)
exten => 0,n,Hangup
exten => 1,1,Goto(submenu,s,1)
exten => 2,1,Read(ORDER,/var/tmp/asterisk/records/record05)
exten => 2,n,SayDigits(${ORDER})
exten => 2,n,GotoIf($[ "${DB(order/${ORDER})}" = "" ]?invalid_order)
exten => 2,n,Playback(/var/tmp/asterisk/records/record0${DB(order/${ORDER})})
16:39:11
#vim /etc/asterisk/extensions.ael
прошло 27 минут
17:06:30
#//

17:06:31
#cd

17:06:32
#ls

Файлы

  • /var/log/asterisk/messages
  • /var/log/asterisk/messages
    >
    [Nov 19 10:57:20] NOTICE[5058] chan_sip.c: Registration from '<sip:motreal@192
    .168.15.254>' failed for '192.168.15.9:5060' - Wrong password
    

    Статистика

    Время первой команды журнала15:39:00 2013-11-22
    Время последней команды журнала17:06:32 2013-11-22
    Количество командных строк в журнале57
    Процент команд с ненулевым кодом завершения, % 3.51
    Процент синтаксически неверно набранных команд, % 1.75
    Суммарное время работы с терминалом *, час 1.46
    Количество командных строк в единицу времени, команда/мин 0.65
    Частота использования команд
    ls9|==============| 14.52%
    vim8|============| 12.90%
    iptables4|======| 6.45%
    date4|======| 6.45%
    crontab3|====| 4.84%
    grep3|====| 4.84%
    ssh3|====| 4.84%
    ping2|===| 3.23%
    perl2|===| 3.23%
    tail2|===| 3.23%
    help2|===| 3.23%
    less2|===| 3.23%
    [3301]1|=| 1.61%
    mysql1|=| 1.61%
    s1|=| 1.61%
    >1|=| 1.61%
    cd1|=| 1.61%
    messages1|=| 1.61%
    head1|=| 1.61%
    history1|=| 1.61%
    make1|=| 1.61%
    dae1|=| 1.61%
    ыÑssh1|=| 1.61%
    export1|=| 1.61%
    cat1|=| 1.61%
    apt-get1|=| 1.61%
    //1|=| 1.61%
    mv1|=| 1.61%
    apt-cache1|=| 1.61%
    su1|=| 1.61%
    ____
    *) Интервалы неактивности длительностью 30 минут и более не учитываются

    Справка

    Для того чтобы использовать LiLaLo, не нужно знать ничего особенного: всё происходит само собой. Однако, чтобы ведение и последующее использование журналов было как можно более эффективным, желательно иметь в виду следующее:
    1. В журнал автоматически попадают все команды, данные в любом терминале системы.

    2. Для того чтобы убедиться, что журнал на текущем терминале ведётся, и команды записываются, дайте команду w. В поле WHAT, соответствующем текущему терминалу, должна быть указана программа script.

    3. Команды, при наборе которых были допущены синтаксические ошибки, выводятся перечёркнутым текстом:
      $ l s-l
      bash: l: command not found
      

    4. Если код завершения команды равен нулю, команда была выполнена без ошибок. Команды, код завершения которых отличен от нуля, выделяются цветом.
      $ test 5 -lt 4
      Обратите внимание на то, что код завершения команды может быть отличен от нуля не только в тех случаях, когда команда была выполнена с ошибкой. Многие команды используют код завершения, например, для того чтобы показать результаты проверки

    5. Команды, ход выполнения которых был прерван пользователем, выделяются цветом.
      $ 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
      

    6. Команды, выполненные с привилегиями суперпользователя, выделяются слева красной чертой.
      # id
      uid=0(root) gid=0(root) Gruppen=0(root)
      

    7. Изменения, внесённые в текстовый файл с помощью редактора, запоминаются и показываются в журнале в формате ed. Строки, начинающиеся символом "<", удалены, а строки, начинающиеся символом ">" -- добавлены.
      $ vi ~/.bashrc
      2a3,5
      >    if [ -f /usr/local/etc/bash_completion ]; then
      >         . /usr/local/etc/bash_completion
      >        fi
      

    8. Для того чтобы изменить файл в соответствии с показанными в диффшоте изменениями, можно воспользоваться командой patch. Нужно скопировать изменения, запустить программу patch, указав в качестве её аргумента файл, к которому применяются изменения, и всавить скопированный текст:
      $ patch ~/.bashrc
      В данном случае изменения применяются к файлу ~/.bashrc

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

      Если справочная информация о команде есть, команда выделяется голубым фоном, например: vi. Если справочная информация отсутствует, команда выделяется розовым фоном, например: notepad.exe. Справочная информация может отсутствовать в том случае, если (1) команда введена неверно; (2) если распознавание команды LiLaLo выполнено неверно; (3) если информация о команде неизвестна LiLaLo. Последнее возможно для редких команд.

    10. Большие, в особенности многострочные, всплывающие подсказки лучше всего показываются браузерами KDE Konqueror, Apple Safari и Microsoft Internet Explorer. В браузерах Mozilla и Firefox они отображаются не полностью, а вместо перевода строки выводится специальный символ.

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

    12. Имя терминала, на котором была введена команда, показано в специальном блоке. Этот блок показывается только в том случае, если терминал текущей команды отличается от терминала предыдущей.

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

    14. Небольшие комментарии к командам можно вставлять прямо из командной строки. Комментарий вводится прямо в командную строку, после символов #^ или #v. Символы ^ и v показывают направление выбора команды, к которой относится комментарий: ^ - к предыдущей, v - к следующей. Например, если в командной строке было введено:

      $ whoami
      
      user
      
      $ #^ Интересно, кто я?
      
      в журнале это будет выглядеть так:
      $ whoami
      
      user
      
      Интересно, кто я?

    15. Если комментарий содержит несколько строк, его можно вставить в журнал следующим образом:

      $ whoami
      
      user
      
      $ cat > /dev/null #^ Интересно, кто я?
      
      Программа whoami выводит имя пользователя, под которым 
      мы зарегистрировались в системе.
      -
      Она не может ответить на вопрос о нашем назначении 
      в этом мире.
      
      В журнале это будет выглядеть так:
      $ whoami
      user
      
      Интересно, кто я?
      Программа whoami выводит имя пользователя, под которым
      мы зарегистрировались в системе.

      Она не может ответить на вопрос о нашем назначении
      в этом мире.
      Для разделения нескольких абзацев между собой используйте символ "-", один в строке.

    16. Комментарии, не относящиеся непосредственно ни к какой из команд, добавляются точно таким же способом, только вместо симолов #^ или #v нужно использовать символы #=

    17. Содержимое файла может быть показано в журнале. Для этого его нужно вывести с помощью программы cat. Если вывод команды отметить симоволами #!, содержимое файла будет показано в журнале в специально отведённой для этого секции.
    18. Для того чтобы вставить скриншот интересующего вас окна в журнал, нужно воспользоваться командой l3shot. После того как команда вызвана, нужно с помощью мыши выбрать окно, которое должно быть в журнале.
    19. Команды в журнале расположены в хронологическом порядке. Если две команды давались одна за другой, но на разных терминалах, в журнале они будут рядом, даже если они не имеют друг к другу никакого отношения.
      1
          2
      3   
          4
      
      Группы команд, выполненных на разных терминалах, разделяются специальной линией. Под этой линией в правом углу показано имя терминала, на котором выполнялись команды. Для того чтобы посмотреть команды только одного сенса, нужно щёкнуть по этому названию.

    О программе

    LiLaLo (L3) расшифровывается как Live Lab Log.
    Программа разработана для повышения эффективности обучения Unix/Linux-системам.
    (c) Игорь Чубин, 2004-2008

    $Id$