вторник, 3 февраля 2009 г.

Samba

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

Команды для управления в Ubuntu linux:

/etc/init.d/samba stop

/etc/init.d/samba start

/etc/init.d/samba restart

smbpasswd -a username

smbpasswd -e username

Настройка 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, используя утилиту 'testparm' (справочная страница: testparm); если testparm сообщает об отсутствии проблем, то smbd правильно загрузит файл настроек.

Полезный трюк: Если ваш сервер Samba имеет больше одного ethernet интерфейса, то smbd может подключится к неправильному. Если это так, что вы можете явно заставит ее подключаться к нужному добавив строку в раздел [global] файла /etc/smb.conf:


interfaces = 192.168.1.1/24

Также существует GUI-утилита для настройки Samba: GtkSamba. Смотрите страницу по адресу http://www.open-systems.com/gtksamba.html.


Пример samba.conf:

[global]
workgroup = LAB83.NET
server string = Lab83 SMB server (Ubuntu 7.10)
security = SHARE
obey pam restrictions = Yes
passdb backend = tdbsam
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n *password\supdated\ssuccessfully* .
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
dns proxy = No
panic action = /usr/share/samba/panic-action %d
invalid users = root
force user = anonymous
force group = ftp_user
create mask = 0644
guest ok = Yes

# Настройка принтера
load printers = yes
printing = cups
printcap name = cups

