SMB HOWTO, v1.0, 10 Августа 1996 г.

Это SMB HOWTO. Этот документ описывает как использовать в Linux протокол Session Message Block (SMB), также называемый протокол NetBIOS или протокол LanManager.

[David Wood, перевод: Alex Ott]

51. Введение

Это SMB HOWTO. Этот документ описывает как использовать в Linux протокол Session Message Block (SMB), также называемый протокол NetBIOS или протокол LanManager.

Этот документ сопровождается David Wood ( dwood@plugged.net.au). Добавления, изменения или исправления могут быть посланы ему для включения в следующий выпуск.

Протокол SMB используется Microsoft Windows 3.11, NT и 95 для организации доступа к дискам и принтерам. Используя набор утилит Samba от Andrew Tridgell, UNIX-машины (включая Linux) могут организовывать доступ к дискам и принтерам Windows-машинам.

Четыре вещи, которые можно делать с помощью Samba:

  1. давать доступ к дискам linux Windows-машинам.
  2. организовывать доступ к дискам Windows для машин под linux.
  3. давать доступ к принтерам linux для Windows-машин.
  4. организовывать доступ к принтерам Windows для linux-систем.

Обо всем этом рассказывается в этом документе.

Отказ от ответственности: Процедуры и программы либо работают для автора либо было сообщено, что они работают для людей, которые разработали их. Различные конфигурации могут не работать с информацией данной здесь. Если вы столкнулись с такой ситуацией, вы можете послать сообщение автору документа с пожеланиями для его улучшения, но автор ничего не гарантирует. Что вы ожидали? Автор, кроме всего прочего, консультант...

52. Дополнительная информация

Этот документ делает попытку объяснить как настроить основные файловые и принтерные сервисы SMB на linux-машине. Samba является очень сложным и законченным пакетом. Незачем пытаться дублировать здесь всю документацию на Samba.

Для дополнительной информации смотрите следующие документы:

  • Документация на Samba, доступную как часть дистрибутива Samba Дистрибутив доступен по адресу: ftp://nimbus.anu.edu.au/pub/tridge/samba/
  • The linux Printing HOWTO.
  • The Print2Win Mini-HOWTO.

53. Установка

Последние версии исходных текстов Samba доступны с: ftp://nimbus.anu.edu.au/pub/tridge/samba/

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

Следующие два демона необходимы для пакета Samba. Они обычно устанавливаются в /usr/sbin и запускаются либо при загрузке из системных скриптов либо из inetd. Примеры скриптов даны в разделе Запуск демонов.


        smbd (Демон SMB)

        nmbd (Обеспечивает поддержку сервера имен NetBIOS для клиентов)


Обычно следующие двоичные файлы Samba устанавливаются в директорию /usr/bin, хотя их расположение опционально.


        smbclient       (Клиент SMB для UNIX-машин)

        smbprint        (скрипт для печати на принтер на SMB-машине)

        smbprint.sysv   (такое как выше, но для машин с SVR4 UNIX)

        smbstatus       (Перечисляет текущие SMB-соединения для локальной машины) 

        smbrun          ('glue' скрипт для способствования запуска приложений 

                         на SMB-машине)


Дополнительно с этим документом включен скрипт, названный 'print', который служит как полезная надстройка над скриптом script.

Пакет Samba очень прост в установке. Просто получите исходные тексты по адресу, указанному выше, и прочитайте файл README в дистрибутиве. Также в дистрибутиве есть файл называемый docs/INSTALL.txt, который дает простой набор пошаговых инструкций.

Последующая установка, поместит демоны в /usr/sbin и двоичные файлы в /usr/bin. Установите справочные страницы в /usr/local/man.

При установке пакета Samba, вы должны указать в Makefile расположение файла конфигурации, smb.conf. Обычно это /etc, но вы можете поместить его куда угодно. Для этих указаний, мы будем предполагать, что вы указали расположение файла конфигурации как /etc/smb.conf, расположение файла лога как log file = /var/log/samba-log.%m и блокировочной директории как lock directory = /var/lock/samba.

Установите файл конфигурации smb.conf. Перейдите в директорию, где была скомпилирована Samba. Посмотрите в поддиректории examples/simple и прочитайте файл README. Скопируйте файл smb.conf найденный в этой директории в директорию /etc. БУДЬТЕ ОСТОРОЖНЫ! Если у вас дистрибутив linux с уже установленной Samba, у вас уже может быть файл конфигурации Samba в /etc. Вероятно вы начать с каким-то из них.

