SMB HOWTO David Wood, dwood@plugged.net.au, перевод Alex Ott ott@phtd.tpu.edu.ru v1.1, 25 марта 1999 Это SMB HOWTO. Этот документ описывает использование в Linux протокола Server Message Block (SMB), который иногда также называется протоколом Session Message Block (SMB), протоколом NetBIOS или протоколом LanMan╜ ager. ______________________________________________________________________ Table of Contents 1. Введение 2. Дополнительная информация 3. Установка 4. Запуск демонов 5. Основная настройка (/etc/smb.conf) 6. Организация доступа к дискам Linux для машин под Windows 7. Доступ к дискам Windows из Linux 8. Доступ к принтеру Linux для Windows-машин 9. Доступ к принтеру Windows с машин работающих под Linux 10. Backing Up Windows Machines to a Linux Host 11. Авторские права 12. Благодарности ______________________________________________________________________ ППррииммееччааннииее ппееррееввооддччииккаа:: Шлите мне любые комментарии и замечания, даже небольшие. 11.. ВВввееддееннииее Это SMB HOWTO. Этот документ описывает использование в Linux протокола Server Message Block (SMB), который иногда также называется протоколом Session Message Block (SMB), протоколом NetBIOS или протоколом LanManager. Хотя этот документ и предназначен для Linux, но Samba может работать на большинстве Unix-подобных операционных систем. Этот документ сопровождается David Wood (dwood@plugged.net.au). Добавления, изменения или исправления могут быть посланы ему для включения в следующий выпуск. Большое количество документации по Samba доступно на WWW-сервере Samba, который находится по адресу http://www.samba.org/ . Вы также можете использовать группу новостей comp.protocols.smb. Протокол SMB используется Microsoft Windows 3.11, NT и 95/98 для организации доступа к дискам и принтерам. Используя набор утилит Samba от Andrew Tridgell (Andrew.Tridgell@anu.edu.au), UNIX-машины (включая Linux) могут организовывать доступ к дискам и принтерам для Windows-машин. Утилиты smbfs написанные Paal-Kr. Engstad (pke@engstad.ingok.hitos.no) и Volker Lendecke (lendecke@namu01.gwdg.de) дают возможность машинам с Unix монтировать SMB-ресурсы доступные на машинах с Windows или Samba. Четыре вещи, которые можно делать с помощью Samba: 1. давать доступ к дискам Linux Windows-машинам. 2. получать доступ к дискам Windows для машин под Linux. 3. давать доступ к принтерам Linux для Windows-машин. 4. получать доступ к принтерам Windows из Linux-систем. Обо всем этом рассказывается в этом документе. Отказ от ответственности: Процедуры и программы либо работают для автора, либо было сообщено, что они работают для людей, которые разработали их. Различные конфигурации могут не работать с информацией данной здесь. Если вы столкнулись с такой ситуацией, вы можете послать сообщение автору документа с пожеланиями для его улучшения, но автор ничего не гарантирует. Что вы ожидали? Автор, кроме всего прочего, консультант... Заметим, что для доступа к SMB-ресурсам с машин с Windows 3.x, на них должен быть установлен стэк TCP/IP и библиотеки Win32s. Оба этих компонента доступны с сервера фирмы Microsoft (http://www.microsoft.com ). 22.. ДДооппооллннииттееллььннааяя ииннффооррммаацциияя Этот документ делает попытку объяснить как настроить основные файловые и принтерные SMB-сервисы на Linux-машине. Samba является очень сложным и законченным пакетом. Незачем пытаться дублировать здесь всю документацию на Samba. Для дополнительной информации смотрите следующие документы: ╥ Документация на Samba, доступная как часть дистрибутива Samba. Дистрибутив доступен по адресу: ftp://ftp.samba.org/ ╥ The Linux Printing HOWTO. ╥ The Print2Win Mini-HOWTO. ╥ Стандарт протокола для сервиса NetBIOS при использовании транспорта TCP/UDP. RRFFCC 11000011 Концепции и методы. RRFFCC 11000022 Подробные спецификации 33.. УУссттааннооввккаа Сначала, для того чтобы использовать Samba ваша машина должна находится в одиночном ethernet-сегменте локальной сети, используя протокол TCP/IP. Samba не будет работать используя другие сетевые протоколы. Это в общем легко, поскольку Linux и Windows 95/98/NT поставляются с поддержкой TCP/IP. Однако если вы используете машины с Windows 3.X, то вам необходимо добавит поддержку TCP/IP. Сервисы SMB не могут быть использованы за пределами маршрутизаторов. Если вы хотите сделать что-то подобное, то вам необходимо настроить туннель IP, что не является предметом рассмотрения этого документа. Для того, чтобы получить исходные тексты последней версии Samba, свяжите с указанным URL и выберите ближайший к вам сервер-зеркало: ftp://ftp.samba.org/ . Однако, если у вас установлен дистрибутив RedHat Linux, у вас имеется возможность установить ее как пакет RedHat. Некоторые другие дистрибутивы также включают исполняемые файлы Samba. Следующие два демона необходимы для работы пакета Samba. Они обычно устанавливаются в /usr/sbin и запускаются либо при загрузке из системных скриптов, либо из inetd. Примеры скриптов даны в разделе ``Запуск демонов''. ______________________________________________________________________ smbd (Демон SMB) nmbd (Обеспечивает поддержку сервера имен NetBIOS для клиентов) ______________________________________________________________________ Заметим, что сервис имен, предоставляемый демоном nmbd является отличным от сервиса имен, предоставляемого Domain Name Service (DNS). Сервис имен NetBIOS является сервисом имен в стиле Windows, используемым для SMB. Другими словами, имеющийся сервис имен DNS ничего не скажет о возможности Samba для нахождения имен машин. Обычно следующие двоичные файлы Samba устанавливаются в директорию /usr/bin, хотя их расположение опционально. ______________________________________________________________________ smbclient (Клиент SMB для UNIX-машин) smbprint (скрипт для печати на принтер на SMB-машине) smbprint.sysv (такое как выше, но для машин с SVR4 UNIX) smbstatus (Перечисляет текущие SMB-соединения для локальной машины) smbrun ('glue' скрипт для запуска приложений на SMB-машине) ______________________________________________________________________ Двоичные файлы относящиеся к поддержке файловой системы smbfs обсуждаются далее в этом документе. Дополнительно с этим документом включен скрипт, названный 'print', который служит как полезная надстройка над скриптом smbprint. Пакет 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 ______________________________________________________________________ 44.. ЗЗааппуусскк ддееммоонноовв Есть два демона SMB /usr/sbin/smbd и /usr/sbin/nmbd. Вы можете запустить демоны Samba из inetd или как автономные процессы. Samba будет отвечать чуть быстрее когда она запущена как автономный процесс, чем в случае когда она запускается из inetd. В некоторых случаях вы должны проверить наличие в файле /etc/services примерно таких строк: ______________________________________________________________________ netbios-ns 137/tcp nbns netbios-ns 137/udp nbns netbios-dgm 138/tcp nbdgm netbios-dgm 138/udp nbdgm netbios-ssn 139/tcp nbssn ______________________________________________________________________ Убедитесь, что все они не закоментированы. В зависимости от вашего дистрибутива, вам может даже нужно будет добавить их в этот файл. Samba не сможет привязаться к соответствующим портам пока этих строк не будет в файле /etc/services. Для запуска демонов из 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 `cat /var/run/inetd.pid` ______________________________________________________________________ Для запуска демонов из системных стартовых скриптов, поместите следующий скрипт в файл /etc/rc.d/init.d/smb (для дистрибутива RedHat) и создайте на него символические ссылки с именами указанными в комментариях: ______________________________________________________________________ #!/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 ______________________________________________________________________ Если при старте Samba вы получаете сообщение в котором говорится, что демон не может подключится к порту 139, то вероятно у вас уже есть запущенные процессы Samba, которые не были завершены. Посмотрите список процессов (используя команду 'ps auxww | grep mbd') для того, чтобы определить есть ли еще запущенные сервисы Samba. 55.. ООссннооввннааяя ннаассттррооййккаа ((//eettcc//ssmmbb..ccoonnff)) Настройка 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 ______________________________________________________________________ Написав новый файл smb.conf, полезно проверить его правильность. Вы можете проверить правильность написания файла smb.conf, используя утилиту отсутствии проблем, то smbd правильно загрузит файл настроек. Полезный трюк: Если ваш сервер Samba имеет больше одного ethernet интерфейса, то smbd может подключится к неправильному. Если это так, что вы можете явно заставит ее подключаться к нужному добавив строку в раздел [global] файла /etc/smb.conf: ______________________________________________________________________ interfaces = 192.168.1.1/24 ______________________________________________________________________ Также существует GUI-утилита для настройки Samba: GtkSamba. Смотрите страницу по адресу http://www.open-systems.com/gtksamba.html . 66.. ООррггааннииззаацциияя ддооссттууппаа кк ддииссккаамм LLiinnuuxx ддлляя ммаашшиинн ппоодд WWiinnddoowwss Как показано выше в файле smb.conf, организация доступа к дискам Linux для пользователей Windows является довольно простым делом. Однако, с помощью Samba вы можете контролировать это в большой степени. Здесь мы приведем несколько примеров: Чтобы организовать доступ для всех, создайте копию раздела [tmp], приведенного выше, добавив что-то подобное в smb.conf: ______________________________________________________________________ [public] comment = Public Stuff path = /home/public public = yes writable = yes printable = no ______________________________________________________________________ Вы сейчас будете иметь возможность запустить Samba и просмотреть доступные ресурсы с Windows PC. Однако, недавно Microsoft сделала жизнь немного более трудной для тех, кто использует Samba. Windows 98, Windows NT (service pack 3 или выше) и поздние версии Windows 95 теперь по умолчанию используют шифрованные пароли. А Samba по умолчанию использует нешифрованные пароли. Вы не сможете просматривать содержимое серверов когда либо клиент либо сервер используют шифрованные пароли, потому что соединение не может быть сделано без регистрации. Если у вас есть несоответствие типов паролей между клиентом и сервером и когда вы пытаетесь подключится к ресурсу, то вы можете увидеть окно диалога в котором будет сказано примерно следующее: "You are not authorized to access that account from this machine". Вы можете либо настроить Samba-сервер для использования шифрованных паролей, либо настроить машины с Windows, чтобы они использовали нешифрованные пароли. Для того, чтобы заставить Windows работать с нешифрованными паролями SMB: Windows 95/98 ============= Используя редактор registry (regedit), создайте ключ registry HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP Добавьте значение типа DWORD: Имя значения: EnablePlainTextPassword Данные: 0x01. Windows NT ========== Используя редактор registry (regedit), создайте ключ registry HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rdr\Parameters Добавьте значение типа DWORD: Имя значения: EnablePlainTextPassword Значение: 0x01 После того, как вы сделали эти изменения, перезагрузите машину с Windows и попытайтесь подключить сетевой диск к серверу Samba. Это должно работать, поскольку сервер Samba использует пароли в нешифрованном виде. Для того, чтобы настроить Samba для использования шифрованных паролей: В раздел [global] файла /etc/smb.conf, добавьте следующие строки: ______________________________________________________________________ encrypt passwords = yes smb passwd file = /etc/smbpasswd ______________________________________________________________________ Мы вам настоятельно рекомендуем прочитать файлы ENCRYPTION.txt, Win95.txt и WinNT.txt в документации по Samba до того как вы будете делать это! Если ваши и клиенты и сервер используют шифрованные пароли, то вы не сможете просмотреть списки доступных ресурсов до тех пор пока начальное соединение не будет сделано с правильными параметрами входа. Для того чтобы сделать первоначальное соединение, введите вручную имя ресурса в диалоговом окне Windows File Manager или Explorer, имя должно быть в форме правильными для данного сервера именем и паролем. Если вы подозреваете, что ваш сервис имен NetBIOS неправильно настроен (возможно потому, что вы получаете сообщение об ошибке 'host not found (машина не найдена)' при попытке подключения), то попытайтесь использовать IP-адрес сервера: '\\\'. Для того, чтобы имена отображались правильно, вы может понадобиться установить некоторые настройки в соответствующем разделе ресурса. Это работает с клиентами под управлением 95/98/NT, но может быть необходимо будет изменить эти настройки, если вы используете клиентов с Windows 3.X: ______________________________________________________________________ ; Mangle case = yes seems to give the correct filenames ; for Win95/98/NT. mangle case = yes ; If samba is case sensitive when looking for files case sensitive = no ; Default case of files that are created default case = lower ; Preserve case for all filenames preserve case = yes ; Preserve case for dos (8.3) filenames short preserve case = no ______________________________________________________________________ Замечание: Значение после знака / это ссылка на сетевую маску. Для сети класса С этим значением будет "24". Для дополнительной информации о том как выполнять вычисления для подсетей, вы можете посмотреть информацию по адресу http://www.ziplink.net/~ralphb/IPSubnet/index.html . Конечно настройка Samba более полна, чем мы привели здесь, но это даст вам возможность начать работать. Если вы хотите сделать что-то более сложное, то я рекомендую вам сходить на сервер Samba, упомянутый выше. Чтобы сделать эту директорию доступной для чтения всеми, но разрешить писать в нее только людям из группы staff, измените запись как показано в следующем примеру: ______________________________________________________________________ [public] comment = Public Stuff path = /home/public public = yes writable = yes printable = no write list = @staff ______________________________________________________________________ Для описания других приемов для изменения доступа к дискам, смотрите документацию на Samba и справочные страницы. 77.. ДДооссттуупп кк ддииссккаамм WWiinnddoowwss иизз LLiinnuuxx Программа клиента 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 ______________________________________________________________________ где '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. Хотя вы можете использовать smbclient для тестирования, вы скоро устанете использовать его в работе. Для работы вам скорее всего понадобится пакет smbfs. Smbfs поставляется с двумя простыми утилитами, smbmount и smbumount. Они работают подобно mount и umount для SMB-ресурсов. Пакет smbfs теперь включен в большинство дистрибутивов Linux. Вам необходимо помнить одну важную вещь: Для того чтобы использовать эти утилиты вам необходима поддержка smbfs в ядре. 88.. ДДооссттуупп кк ппррииннттеерруу LLiinnuuxx ддлляя WWiinnddoowwss--ммаашшиинн Для организации доступа к Linux-принтеру с Windows машин, вам необходимо убедиться, что принтер работает под Linux. Если вы можете печатать под Linux, то организация доступа к принтеру будет очень проста. Смотрите Printing HOWTO для дополнительной информации о настройке печати. Поскольку автор использует принтер, подключенный к машине с Windows NT(это было давно - до перевода почти всей сети полностью на Linux), этот раздел не должен рассматриваться как законченный, а только как рекомендация. У кого есть информация об организации такого доступа, посылайте ее мне на адрес: 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! Строки: ______________________________________________________________________ printcap name = /etc/printcap load printers = yes ______________________________________________________________________ контролируют должны ли все принтера, перечисленные в /etc/printcap по умолчанию быть загружены. Если вы сделаете это, то нет причины для настройки каждого принтера в отдельности. Раздел [printers] указывает настройки для принтеров, которые вы хотите определить явно. Если используемая вами подсистема печати не работает этим образом (BSD), то вам необходимо настроить фальшивый файл printcap (или используйте 'print command', смотрите ниже). Для дополнительной информации о системе printcap смотрите Printing-HOWTO. Полезным приемом для проверки сетевых соединений является изменение команды печати на: ______________________________________________________________________ print command = cp %S /tmp/print.%P.%S ______________________________________________________________________ Итоговый файл может быть проанализирован. ЗЗААММЕЕЧЧААННИИЕЕ: Существуют некоторые проблемы с доступом к принтерам на UNIX-машинах для машин с Windows NT используя Samba. Одна из проблем в том, что NT неправильно видит сетевой принтер. Для решения этой проблемы, смотрите замечание в файле docs/WinNT.txt дистрибутива Samba. Другая проблема связана с проблемой пароля. Смотрите комментарий в том же самом файле. Oleg L. Machulskiy (machulsk@shade.msu.ru) предложил более удобную для использования команду печати, чем в вышеприведенном примере: ______________________________________________________________________ print command = smb2ps %s | lpr -r -h -P %p ______________________________________________________________________ где 'smb2ps' является скриптом, который преобразует буферный файл, переданный из под Windows в обычно используемый файл Postscript. Он должен удалять первые три и последние две строки, потому что эти строки содержат некоторые коды PJL или PCL. Такой подход нужен только если ваша машина с Windows печатает PCL, а не настоящий Postscript. Я обнаружил, что Windows 95/98/NT не имеют общего драйвера Postscript, но драйвер принтера "Digital turbo Printserver 20" может работать как хороший драйвер Postscript для большинства случаев. Я также слышал, что для этих же целей может работать драйвер "Apple LaserWriter II NTX". Jeff Stern (jstern@eclectic.ss.uci.edu) написал следующее, что может помочь некоторым из вас: --------------------------%<---------------------------------- У меня была проблема, которая заключалась в том, что я мог печатать, используя lpd/lpr на мой принтер, подключенный к Linux, с самой машины под Linux. Но я не мог печатать на этот принтер с удаленной машины под Win95. Когда я попробовал запустить smbclient \\eclectic\belen -P и затем попытался выполнить print myfile я получил сообщение о том, что доступ запрещен. Я установил права доступа на директорию /var/spool/lpd/lp1 равными 777. Я конечно извиняюсь, но я это сделал. Я также предполагаю, в качестве альтернативы, что я мог бы поместить всех, кто зарегестрирован на машине с Linux в группу 'lp', или задать владельцем директории группу 'users', и т.п... Но сейчас это работает (с владельцем root:lp). В конце, другая вещь которую должен знать администратор это имя пользователя на машине с Windows (который пытается использовать принтер Linux через Samba), которое должно быть также названо и на машине с Linux. Таким образом, если пользователь 'joe' на машине с Windows, названной 'mywinbox' попытается напечатать на принтер 'belen' на машине с Linux 'eclectic' (\\eclectic\belen) то также должен быть пользователь 'joe' на машине с Linux. Затем, пароль 'joe' должен быть паролем для доступа к принтеру 'belen' на машине 'eclectic'. Это пароль будет запрошен при установке принтера на машине с Windows, используя мастер добавления принтера. Я думаю, что это не должно быть случайным, поскольку я установил мой принтер как 'public' в smb.conf. Но несомненно он все равно спршивает пароль. (Машины под Windows к сожалению не дают вам возможность указать другое имя для удаленного принтера (под Linux). Windows просто использует имя локального пользователя, которые вы ввели, когда запустили Win95. --------------------------%<---------------------------------- Dr. Michael Langner (langner@fiz-chemie.de указал, что проблема прав доступа на запись на дерево директорий /var/spool/lpd/ может быть избегнута, использованием чего-то подобного "path=/tmp" и "print command = lpr -r -P%p %s". Иногда возникает ошибка разбора Postscript при печати Postscript с машины под Windows, что вызывает печать лишних страниц в конце каждого задания. Последняя страница всегда будет содержать сообщение "%%[ Lastpage ]%%" в заголовке. Это кажется случается только на машинах с Windows 95 и 98 и это происходит из-за того, что Postscript является плохосформированным. Одним из способов обработки этой ошибки --- использовать скрипт для удаления куска плохого Postscript из задания печати. Другим способом является нахождение лучшего драйвера Postscript для Windows. Вероятно лучший способ для нас это использовать LPRng вместо Postscript для печати на сервер Samba. Erik Ratcliffe (erik@caldera.com), Caldera, сообщил, что использование LPRng означает, что любой драйвер принтера может быть использован с машин под Windows. На сервере Samba, они используют запись в /etc/printcap, которая выглядит примерно так: ______________________________________________________________________ raw:\ :rw:sh: :lp=/dev/lp1 :sd=/var/spool/lpd/raw :fx=flp ______________________________________________________________________ LPRng не требует :\ в конце каждой строки. Запись о принтере все равно необходимо сделать в файле /etc/smb.conf для физического принтера. Строка команды печати нужна для использования записи "raw" из файла /etc/printcap и данные должны посылаться в двоичной форме. Попробуйте вот такую командную строку: ______________________________________________________________________ print command = lpr -b -Praw %s ______________________________________________________________________ Вам также может понадобиться установить буферизацию печати на Windows95 для печати прямо на принтер, вместо использования буферизации на сервере. 99.. ДДооссттуупп кк ппррииннттеерруу WWiinnddoowwss сс ммаашшиинн ррааббооттааюющщиихх ппоодд LLiinnuuxx Для доступа к принтеру на Windows машине, вы должны сделать следующее: 1. ВЫ должны иметь правильные записи в файле /etc/printcap и они должны соответствовать локальной структуре директорий (для буферной директории, и т.п.) 2. У вас должен быть скрипт /usr/bin/smbprint. Он поставляется вместе с исходными текстами Samba, но не со всеми двоичными дистрибутивами Samba. Его немного модифицированная копия обсуждается ниже. 3. Если вы хотите преобразовывать ASCII файлы в Postscript, вы должны иметь программу nenscript, или ее эквивалент. nenscript -- это конвертер Postscript, он обычно устанавливается в директорию /usr/bin. 4. Вы можете захотеть сделать печать через Samba более легкой, используя программы-надстройки. Простой скрипт на perl, который обрабатывает ASCII, Postscript или преобразованный Postscript приведен ниже. 5. Вы также можете использовать MagicFilter для того, чтобы выполнить, описанное выше. Подробности о настройке MagicFilter приводятся ниже. MagicFilter имеет преимущества, потому, что он знает как автоматически преобразовывать достаточно большое количество форматов файлов. Запись в файле /etc/printcap, приведенном ниже, сделана для принтера HP 5MP на сервере Windows NT. Используются следующие поля файла /etc/printcap: ______________________________________________________________________ cm - комментарий lp - имя устройства, открываемого для вывода sd - директория спула принтера (на локальной машине) af - файл учета пользования принтером mx - максимальный размер файла (ноль -- без ограничений) if - имя входного фильтра (скрипта) ______________________________________________________________________ Для более детальной информации о печати смотрите _P_r_i_n_t_i_n_g _H_O_W_T_O или справочные страницы по 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 делает жизнь пользователя легче, обеспечивая простой интерфейс для печати используя smbprint. ______________________________________________________________________ Использование: print [-a|c|p] -a печатает как ASCII -c печатает отформатированный как исходный код -p печатает как 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] -a печатает как ASCII -c печатает отформатированный как исходный код -p печатает как 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() { $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() { push(@newlines,$_); } close(FILE); system("rm $tmpfile"); } sub createarray { # Create the array for postscript open(FILE, "<$file") || die "Can't open $file: $!\n"; while() { push(@newlines,$_); } close(FILE); } ______________________________________________________________________ Теперь о применении MagicFilter. Спасибо Alberto Menegazzi (flash.egon@iol.it) за его информацию. Alberto сообщил: --------------------------%<---------------------------------- 1) Установите MagicFilter в /usr/bin/local с фильтрами для необходимых принтеров, но НЕ заполняйте записи в /etc/printcap, как предполагается в документации на MagicFilter. 2) Запишите в /etc/printcap примерно вот такую запись (Это сделано для моего принтера LaserJet 4L): lp|ljet4l:\ :cm=HP LaserJet 4L:\ :lp=/dev/null:\ # or /dev/lp1 :sd=/var/spool/lpd/ljet4l:\ :af=/var/spool/lpd/ljet4l/acct:\ :sh:mx#0:\ :if=/usr/local/bin/main- filter: Вы должны, объяснить, что устройство lp=/dev/... открывается для блокирования, так что для каждого удаленного принтера используется одно "виртуальное устройство". Пример создания : touch /dev/ljet4l 3) Напишите фильтр /usr/local/bin/main-filter, с таким же образом предполгая использование ljet4l-filter вместо cat. Вот так для меня. #! /bin/sh logfile=/var/log/smb-print.log spool_dir=/var/spool/lpd/ljet4l ( echo "print -" /usr/local/bin/ljet4l-filter ) | /usr/bin/smbclient "\\\\SHIR\\HPLJ4" -N -P >> $logfile P.S. : Это цитата из Print2Win mini-Howto о блокировании и зачем создавать виртуальные принтера ---Начало здесь --------- Совет от Rick Bressler : Good tip sheet. I use something very similar. One helpful tip, this is not a particularly good idea: :lp=/dev/null:\ lpr does an 'exclusive' open on the file you specify as lp=. It does this in order to prevent multiple processes from trying to print to the dame printer at the same time. The side effect of this is that in your case, eng and colour can't print at the same time, (usually more or less transparent since they probably print quickly and since they queue you probably don't notice) but any other process that tries to write to /dev/null will break! On a single user system, probably not a big problem. I have a system with over 50 printers. It would be a problem there. The solution is to create a dummy printer for each. Eg: touch /dev/eng. I have modified the lp entries in the printcap file above to take into account Rick's suggestion. I did the following: #touch /dev/eng #touch /dev/colour ---Ends here --------------------------%<---------------------------------- 1100.. BBaacckkiinngg UUpp WWiinnddoowwss MMaacchhiinneess ttoo aa LLiinnuuxx HHoosstt Adam Neat (adamneat@ipax.com.au) kindly contributed the following script to back up Windows machines to a Linux host, using the smbclient utility. Adam says that it is used to backup Windows 3.x and NT machines to a Linux based DAT SCSI Drive. Adam is not proud of the coding style used here, but it works. As I like to say, "If it works and its stupid, then it is not stupid". In this script, the string 'agnea1' is the username on the Linux machine that does the backups. ______________________________________________________________________ #!/bin/bash clear echo Initialising ... checkdate=`date | awk '{print $1}'` if [ -f "~agnea1/backup-dir/backup-data" ]; then echo "ERROR: No config file for today!" echo "FATAL!" exit 1 fi if [ -d "~agnea1/backup-dir/temp" ]; then echo "ERROR: No tempoary directory found!" echo echo "Attempting to create" cd ~agnea1 cd backup-dir mkdir temp echo "Directory Made - temp" fi if [ "$1" = "" ]; then echo "ERROR: enter in a machine name (ie: cdwriter)" exit 1 fi if [ "$2" = "" ]; then echo "ERROR: enter in a SMB (Lan Manager) Resource (ie: work)" exit 1 fi if [ "$3" = "" ]; then echo "ERROR: enter in an IP address for $1 (ie: 130.xxx.xxx.52)" exit 1 fi ############################################################################# # Main Section # ############################################################################# cd ~agnea1/backup-dir/temp rm -r ~agnea1/backup-dir/temp/* cd ~agnea1/backup-dir/ case "$checkdate" in Mon) echo "Backuping for Monday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete" if [ -d "~agnea1/backup-dir/Monday" ]; then echo "Directory Monday Not found ... making" mkdir ~agnea1/backup-dir/Monday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf monday.tar * echo "done ..." rm ~agnea1/backup-dir/Monday/monday.tar mv monday.tar ~agnea1/backup-dir/Monday ;; Tue) echo "Backuping for Tuesday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete" if [ -d "~agnea1/backup-dir/Tuesday" ]; then echo "Directory Tuesday Not found ... making" mkdir ~agnea1/backup-dir/Tuesday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf tuesday.tar * echo "done ..." rm ~agnea1/backup-dir/Tuesday/tuesday.tar mv tuesday.tar ~agnea1/backup-dir/Tuesday ;; Wed) echo "Backuping for Wednesday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete" if [ -d "~agnea1/backup-dir/Wednesday" ]; then echo "Directory Wednesday Not found ... making" mkdir ~agnea1/backup-dir/Wednesday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf wednesday.tar * echo "done ..." rm ~agnea1/backup-dir/Wednesday/wednesday.tar mv wednesday.tar ~agnea1/backup-dir/Wednesday ;; Thu) echo "Backuping for Thrusday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete" if [ -d "~agnea1/backup-dir/Thursday" ]; then echo "Directory Thrusday Not found ... making" mkdir ~agnea1/backup-dir/Thursday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf thursday.tar * echo "done ..." rm ~agnea1/backup-dir/Thursday/thursday.tar mv thursday.tar ~agnea1/backup-dir/Thursday ;; Fri) echo "Backuping for Friday" cat backup-data | /usr/local/samba/bin/smbclient \\\\$1\\$2 -I$3 -N echo "Complete" if [ -d "~agnea1/backup-dir/Friday" ]; then echo "Directory Friday Not found ... making" mkdir ~agnea1/backup-dir/Friday fi echo "Archiving ..." cd ~agnea1/backup-dir/temp tar -cf friday.tar * echo "done ..." rm ~agnea1/backup-dir/Friday/friday.tar mv friday.tar ~agnea1/backup-dir/Friday ;; *) echo "FATAL ERROR: Unknown variable passed for day" exit 1;; esac ########### ______________________________________________________________________ 1111.. ААввттооррссккииее ппрраавваа Авторскими правами на этот документ владеет David Wood, 1996-9. Он может воспроизводится в любой форме и свободно распространяться, при сохранении файла неизменным, включая это заявление. 1122.. ББллааггооддааррннооссттии Brad Marshall (bmarshall@plugged.net.au) и Jason Parker (jparker@plugged.net.au) нашедших время, проявивших настойчивость, написавших скрипт и проводивших эксперименты. Adam Neat (adamneat@ipax.com.au) предоставившего скрипт для сохранения данных с машины под Windows на машину с Linux. Matthew Flint (matthew@philtrum.demon.co.uk) рассказавшему мне об использовании настройки 'interfaces' в файле smb.conf. Oleg L. Machulskiy (machulsk@shade.msu.ru), Jeff Stern (jstern@eclectic.ss.uci.edu), Dr. Michael Langner (langner@fiz- chemie.de and Erik Ratcliffe (erik@caldera.com) предложивших изменения в раздел об организации доступа к принтерам Linux для машин с Windows. Alberto Menegazzi (flash.egon@iol.it) предоставившему мне настройки для MagicFilter, чтобы он могу обеспечивать доступ к принтерам Windows для машин с Linux. Andrea Girotto (icarus@inca.dei.unipd.it) пославшему мне некоторое количество пожеланий относительно данного документа. Также благодарю всех национальных переводчиков, которые перенесли этот документ в мир не говорящий по Английски: Takeo Nakano (nakano@apm.seikei.ac.jp), Klaus-Dieter Schumacher (Klaus- Dieter.Schumacher@fernuni-hagen.de), Andrea Girotto (icarus@inca.dei.unipd.it) и многих других. о которых я не имею контактной информации.