[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
public = yes
guest ok = yes
writable = no
printable = yes
printer admin = root

[print$]
comment = Printer Drivers
browseable = yes
guest ok = yes
read only = yes

[archive_disk]
path = /my_files/share/archive_disk

[crashed_linux_home]
path = /my_files/share/crashed_linux_home

[distributives]
path = /my_files/share/distributives

[docs]
path = /my_files/share/docs

[upload]
path = /my_files/share/upload
read only = No

Еще один пример conf файла:

#======================= Global Settings =======================

[global]
workgroup = WORKGROUP
server string = FileServer
; wins support = no
; wins server = w.x.y.z
dns proxy = no
; name resolve order = lmhosts host wins bcast


#### Networking ####
; interfaces = 127.0.0.0/8 eth0
hosts allow = 172.16.0.
; bind interfaces only = true


#### Debugging/Accounting ####
log file = /var/log/samba/log.%m
max log size = 1000
; syslog only = no
syslog = 0
panic action = /usr/share/samba/panic-action %d


####### Authentication #######
security = share
encrypt passwords = true
passdb backend = tdbsam

obey pam restrictions = yes

guest account = lhav
invalid users = root

; unix password sync = no

passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n *password\supdated\ssuccessfully* .

; pam password change = no


########## Domains ###########

; domain logons = yes
; logon path = \\%N\profiles\%U
; logon path = \\%N\%U\profile

; logon drive = H:
; logon home = \\%N\%U

; logon script = logon.cmd

; add user script = /usr/sbin/adduser —quiet —disabled-password —gecos “» %u


########## Printing ##########
; load printers = yes
; printing = bsd
; printcap name = /etc/printcap

; printing = cups
; printcap name = cups

; printer admin = @lpadmin


############ Misc ############
; include = /home/samba/etc/smb.conf.%m
socket options = TCP_NODELAY
; message command = /bin/sh —c '/usr/bin/linpopup "%f» "%m» %s; rm %s' &

; domain master = auto

; idmap uid = 10000—20000
; idmap gid = 10000—20000
; template shell = /bin/bash

#======================= Share Definitions =======================
[homes]
comment = Домашняя папка
browseable = no

valid users = %S
writable = yes
create mask = 0600
directory mask = 0700

;[netlogon]
; comment = Network Logon Service
; path = /home/samba/netlogon
; guest ok = yes
; writable = no
; share modes = no

;[profiles]
; comment = Users profiles
; path = /home/samba/profiles
; guest ok = no
; browseable = no
; create mask = 0600
; directory mask = 0700

[www]
comment = ВЕБ сервер
browseable = no
path = /var/www/
writable = yes

[ftp]
comment = FTP сервер
browseable = yes
guest ok = yes
path = /home/ftp/
public = yes
writable = now

[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
browseable = yes
read only = yes
guest ok = no

; write list = root, @ntadmin

;[cdrom]
; comment = Samba server's CD-ROM
; writable = no
; locking = no
; path = /cdrom
; public = yes

; preexec = /bin/mount /cdrom
; postexec = /bin/umount /cdrom

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

Как показано выше в файле 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 и справочные страницы.

Доступ к дискам 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 

где '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 в ядре.

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

Для организации доступа к 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 для печати прямо на принтер, вместо использования буферизации на сервере.

Доступ к принтеру Windows с машин работающих под Linux

Для доступа к принтеру на 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 - имя входного фильтра (скрипта)

Для более детальной информации о печати смотрите 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 делает жизнь пользователя легче, обеспечивая простой интерфейс для печати используя 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 ($#_ < arg =" shift(@_);" arg ="~" cmd =" $arg;" file =" shift(@_);" file =" $arg;" file ="~" filetype = "ps" file ="~" filetype = "code" filetype = "ASCII" cmd ="~" filetype = "ps" cmd ="~" filetype = "code" cmd ="~" filetype = "ASCII">
-a печатает как ASCII
-c печатает отформатированный как исходный код
-p печатает как Postscript
Если опции не заданы, программа попробует определить
тип файла и печатать соответственно\n
";
exit(0);
}

sub wrap {
# Create an array of file lines, where each line is < limit =" pop(@_);">) {
$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

[global]
workgroup = ADSL
netbiosname = PDC-SRV-ADSL
preferred master = yes
os level = 65
wins support = yes
enable privileges = yes
timeserver = yes
socket options = SO_KEEPALIVE IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192
log level = 3
null passwords = yes
security = user
# unix charset = ISO8859-1
name resolve order = bcast host
domain logons = yes
domain master = yes
printing = cups
printcap name = cups
logon path = \\%N\profiles\%U
logon script = logon.bat
logon drive = H:
map acl inherit = yes
nt acl support = yes
passdb backend = ldapsam:ldap://127.0.0.1/
obey pam restrictions = no
ldap admin dn = cn=admin,dc=adsl,dc=com
ldap suffix = dc=adsl,dc=com
ldap group suffix = ou=Groups
ldap user suffix = ou=Users
ldap machine suffix = ou=Computers
ldap idmap suffix = ou=Users
ldap passwd sync = yes
# ldap delete dn = yes
passwd program = /usr/sbin/smbldap-passwd -u %u
passwd chat = "Changing password for*\nNew password*" %n\n "*Retype new password*" %n\n
add user script = /usr/sbin/smbldap-useradd -m "%u"
add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g"
set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u"
add group script = /usr/sbin/smbldap-groupadd -p "%g"
add machine script = /usr/lib/mmc/add_machine_script '%u'
delete user script = /usr/sbin/smbldap-userdel "%u"
delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g"
delete group script = /usr/sbin/smbldap-groupdel "%g"
acl group control = yes


[homes]
comment = Home directories
browseable = no
writeable = yes
create mask = 0700
directory mask = 0700
hide files = /Maildir/

[public]
comment = Public share
path = /home/samba/shares/public
browseable = yes
public = yes
writeable = yes

[archives]
comment = Backup share
path = /home/samba/archives
browseable = yes
public = no
writeable = no

[printers]
comment = Printers
path = /tmp
browseable = no
public = yes
guest ok = yes
writeable = no
printable = yes

[print$]
comment = Drivers
path = /var/lib/samba/printers
browseable = yes
guest ok = yes
read only = yes
write list = Administrator,root,@lpadmin

[netlogon]
path = /home/samba/netlogon
public = yes
writeable = yes
browseable = no

[profiles]
path = /home/samba/profiles
writeable = yes
create mask = 0700
directory mask = 0700
browseable = no
hide files = /desktop.ini/ntuser.ini/NTUSER.*/

[partage]
comment = aucun
path = /home/samba/partage
browseable = yes
public = no
writeable = yes

[www]
path = /usr/share/mmc
writeable = yes
admin users = Administrator, ADSL\Administrator
create mask = 0777
directory mask = 0777
browseable = no
hide files = /desktop.ini/ntuser.ini/NTUSER.*/

Теперь нужно протестировать конфиг самбы на ошибки командой testparm

Теперь дадим самбе права на чтение ldap базы.
smbpasswd -w example
сервер ответит

Код
Setting stored password for "cn=admin,dc=ads,dc=com" in secrets.tdb

Теперь получим SID нашего домена:

net getlocalsid ADSL

В ответ он мне выдаст номер Sid’a. Сохраните его в какой ни будь файл. Он нам понадобится очень скоро.

Код
SID for domain ADSL is: S-1-5-21-1867216969-3838886759-4012667054

Проверяем регистрацию сида в Ldap:
slapcat | grep sambaDomainName
В ответ что то типа:

Код
dn: sambaDomainName=ADSL,dc=adsl,dc=com
sambaDomainName: ADSL


Запускаем Samba:

/etc/init.d/samba start

Ура, самба закончилась. Перейдём к конфигурации smbLdap tools. Это так же важная часть домена:
Для начала созданим файлы конфигурации для smbldap-tools.

ee /etc/smbldap-tools/smbldap_bind.conf

Код
slaveDN="cn=admin,dc=adsl,dc=com"
slavePw="example"
masterDN="cn=admin,dc=adsl,dc=com"
masterPw="example"


Сейчас будем настраивать главный файл конфиграции smbldap-tools. В него нужно вставить номер нашего SID, котопрый мы получили чуть выше… А так же подставить свои значения.

ee /etc/smbldap-tools/smbldap.conf

Код
SID="S-1-5-21-3159899821-123882392-54881133"
sambaDomain="ADSL"
ldapTLS="0"
suffix="dc=adsl,dc=com"
usersdn="ou=Users,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Groups,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=ADSL,${suffix}"
scope="sub"
hash_encrypt="SSHA"
userLoginShell="/bin/bash"
userHome="/home/%U"
userHomeDirectoryMode="700"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/etc/skel"
defaultMaxPasswordAge="45"
userSmbHome="\\PDC-SRV-ADSL\%U"
userProfile="\\PDC-SRV-ADSL\profiles\%U"
userHomeDrive="H:"
userScript="logon.bat"
mailDomain="adsl.com"
smbpasswd="/usr/bin/smbpasswd"

Ставим права на конфиг файлы smbldap-tools:

chmod 0644 /etc/smbldap-tools/smbldap.conf
chmod 0600 /etc/smbldap-tools/smbldap_bind.conf

Так. Всё готово. Теперь нужно наполнить нашу ldap базу. А так же создать глобальный аканут администратора ldap. (Administrator).

smbldap-populate -m 512 -a Administrator

Вас попросят ввести пароль администратора. Я ввёл example. Так же, в будующем, нужно будет изменить uid номер учётной записи администратора. Иначе будут проблемы с почтой для этого акаунта.

Дополнительно мы добавим Administrator в группу Domain Users.

smbldap-usermod -u 3000 -G "Domain Users" Administrator

Так. Теперь конфигурируем NSS LDAP. Что бы иметь позможность получать списки и данные Ldap.
Копируем предорженый файл mmc в /etc/nsswitch.conf

cp /usr/share/doc/python-mmc-base/contrib/ldap/nsswitch.conf /etc/nsswitch.conf

После этого создадим необходимые директории для samba. Которые мы указывали в её конфиге:

mkdir -p /home/samba/shares/public/
mkdir /home/samba/netlogon/
mkdir /home/samba/profiles/
mkdir /home/samba/partage/
mkdir /home/samba/archives/

И зададим им соответствующие права:
chown -R :"Domain Users" /home/samba/
chmod 777 /var/spool/samba/ /home/samba/shares/public/
chmod 755 /home/samba/netlogon/
chmod 770 /home/samba/profiles/ /home/samba/partage/
chmod 700 /home/samba/archives/

Официальное руководство и HOWTO по Samba 3.2.x:

http://www.ibm.com/developerworks/ru/edu/samba2/index.html

Комментариев нет:

Отправить комментарий