Если вы не хотите установить файл конфигурации в директорию /etc, поместите его куда вы хотите, а затем поместите символическую ссылку в /etc:


        ln -s /path/to/smb.conf /etc/smb.conf

54. Запуск демонов

Есть два демона SMB /usr/sbin/smbd и /usr/sbin/nmbd.

Вы можете запустить демоны Samba из inetd или как автономные процессы. Если вы настраиваете постоянный файловый сервер, тогда они должны запускаться из inetd, так что они будут перезапущены если они закончат работу. Если вы хотите использовать средства SMB время от времени или для помощи в системном администрировании, вы можете запустить их в скрипте /etc/rc.d/init.d или даже вручную, когда вам необходимо.

Для запуска демонов из inetd, поместите следующие строки в конфигурационный файл inetd, /etc/inetd.conf:


    # SAMBA NetBIOS services (for PC file and print sharing)

    netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd

    netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd


Затем перезапустите демон inetd запуском команды:


    kill -HUP 1


Для запуска демонов из системных стартовых скриптов, поместите следующий скрипт в файл называемый /etc/rc.d/init.d/smb и создайте на него символические ссылки с именами указанными в комментариях:


    #!/bin/sh



    #

    # /etc/rc.d/init.d/smb - запускает и останавливает сервисы SMB

    #

    # Следующие файлы должны быть символическими ссылками на этот файл:

    # symlinks: 

    #           /etc/rc.d/rc1.d/K35smb  (Убивает сервисы SMB при выключении

    #           /etc/rc.d/rc3.d/S91smb  (Запускает сервисы SMB в многопользовательском режиме)

    #           /etc/rc.d/rc6.d/K35smb  (Убивает сервисы SMB при перезагрузке)

    #



    # Source function library.

    . /etc/rc.d/init.d/functions



    # Source networking configuration.

    . /etc/sysconfig/network



    # Check that networking is up.

    [ ${NETWORKING} = "no" ] && exit 0



    # See how we were called.

    case "$1" in

      start)

        echo -n "Starting SMB services: "

        daemon smbd -D  

        daemon nmbd -D 

        echo

        touch /var/lock/subsys/smb

        ;;

      stop)

        echo -n "Shutting down SMB services: "

        killproc smbd

        killproc nmbd

        rm -f /var/lock/subsys/smb

        echo ""

        ;;

      *)

        echo "Usage: smb {start|stop}"

        exit 1

    esac


55. Основная настройка (/etc/smb.conf)

Настройка Samba в linux (или других UNIX-машинах) контролируется единственным файлом, /etc/smb.conf. Этот файл определяет к каким системным ресурсам вы хотите дать доступ для внешнего мира и какие ограничения вы хотите дать на их использование.

Так как следующие разделы посвящены организации доступа в дискам и принтерам Linux для Windows-машин, то файл smb.conf, показанный в этом разделе является примером, исключительно в целях введения.

Не беспокойтесь сейчас о деталях. Следующие разделы будут вводить основные концепции.

Каждый раздел файла начинается с заголовка раздела, такого как [global], [homes], [printers], и т.п..

Секция [global] определяет некоторые переменные, которые Samba будет использовать для определения доступа ко всем ресурсам.

Раздел [homes] позволяет удаленным пользователям иметь доступ к своим (и только своим) домашним директориям на локальной linux-машине. Так что, если пользователи Windows попытаются подключиться к этому разделу со своих Windows-машин, то они будут подключены к своим персональным домашним директориям. Заметим, что для того чтобы сделать это, они должны быть зарегестрированы на linux-машине.

Простой файл smb.conf ниже позволяет удаленным пользователям иметь доступ к их домашним директориям на локальной машине и писать во временную директорию. Для того чтобы пользователи Windows могли увидеть эти ресурсы машина с linux должна быть в локальной сети. Затем пользователи просто подключают сетевые диски с помощью Windows File Manager или Windows Explorer.

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


; /etc/smb.conf

;

; Убедитесь и перезапустите сервер после внесения изменений в этот

; файл, например:

; /etc/rc.d/init.d/smb stop

; /etc/rc.d/init.d/smb start



[global]

; Раскомментировать это, если вы хотите дать доступ пользователю "гость"

; guest account = nobody

   log file = /var/log/samba-log.%m

   lock directory = /var/lock/samba

   share modes = yes



[homes]

   comment = Home Directories

   browseable = no

   read only = no

   create mode = 0750



[tmp]

   comment = Temporary file space

   path = /tmp

   read only = no

   public = yes


56. Организация доступа к дискам Linux для машин под Windows

Как показано в простом файле smb.conf выше, разделение дисков linux для пользователей Windows является легким. Однако, подобно всему с Samba вы можете контролировать это в большой степени. Здесь есть несколько примеров:

Чтобы организовать доступ для всех, создайте копию раздела [tmp], приведенного выше, добавлением чего-то подобного в smb.conf:


[public]

   comment = Public Stuff

   path = /home/public

   public = yes

   writable = yes

   printable = yes


Чтобы сделать эту директорию доступной для чтения всеми, но разрешить писать в нее только людям из группы staff, измените запись подобно приведенному примеру:


[public]

   comment = Public Stuff

   path = /home/public

   public = yes

   writable = yes

   printable = no

   write list = @staff


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

57. Доступ к дискам Windows для машин под Linux

Программа клиента SMB для UNIX-машин включена в дистрибутив Samba. Она обеспечивает ftp-подобный интерфейс командной строки. Вы можете использовать эту утилиту для переноса файлов между Windows 'сервером' и linux клиентом.

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


    /usr/sbin/smbclient -L host


где 'host' это имя машины, которую вы хотите видеть. Эта команда вернет список имен 'сервисов' - т.е. имен дисков или принтеров к которым может быть доступ. До тех пор пока SMB сервер не настроен без секретности, он будет запрашивать у вас пароль. Дайте ему пароль для пользователя 'гость (guest)' или ваш персональный пароль на этой машине.

Напрмер:


    smbclient -L zimmerman


Вывод этой команды должен выглядеть подобно этому:


Server time is Sat Aug 10 15:58:27 1996

Timezone is UTC+10.0

Password: 

Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]



Server=[ZIMMERMAN] User=[] Workgroup=[WORKGROUP] Domain=[]



        Sharename      Type      Comment

        ---------      ----      -------

        ADMIN$         Disk      Remote Admin

        public         Disk      Public 

        C$             Disk      Default share

        IPC$           IPC       Remote IPC

        OReilly        Printer   OReilly

        print$         Disk      Printer Drivers





This machine has a browse list:



        Server               Comment

        ---------            -------

        HOPPER               Samba 1.9.15p8

        KERNIGAN             Samba 1.9.15p8

        LOVELACE             Samba 1.9.15p8

        RITCHIE              Samba 1.9.15p8

        ZIMMERMAN            


Browse list показывает другие SMB сервера в сети с доступными ресурсами.

Для использования клиента, выполните:


    /usr/sbin/smbclient service <password>


где 'service' -- имя машины и сервиса. Например, если вы пытаетесь обратиться к директории, которая доступна под именем 'public' на машине названной 'zimmerman', то имя сервиса должно звучать как \\zimmerman\public. Однако вследствии ограничений оболочки, вам необходимо спрятать обратный слэш, так что в конце это будет выглядеть подобно этому:


    /usr/sbin/smbclient \\\\zimmerman\\public mypasswd


где 'mypasswd' -- символьная строка вашего пароля.

Вы получите приглашение smbclient:


Server time is Sat Aug 10 15:58:44 1996

Timezone is UTC+10.0

Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]

smb: \> 


Напечатайте 'h' чтобы получить помощь об использовании smbclient:


smb: \> h

ls             dir            lcd            cd             pwd            

get            mget           put            mput           rename         

more           mask           del            rm             mkdir          

md             rmdir          rd             prompt         recurse        

translate      lowercase      print          printmode      queue          

cancel         stat           quit           q              exit           

newer          archive        tar            blocksize      tarmode        

setmode        help           ?              !              

smb: \> 


Если вы можете использовать ftp, вам не будут нужны справочные страницы о smbclient.

58. Доступ к принтеру Linux для Windows-машин

Для разделения принтера linux с Windows машинами, вам необходимо убедиться, что принтер работает под Linux. Если вы можете печатать под Linux, установка доступа к нему очень проста.

Смотрите Printing HOWTO для информации о настройке печать.

Поскольку автор использует принтер, подключенный к машине с Windows NT, этот раздел не должен рассматриваться как окончательный, а только как рекомендация. Кто угодно посылайте мне информацию об организации доступа на адрес: dwood@plugged.net.au, так что этот раздел может быть дополнен.

Добавте настройку принтера в ваш файл smb.conf:


[global]

   printing = bsd

   printcap name = /etc/printcap

   load printers = yes

   log file = /var/log/samba-log.%m

   lock directory = /var/lock/samba



[printers]

   comment = All Printers

   security = server

   path = /var/spool/lpd/lp

   browseable = no

   printable = yes

   public = yes

   writable = no

   create mode = 0700



[ljet]

   security = server

   path = /var/spool/lpd/lp

   printer name = lp

   writable = yes

   public = yes

   printable = yes

   print command = lpr -r -h -P %p %s


Убедитесь, что путь к принтеру (в этом случае для [ljet]) соответствует директории спула в /etc/printcap!

ЗАМЕТКА: Существуют некоторые проблемы с доступом к доступным принтерам на UNIX-машинах для машин с Windows NT используя Samba. Одна проблема в том, что NT неправильно видит доступный принтер. Для исправления этого, смотрите заметку в поставке Samba в файле docs/WinNT.txt. Другая проблема связана с проблемой пароля. Смотрите комментарий в том же самом файле.

59. Доступ к принтеру Windows с машин под Linux

Для доступа к принтеру на Windows машине, вы должны сделать следующее:

a) ВЫ должны иметь правильные записи в файле /etc/printcap и они должны соответствовать локальной структуре директорий (для директории спула, и т.п.)

b) У вас должен быть скрипт /usr/bin/smbprint. Он идет вместе с исходными текстами Samba, но не со всеми двоичными дистрибутивами Samba. Его немного модифицированная копия обсуждается ниже.

c) Если вы хотите преобразовывать ASCII файлы в Postscript, вы должны иметь nenscript, или его эквивалент. nenscript -- это конвертор Postscript, он обычно устанавливается в директорию /usr/bin.

d) Вы можете хотеть сделать печать через Samba более легкой с помощью программы-надстройки. Простой скрипт на perl, который обрабатывает ASCII, Postscript или преобразованный Postscript дан ниже.

Запись в /etc/printcap ниже приведена для принтера HP 5MP на сервере Windows NT. Записи следующие:


        cm - комментарий

        lp - имя устройства, открываемого для вывода

        sd - директория спула принтера (на локальной машине)

        af - файл учета пользования принтером

        mx - максимальный размер файла (ноль -- без ограничений)

        if - имя входного фильтра (скрипта)


Для более детальной информации смотрите Printing HOWTO или справочные страницы по printcap.


# /etc/printcap

#

# //zimmerman/oreilly via smbprint

#

lp:\

        :cm=HP 5MP Postscript OReilly on zimmerman:\

        :lp=/dev/lp1:\

        :sd=/var/spool/lpd/lp:\

        :af=/var/spool/lpd/lp/acct:\

        :mx#0:\

        :if=/usr/bin/smbprint:


Убедитесь, что директории спула и учета пользования существуют и имеют право на запись. Убедитесь, что строка 'if' содержит правильный путь к скрипту smbprint (дан ниже) и будьте уверены, что указывается на правильное устройство (специальный файл /dev).

Далее идет сам скрипт smbprint. Он обычно находится в директории /usr/bin и относящийся к Andrew Tridgell, человеку кто создал Samba, насколько я знаю. Этот скрипт идет с дистрибутивом исходного кода Samba, но отсутствует в некоторых бинарных дистрибутивах, так что я воссоздал его здесь.

Вы можете захотеть взглянуть на него внимательно. Есть некоторые мелкие изменения, которые показали себя полезными.


#!/bin/sh -x



# Этот скрипт является входным фильтром для основанной на printcap

# печати на unix-машинах. Он использует программу smbclient для

# печати файла на указанный smb-сервер и сервис.

# Например вы можете иметь запись в printcap подобную этой

#

# smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint

#

# которая создает unix-принтер названный "smb", который будет

# печатать с помощью этого скрипта. Вам необходимо создать директорию

# спула /usr/spool/smb с соответствующими правами и владельцем



# Установите здесь сервер и сервис на который вы хотите печатать. В

# этом примере я имею PC с WfWg PC, названную "lapland", которая

# имеет экспортируемый принтер, называемый "printer" без пароля



#

# Далее скрипт был изменен hamiltom@ecnz.co.nz (Michael Hamilton)

# так что сервер, сервис и пароль могут быть считаны из файла

# /usr/var/spool/lpd/PRINTNAME/.config 

#

# Для того чтобы это работало запись в /etc/printcap должна

# включать файл учета использования (af=...):

#

#   cdcolour:\

#       :cm=CD IBM Colorjet on 6th:\

#       :sd=/var/spool/lpd/cdcolour:\

#       :af=/var/spool/lpd/cdcolour/acct:\

#       :if=/usr/local/etc/smbprint:\

#       :mx=0:\

#       :lp=/dev/null:

#

# Файл /usr/var/spool/lpd/PRINTNAME/.config должен содержать

#   server=PC_SERVER

#   service=PR_SHARENAME

#   password="password"

#

# Например,

#   server=PAULS_PC

#   service=CJET_371

#   password=""



#

# Debugging log file, change to /dev/null if you like.

#

logfile=/tmp/smb-print.log

# logfile=/dev/null





#

# The last parameter to the filter is the accounting file name.

#

spool_dir=/var/spool/lpd/lp

config_file=$spool_dir/.config



# Should read the following variables set in the config file:

#   server

#   service

#   password

#   user

eval `cat $config_file`



#

# Some debugging help, change the >> to > if you want to same space.

#

echo "server $server, service $service" >> $logfile



(

# NOTE You may wish to add the line `echo translate' if you want automatic

# CR/LF translation when printing.

        echo translate

        echo "print -"

        cat

) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P >> $logfile


Большинство дистрибутивов linux идет с программой nenscript для преобразования ASCII документов в Postscript. Следующий скрипт на perl делает жизнь легче, обеспечивая простой интерфейс для печати в liinux через smbprint.


Использование: print [-a|c|p] <filename>

       -a печатает <filename> как ASCII

       -c печатает <filename> отформатированный как исходный код

       -p печатает <filename> как Postscript

        Если опции не заданы, программа попробует определить

        тип файла и печатать соответственно


Используя smbprint для печати ASCII файлов, скрипт следит за длинными строками. Если возможно этот скрипт разрывает длинную строку на пробеле (вместо разрыва в середине слова).

Форматирование исходного кода выполняется с помощью nenscript. Он берет ASCII-файл и форматирует его в 2 колонки с с заголовком (дата, имя файла и т.п.). Он также нумерует строки. Используя этот скрипт как пример другие типы форматирования могут быть сделаны.

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


#!/usr/bin/perl



# Скрипт:   print

# Авторы:   Brad Marshall, David Wood

#           Plugged In Communications

# Дата:   960808

#

# Используется для печати на сервис oreilly, который расположен на

# сервере zimmerman

# Назначение: Берет файлы разных типов как аргумент и обрабатывает

# их соответственно для передачи на скрипт печать Samba.

#

# В настоящее время поддерживаются типы файлов:

# 

# ASCII      - Если длина строки длинее чем $line_length символов, то 

#              переносит строку на пробеле

# Postscript - Берет без обработки

# Code        - Форматирует в Postscript (используя nenscript), чтобы 

#               отображать правильно (альбомный формат, фонт и т.п.)

#



# Установить максимальную длину строки ASCII текста

$line_length = 76;



# Установить путь к скрипту печати Samba

$print_prog = "/usr/bin/smbprint";



# Установить путь и имя nenscript (конвертера ASCII-->Postscript)

$nenscript = "/usr/bin/nenscript";



unless ( -f $print_prog ) {

        die "Can't find $print_prog!";

}

unless ( -f $nenscript ) {

        die "Can't find $nenscript!";

}



&ParseCmdLine(@ARGV);



# DBG

print "filetype is $filetype\n";



if ($filetype eq "ASCII") {

        &wrap($line_length);

} elsif ($filetype eq "code") {

        &codeformat;

} elsif ($filetype eq "ps") {

        &createarray;

} else {

        print "Sorry..no known file type.\n";

        exit 0;

}

# Pipe the array to smbprint

open(PRINTER, "|$print_prog") || die "Can't open $print_prog: $!\n";

foreach $line (@newlines) {

        print PRINTER $line;

}

# Send an extra linefeed in case a file has an incomplete last line.

print PRINTER "\n";

close(PRINTER);

print "Completed\n";

exit 0;



# --------------------------------------------------- #

#        Everything below here is a subroutine        #

# --------------------------------------------------- #



sub ParseCmdLine {

        # Parses the command line, finding out what file type the file is



        # Gets $arg and $file to be the arguments (if the exists)

        # and the filename

        if ($#_ < 0) {

                &usage;

        }

        # DBG

#       foreach $element (@_) {

#               print "*$element* \n";

#       }



        $arg = shift(@_);

        if ($arg =~ /\-./) {

                $cmd = $arg;

        # DBG

#       print "\$cmd found.\n";



                $file = shift(@_);

        } else {

                $file = $arg;

        }

        

        # Defining the file type

        unless ($cmd) {

                # We have no arguments



                if ($file =~ /\.ps$/) {

                        $filetype = "ps";

                } elsif ($file =~ /\.java$|\.c$|\.h$|\.pl$|\.sh$|\.csh$|\.m4$|\.inc$|\.html$|\.htm$/) {

                        $filetype = "code";

                } else {

                        $filetype = "ASCII";

                }



                # Process $file for what type is it and return $filetype 

        } else {

                # We have what type it is in $arg

                if ($cmd =~ /^-p$/) {

                        $filetype = "ps";

                } elsif ($cmd =~ /^-c$/) {

                        $filetype = "code";

                } elsif ($cmd =~ /^-a$/) {

                        $filetype = "ASCII"

                }

        }

}



sub usage {

        print "

Использование: print [-a|c|p] <filename>

       -a печатает <filename> как ASCII

       -c печатает <filename> отформатированный как исходный код

       -p печатает <filename> как Postscript

        Если опции не заданы, программа попробует определить

        тип файла и печатать соответственно\n

";

        exit(0);

}



sub wrap {

        # Create an array of file lines, where each line is < the 

        # number of characters specified, and wrapped only on whitespace



        # Get the number of characters to limit the line to.

        $limit = pop(@_);



        # DBG

        #print "Entering subroutine wrap\n";

        #print "The line length limit is $limit\n";



        # Read in the file, parse and put into an array.

        open(FILE, "<$file") || die "Can't open $file: $!\n";

        while(<FILE>) {

                $line = $_;

                

                # DBG

                #print "The line is:\n$line\n";



                # Wrap the line if it is over the limit.

                while ( length($line) > $limit ) {

                        

                        # DBG

                        #print "Wrapping...";



                        # Get the first $limit +1 characters.

                        $part = substr($line,0,$limit +1);



                        # DBG

                        #print "The partial line is:\n$part\n";



                        # Check to see if the last character is a space.

                        $last_char = substr($part,-1, 1);

                        if ( " " eq $last_char ) {

                            # If it is, print the rest.



                            # DBG

                            #print "The last character was a space\n";



                            substr($line,0,$limit + 1) = "";

                            substr($part,-1,1) = "";

                            push(@newlines,"$part\n");

                        } else {

                             # If it is not, find the last space in the 

                             # sub-line and print up to there.



                            # DBG

                            #print "The last character was not a space\n";



                             # Remove the character past $limit

                             substr($part,-1,1) = "";

                             # Reverse the line to make it easy to find

                             # the last space.

                             $revpart = reverse($part);

                             $index = index($revpart," ");

                             if ( $index > 0 ) {

                               substr($line,0,$limit-$index) = "";

                               push(@newlines,substr($part,0,$limit-$index) 

                                   . "\n");

                             } else {

                               # There was no space in the line, so

                               # print it up to $limit.

                               substr($line,0,$limit) = "";

                               push(@newlines,substr($part,0,$limit) 

                                   . "\n");

                             }

                        }

                }

                push(@newlines,$line);

        }

        close(FILE);

}



sub codeformat {

        # Call subroutine wrap then filter through nenscript

        &wrap($line_length);

        

        # Pipe the results through nenscript to create a Postscript

        # file that adheres to some decent format for printing

        # source code (landscape, Courier font, line numbers).

        # Print this to a temporary file first.

        $tmpfile = "/tmp/nenscript$$";

        open(FILE, "|$nenscript -2G -i$file -N -p$tmpfile -r") || 

                die "Can't open nenscript: $!\n";

        foreach $line (@newlines) {

                print FILE $line;

        }

        close(FILE);

        

        # Read the temporary file back into an array so it can be

        # passed to the Samba print script.

        @newlines = ("");

        open(FILE, "<$tmpfile") || die "Can't open $file: $!\n";

        while(<FILE>) {

                push(@newlines,$_);

        }

        close(FILE);

        system("rm $tmpfile");

}



sub createarray {

        # Create the array for postscript

        open(FILE, "<$file") || die "Can't open $file: $!\n";

        while(<FILE>) {

                push(@newlines,$_);

        }

        close(FILE);

}


60. Авторские права

Авторскими правами на этот документ владеет David Wood, 1996. Он может воспроизводится в любой форме и свободно распространятся, при сохранении файла неизменным, включая это заявление.

61. Благодарности

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

[ опубликовано 09/02/2003 ]

David Wood, перевод: Alex Ott - SMB HOWTO, v1.0, 10 Августа 1996 г.   Версия для печати