1787 lines
62 KiB
Plaintext
1787 lines
62 KiB
Plaintext
SMB HOWTO
|
||
David Wood, dwood@plugged.net.au
|
||
v1.3, 20 April 2000
|
||
|
||
This is the SMB HOWTO. This document describes how to use the Server
|
||
Message Block (SMB) protocol, also called the Session Message Block,
|
||
NetBIOS or LanManager protocol, with Linux using Samba.
|
||
______________________________________________________________________
|
||
|
||
Table of Contents
|
||
|
||
|
||
1. License
|
||
|
||
2. Introduction
|
||
|
||
3. Further Information
|
||
|
||
4. Installation
|
||
|
||
5. Running The Daemons
|
||
|
||
6. General Configuration (/etc/smb.conf)
|
||
|
||
7. Sharing A Linux Drive With Windows Machines
|
||
|
||
8. Accessing an SMB Share With Linux Machines
|
||
|
||
9. Sharing A Linux Printer With Windows Machines
|
||
|
||
10. Sharing A Windows Printer With Linux Machines
|
||
|
||
11. Backing Up Windows Machines to a Linux Host
|
||
|
||
12. Using Samba Across Routed Networks
|
||
|
||
13. Acknowledgements
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
|
||
1. License
|
||
|
||
Copyright (c) 2000 David Wood.
|
||
|
||
Permission is granted to copy, distribute and/or modify this document
|
||
under the terms of the GNU Free Documentation License, Version 1.1 or
|
||
any later version published by the Free Software Foundation; with no
|
||
Invariant Sections , with no Front-Cover Texts and with no Back-Cover
|
||
Texts. A copy of the license is available at
|
||
http://www.gnu.org/copyleft/fdl.html
|
||
<http://www.gnu.org/copyleft/fdl.html>.
|
||
|
||
|
||
2. Introduction
|
||
|
||
This is the SMB HOWTO. This document describes how to use the Server
|
||
Message Block (SMB) protocol, also called the Session Message Block,
|
||
NetBIOS or LanManager protocol, with Linux using Samba. Although this
|
||
document is Linux-centric, Samba runs on most Unix-like operating
|
||
systems.
|
||
|
||
This document is maintained by David Wood (dwood@plugged.net.au).
|
||
Additions, modifications or corrections may be mailed there for
|
||
inclusion in the next release.
|
||
Much more Samba documentation is available at the Samba Web site,
|
||
located at http://www.samba.org/ <http://www.samba.org/>. There is a
|
||
tremendous amount of information there; please have a look before
|
||
asking for help! You also might try the comp.protocols.smb newsgroup.
|
||
|
||
The SMB protocol is used by Microsoft Windows 3.11, NT and 95/98 to
|
||
share disks and printers. Using the Samba suite of tools by Andrew
|
||
Tridgell (Andrew.Tridgell@anu.edu.au), UNIX (including Linux) machines
|
||
can share disk and printers with Windows hosts. The smbfs tools by
|
||
Paal-Kr. Engstad (engstad@intermetrics.com) and Volker Lendecke
|
||
(lendecke@namu01.gwdg.de) enable Unix machines to mount SMB shares
|
||
from Windows or Samba hosts.
|
||
|
||
There are four basic things that one can do with Samba:
|
||
|
||
|
||
1. Share a Linux drive with Windows machines.
|
||
|
||
2. Access an SMB share with Linux machines.
|
||
|
||
3. Share a Linux printer with Windows machines.
|
||
|
||
4. Share a Windows printer with Linux machines.
|
||
|
||
All of these are covered in this document, plus a few other odds and
|
||
ends.
|
||
|
||
Disclaimer: The procedures and scripts either work for the author or
|
||
have been reported to work by the people that provided them.
|
||
Different configurations may not work with the information given here.
|
||
If you encounter such a situation, please e-mail the author with
|
||
suggestions for improvement in this document.
|
||
|
||
Please note that for Windows 3.x machines to access SMB shares, they
|
||
must have a TCP/IP stack and the Win32s DLLs. Both of these are
|
||
available on Microsoft's Web site (http://www.microsoft.com
|
||
<http://www.microsoft.com>). As of the writing of this version of the
|
||
HOWTO, Microsoft are reportedly requiring a subscription to the
|
||
Microsoft Software Developers Network (MSDN) to download the TCP/IP-32
|
||
stack for Windows 3.x from their Web site. Since this software used
|
||
to be free, many older copies are in existance and may be acquired
|
||
from friends and user group contacts.
|
||
|
||
|
||
3. Further Information
|
||
|
||
This HOWTO attempts to explain how to configure basic SMB file and
|
||
print services on a Linux machine. Samba is a very complex and
|
||
complete package. There would be no point in attempting to duplicate
|
||
all of the documentation for Samba here.
|
||
|
||
For further information, please see the following documents:
|
||
|
||
<20> The Samba documentation, available as part of the Samba
|
||
distribution. The distribution is available at:
|
||
ftp://ftp.samba.org/ <ftp://ftp.samba.org/>
|
||
|
||
<20> The Linux Printing HOWTO.
|
||
|
||
<20> Protocol Standard For A NetBIOS Service On A TCP/UDP Transport.
|
||
|
||
RFC 1001
|
||
> RFC 1001 - Concepts and Methods.
|
||
|
||
RFC 1002
|
||
> RFC 1002 - Detailed Specifications.
|
||
4. Installation
|
||
|
||
First, in order to use Samba your machines must be on a single
|
||
ethernet LAN segment using the TCP/IP protocol. Samba will not work
|
||
using other network protocols. This is generally easy since Linux and
|
||
Windows 95/98/NT ship with TCP/IP support. However, if you are using
|
||
Windows 3.X machines TCP/IP support will need to be added. One of the
|
||
most common questions that I get asked is why Samba "isn't working"
|
||
when Windows machines are not using TCP/IP.
|
||
|
||
In order to setup Windows 95/98 to use TCP/IP, select Control Panel |
|
||
Network, then add and configure Microsoft TCP/IP. Under Windows NT,
|
||
select Control Panel | Network | Protocols.
|
||
|
||
To get the latest source version of Samba, go to this URL and pick the
|
||
closest mirror site to you: ftp://ftp.samba.org/
|
||
<ftp://ftp.samba.org/>.
|
||
|
||
In most cases, though, your Linux distribution will already come with
|
||
an installable package containing a recent version of Samba.
|
||
|
||
The following two daemons are required for the Samba package. They
|
||
are typically installed in /usr/sbin and run either on boot from the
|
||
systems startup scripts or from inetd. Example scripts are shown in
|
||
``Running the Daemons''.
|
||
|
||
|
||
______________________________________________________________________
|
||
smbd (The SMB daemon)
|
||
nmbd (Provides NetBIOS nameserver support to clients)
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Please note that the name service provided by the nmbd daemon is
|
||
different from the name service provided by the Domain Name Service
|
||
(DNS). NetBIOS name service is a 'Windows-style' name service used
|
||
for SMB. In other words, having DNS name service tells you nothing
|
||
about the state of the ability for Samba to resolve host names.
|
||
|
||
Typically, the following Samba binaries are installed in /usr/bin or
|
||
/usr/local/samba/bin, although the location is optional.
|
||
|
||
|
||
______________________________________________________________________
|
||
smbclient (An SMB client for UNIX machines)
|
||
smbprint (A script to print to a printer on an SMB host)
|
||
smbprint.sysv (As above, but for SVR4 UNIX machines)
|
||
smbstatus (Lists the cuurent SMB connections for the local host)
|
||
smbrun (A 'glue' script to facilitate runnning applciations
|
||
on SMB hosts)
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
The binaries for smbfs file system support are discussed later in this
|
||
document.
|
||
|
||
Additionally, a script called 'print' is included with this HOWTO,
|
||
which serves as a useful front end to the smbprint script.
|
||
|
||
The Samba package is simple to install. Simply retrieve the source
|
||
from the location mentioned above, and read the file README in the
|
||
distribution. There is also a file called docs/INSTALL.txt in the
|
||
distribution that provides a simple step-by-step set of instructions.
|
||
|
||
Following installation, place the daemons in /usr/sbin and the
|
||
binaries in /usr/bin. Install the man pages in /usr/local/man.
|
||
|
||
When you made the Samba package, you would have specified in the
|
||
Makefile the location for the configuration file, smb.conf. This is
|
||
generally in /etc, but you can put it anywhere you like. For these
|
||
directions, we will presume that you specified the location of the
|
||
configuration file as /etc/smb.conf, the log file location as log file
|
||
= /var/log/samba-log.%m and the lock directory as lock directory =
|
||
/var/lock/samba.
|
||
|
||
Install the configuration file, smb.conf. Go to the directory where
|
||
Samba was built. Look in the subdirectory examples/simple and read
|
||
the file README. Copy the file smb.conf found in that directory to
|
||
/etc. BE CAREFUL! If you have a Linux distribution that already has
|
||
Samba installed, you may already have a Samba configuration file in
|
||
/etc. You should probably start with that one.
|
||
|
||
If you don't want to have your configuration file in /etc, put it
|
||
wherever you want to, then put a symlink in /etc:
|
||
|
||
|
||
______________________________________________________________________
|
||
ln -s /path/to/smb.conf /etc/smb.conf
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
5. Running The Daemons
|
||
|
||
The two SMB daemons are /usr/sbin/smbd and /usr/sbin/nmbd. Under most
|
||
Linux distributions, these are started, stoped and restarted via the
|
||
startup script located in /etc/rc.d/init.d/smb and symlinked to the
|
||
appropriate runlevels.
|
||
|
||
If you choose not to use the standard startup script, you can run the
|
||
Samba daemons from inetd or as stand-alone processes. Samba will
|
||
respond slightly faster as a standalone daemon than running from
|
||
inetd.
|
||
|
||
In either case, you should check the file /etc/services for lines that
|
||
look like this:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
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
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Make sure they are all uncommented. Depending on your distribution,
|
||
you may even need to add them. Samba will not be able to bind to the
|
||
appropriate ports unless /etc/services has these entries.
|
||
|
||
To run the daemons from inetd, place the following lines in the inetd
|
||
configuration file, /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
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Then restart the inetd daemon by running the command:
|
||
|
||
|
||
______________________________________________________________________
|
||
kill -HUP `cat /var/run/inetd.pid`
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
To run the daemons from the system startup scripts, put the following
|
||
script in file called /etc/rc.d/init.d/smb (for most distributions)
|
||
and symbolically link it to the files specified in the comments:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
#!/bin/sh
|
||
|
||
#
|
||
# /etc/rc.d/init.d/smb - starts and stops SMB services.
|
||
#
|
||
# The following files should be synbolic links to this file:
|
||
# symlinks: /etc/rc.d/rc1.d/K35smb (Kills SMB services on shutdown)
|
||
# /etc/rc.d/rc3.d/S91smb (Starts SMB services in multiuser mode)
|
||
# /etc/rc.d/rc6.d/K35smb (Kills SMB services on reboot)
|
||
#
|
||
|
||
# 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
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
If when starting Samba you get an error that says something about the
|
||
daemon failing to bind to port 139, then you probably have another
|
||
Samba process already running that hasn't yet shut down. Check a
|
||
process list (with 'ps auxww | grep mbd') to determine if another
|
||
Samba service is running.
|
||
|
||
|
||
|
||
6. General Configuration (/etc/smb.conf)
|
||
|
||
Samba configuration on a Linux (or other UNIX machine) is controlled
|
||
by a single file, /etc/smb.conf. This file determines which system
|
||
resources you want to share with the outside world and what
|
||
restrictions you wish to place on them.
|
||
|
||
Since the following sections will address sharing Linux drives and
|
||
printers with Windows machines, the smb.conf file shown in this
|
||
section is as simple as you can get, just for introductory purposes.
|
||
|
||
|
||
Don't worry about the details, yet. Later sections will introduce the
|
||
major concepts.
|
||
|
||
Each section of the file starts with a section header such as
|
||
[global], [homes], [printers], etc.
|
||
|
||
The [global] section defines a few variables that Samba will use to
|
||
define sharing for all resources.
|
||
|
||
The [homes] section allows a remote users to access their (and only
|
||
their) home directory on the local (Linux) machine). That is, users
|
||
trying to connect to this share from Windows machines, will be
|
||
connected to their personal home directories. Note that to do this,
|
||
they must have an account on the Linux box.
|
||
|
||
The sample smb.conf file below allows remote users to get to their
|
||
home directories on the local machine and to write to a temporary
|
||
directory. For a Windows user to see these shares, the Linux box has
|
||
to be on the local network. Then the user simply connects a network
|
||
drive from the Windows File Manager or Windows Explorer.
|
||
|
||
Note that in the following sections, additional entries for this file
|
||
will be given to allow more resources to be shared.
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
; /etc/smb.conf
|
||
;
|
||
; Make sure and restart the server after making changes to this file, ex:
|
||
; /etc/rc.d/init.d/smb stop
|
||
; /etc/rc.d/init.d/smb start
|
||
|
||
[global]
|
||
; Uncomment this if you want a guest account
|
||
; 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
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Having written a new smb.conf, it is useful to test it to verify its
|
||
correctness. You can test the correctness of a smb.conf file , using
|
||
the 'testparm' utility (man page: testparm); if testparm reports no
|
||
problems, smbd will correctly load the configuration file.
|
||
|
||
Here's a good trick: If your Samba server has more than one ethernet
|
||
interface, the smbd may bind to the wrong one. If so, you can force
|
||
it to bind to the intended one by adding a line that looks like this
|
||
to the [global] section of /etc/smb.conf:
|
||
|
||
______________________________________________________________________
|
||
interfaces = 192.168.1.1/24
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
where you replace the IP address above with the one that is assigned
|
||
to the correct ethernet interface. The "24" is correct for a Class C
|
||
network, but may have to be recalculated if you have subnetted the
|
||
network. The number relates to the netmask. Numbers for other
|
||
classes of networks are given in the IP-Masquerade mini-HOWTO.
|
||
|
||
There is now a GUI configuration tool for Samba: GtkSamba. See
|
||
http://www.open-systems.com/gtksamba.html <http://www.open-
|
||
systems.com/gtksamba.html>.
|
||
|
||
|
||
|
||
7. Sharing A Linux Drive With Windows Machines
|
||
|
||
As shown in the simple smb.conf above, sharing Linux drives with
|
||
Windows users is easy. However, like everything else with Samba, you
|
||
can control things to a large degree. Here are some examples:
|
||
|
||
To share a directory with the public, create a clone of the [tmp]
|
||
section above by adding something like this to smb.conf:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
[public]
|
||
comment = Public Stuff
|
||
path = /home/public
|
||
public = yes
|
||
writable = yes
|
||
printable = no
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
To make the above directory readable by the public, but only writable
|
||
by people in group staff, modify the entry like this:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
[public]
|
||
comment = Public Stuff
|
||
path = /home/public
|
||
public = yes
|
||
writable = yes
|
||
printable = no
|
||
write list = @staff
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
It used to be that easy; you would now be able to start Samba and
|
||
browse the shares from a Windows PC. However, Microsoft has recently
|
||
made life slightly more difficult for those using Samba. Windows 98,
|
||
Windows NT (service pack 3 or higher) and later builds of Windows 95
|
||
now use encrypted passwords by default. Samba uses unencrypted
|
||
passwords by default. You can't browse servers when either the client
|
||
or server is using encrypted passwords, because a connection cannot be
|
||
made anonymously.
|
||
|
||
You can tell if you have a password type mismatch between client and
|
||
server if when you try to connect to a share you see a dialog box
|
||
which reads something like "You are not authorized to access that
|
||
account from this machine".
|
||
|
||
You can either configure your Samba server to use encrypted passwords,
|
||
or configure the Windows machines to use unencrypted passwords.
|
||
|
||
To get Windows to work with encrypted SMB passwords:
|
||
|
||
Windows 95/98 =============
|
||
|
||
Using the registry editor (regedit), create the registry setting
|
||
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP Add a
|
||
new DWORD value: Value Name: EnablePlainTextPassword Data:
|
||
0x01.
|
||
|
||
Windows NT ==========
|
||
|
||
Using the registry editor (regedit), create the registry setting
|
||
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rdr\Parameters
|
||
Add a new DWORD value: Value Name: EnablePlainTextPassword Data:
|
||
0x01
|
||
|
||
Windows 2000 ============
|
||
|
||
Using the registry editor (regedit), create the registry setting
|
||
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkStation\Parameters
|
||
Add a new DWORD value: Value Name: EnablePlainTextPassword Data: 0x01
|
||
|
||
Once these registry changes have been made, reboot the Windows machine
|
||
and try to map a network drive on the Samba server again. It should
|
||
work as long as the Samba server is using plain text passwords.
|
||
|
||
To configure Samba to use encrypted passwords:
|
||
|
||
In the [global] section of /etc/smb.conf, add the following lines:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
encrypt passwords = yes
|
||
smb passwd file = /etc/smbpasswd
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
You are highly encouraged to read the files ENCRYPTION.txt, Win95.txt
|
||
and WinNT.txt in the Samba documentation before doing this!
|
||
|
||
If your clients and server are using encrypted passwords, you will not
|
||
be able to browse the available shares on the server until an initial
|
||
connection has been made with the appropriate authentication. To get
|
||
the initial connection, enter the share name manually in the Windows
|
||
File Manager or Explorer dialog box, in the form
|
||
'\\<hostname>\<sharename>'. Log onto the server with a username and
|
||
password that is valid on the server!
|
||
|
||
If you suspect that your NetBIOS name service is not correctly
|
||
configured (perhaps because you get 'host not found' errors when
|
||
trying to connect), try using just the IP address of the server:
|
||
'\\<host ip address>\<sharename>'.
|
||
In order to get filenames to appear correctly, you may also need to
|
||
set some options in the appropriate share section. These work for
|
||
Windows 95/98/NT clients, but may need to be modified if you have
|
||
Windows 3.X clients:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
; 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
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
For other tricks to play with drive shares, see the Samba
|
||
documentation or man pages.
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
interfaces = 192.168.1.1/24
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Note: The bit after the / is a reference to the subnet mask. "24" is
|
||
the value to use for an unsegmented Class C network. For more
|
||
information on subnet calculations, you might want to see
|
||
http://www.ralphb.net/IPSubnet/ <http://www.ralphb.net/IPSubnet/>.
|
||
|
||
There is a lot more to Samba configuration than this, but this will
|
||
get you started. If you want to do something more advanced, I refer
|
||
you to the Samba Web site mentioned above.
|
||
|
||
|
||
|
||
8. Accessing an SMB Share With Linux Machines
|
||
|
||
Linux (UNIX) machines can also browse and mount SMB shares. Note that
|
||
this can be done whether the server is a Windows machine or a Samba
|
||
server!
|
||
|
||
An SMB client program for UNIX machines is included with the Samba
|
||
distribution. It provides an ftp-like interface on the command line.
|
||
You can use this utility to transfer files between a Windows 'server'
|
||
and a Linux client.
|
||
|
||
Most Linux distributions also now include the useful smbfs package,
|
||
which allows one to mount and umount SMB shares. More on smbfs below.
|
||
|
||
To see which shares are available on a given host, run:
|
||
|
||
|
||
______________________________________________________________________
|
||
/usr/bin/smbclient -L host
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
where 'host' is the name of the machine that you wish to view. this
|
||
will return a list of 'service' names - that is, names of drives or
|
||
printers that it can share with you. Unless the SMB server has no
|
||
security configured, it will ask you for a password. Get it the
|
||
password for the 'guest' account or for your personal account on that
|
||
machine.
|
||
|
||
For example:
|
||
|
||
|
||
______________________________________________________________________
|
||
smbclient -L zimmerman
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
The output of this command should look something like this:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
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
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
The browse list shows other SMB servers with resources to share on the
|
||
network.
|
||
|
||
To use the client, run:
|
||
|
||
______________________________________________________________________
|
||
/usr/bin/smbclient service <password>
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
where 'service' is a machine and share name. For example, if you are
|
||
trying to reach a directory that has been shared as 'public' on a
|
||
machine called zimmerman, the service would be called
|
||
\\zimmerman\public. However, due to shell restrictions, you will need
|
||
to escape the backslashes, so you end up with something like this:
|
||
|
||
|
||
______________________________________________________________________
|
||
/usr/bin/smbclient \\\\zimmerman\\public mypasswd
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
where 'mypasswd' is the literal string of your password.
|
||
|
||
You will get the smbclient prompt:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
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: \>
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Type 'h' to get help using 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: \>
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
If you can use ftp, you shouldn't need the man pages for smbclient.
|
||
|
||
Although you can use smbclient for testing, you will soon tire of it
|
||
for real work. For that you will probably want to use the smbfs
|
||
package. Smbfs comes with two simple utilties, smbmount and
|
||
smbumount. They work just like mount and umount for SMB shares.
|
||
|
||
One important thing to note: You must have smbfs support compiled
|
||
into your kernel to use these utilities!
|
||
|
||
|
||
The following shows a typical use of smbmount to mount an SMB share
|
||
called "customers" from a machine called "samba1":
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
[root@postel]# smbmount "\\\\samba1\\customers" -U rtg2t -c 'mount /customers -u 500 -g 100'
|
||
Added interface ip=192.168.35.84 bcast=192.168.255.255 nmask=255.255.0.0
|
||
Got a positive name query response from 192.168.168.158 ( 192.168.168.158 )
|
||
Server time is Tue Oct 5 10:27:36 1999
|
||
Timezone is UTC-4.0
|
||
Password:
|
||
Domain=[IPM] OS=[Unix] Server=[Samba 2.0.3]
|
||
security=user
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Issuing a mount command will now show the share mounted, just as if it
|
||
were an NFS export:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
[root@postel]# mount
|
||
/dev/hda2 on / type ext2 (rw)
|
||
none on /proc type proc (rw)
|
||
none on /dev/pts type devpts (rw,mode=622)
|
||
//SAMBA1/CUSTOMERS on /customers type smbfs (0)
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Please see the manual pages for smbmount and smbumount for details on
|
||
the above operation.
|
||
|
||
|
||
|
||
9. Sharing A Linux Printer With Windows Machines
|
||
|
||
To share a Linux printer with Windows machines, you need to make
|
||
certain that your printer is set up to work under Linux. If you can
|
||
print from Linux, setting up an SMB share of the printer is stright
|
||
forward.
|
||
|
||
Note that Windows users must have an account on the Linux/Samba server
|
||
in order to print. Windows 95/98 will attempt to authenticate to the
|
||
print server using the username and password used on login to the
|
||
Windows box.This means that if you clicked 'Cancel' when logging onto
|
||
Windows, you can't print (or connect to other SMB services)! Windows
|
||
NT allows one to explicitely provide a username and password when
|
||
connecting to a printer.
|
||
|
||
See the Printing HOWTO to set up local printing.
|
||
|
||
Add printing configuration to your 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
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Make certain that the printer path (in this case under [ljet]) matches
|
||
the spool directory in /etc/printcap!
|
||
|
||
The lines:
|
||
|
||
|
||
______________________________________________________________________
|
||
printcap name = /etc/printcap
|
||
load printers = yes
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
controls whether all the printers in /etc/printcap should be loaded by
|
||
default. If you do this, there is no reason to set up printers
|
||
individually. The section [printers] specifies options for the
|
||
printers that you wish to explicitly difine. If the printing
|
||
subsystem you are using doesn't work this way (BSD), you need to set
|
||
up a fake printcap file (or to use the 'print command' technique, see
|
||
below). For more information on the printcap system see the Printing
|
||
HOWTO.
|
||
|
||
A useful technique to test the network connection is to change the
|
||
print command to:
|
||
|
||
|
||
______________________________________________________________________
|
||
print command = cp %S /tmp/print.%P.%S
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
The resulting file can then be analyzed.
|
||
|
||
|
||
NOTE: There are some problems sharing printers on UNIX boxes with
|
||
Windows NT machines using Samba. One problem is with NT seeing the
|
||
shared printer properly. To fix this, see the notes in the Samba
|
||
distribution in the file docs/WinNT.txt. The other deals with
|
||
password problems. See the comments in the same file for an annoying
|
||
gain of understanding and failure to fix the problem.
|
||
|
||
Oleg L. Machulskiy (machulsk@shade.msu.ru) suggests that a better
|
||
print command to use in the above example would be:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
print command = smb2ps %s | lpr -r -h -P %p
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
where 'smb2ps' is a script which transforms the spool file received
|
||
from Windows into usual a usable Postscript file. It must cut off
|
||
first 3 lines and last 2 lines, because these lines contain some PJL
|
||
or PCL codes.
|
||
|
||
That approach is only needed if your Windows machine is printing PCL
|
||
and not real Postscript. I have found that Windows 95/98/NT don't
|
||
have a generic Postscript driver per se, but the "Digital turbo
|
||
Printserver 20" driver acts as a good general Postscript driver for
|
||
most setups. I have also heard that the "Apple LaserWriter II NTX"
|
||
driver works for this purpose.
|
||
|
||
If you are creating a printer spool directory instead of using one
|
||
created by a Linux distribution's installation utility, be careful of
|
||
permissions! Neil Fraser (neilf@necon.co.za) suggested setting the
|
||
permissions of the spool directory (in his case, /var/spool/lpd/lpr)
|
||
to 4755 (note the suid bit). This worked for him when the owner of
|
||
the directory was 'root' and the group was 'lp'.
|
||
|
||
Jeff Stern (jstern@eclectic.ss.uci.edu) reported that he had to set
|
||
the permissions on his spool directory to 777 in order for non-
|
||
priviledged users to print, although he notes that he could have also
|
||
added users to the 'lp' group. This is a decision for local systems
|
||
administrators; if printing security is an issue, then lock it down.
|
||
In home environments, you will probably want everyone to be able to
|
||
print.
|
||
|
||
Dr. Michael Langner (langner@fiz-chemie.de) points out that write
|
||
permission problems on the /var/spool/lpd/ tree could be avoided by
|
||
use something like "path = /tmp" and "print command = lpr -r -P%p %s"
|
||
instead.
|
||
|
||
Sometimes, a Postscript parsing error will occur with Postscript
|
||
printing from Windows machines that causes an extra page to be printed
|
||
at the end of every print job. The last page will always have "%%[
|
||
Lastpage ]%%" at the top of it. This seems to happen with Windows 95
|
||
and 98 only and is because the Postscript is malformed.
|
||
|
||
One way to handle that is to use a script to remove that bit of bad
|
||
Postscript from the spooled jobs. Another way is to try to find a
|
||
better Windows Postscript driver. Probably the best way is to us
|
||
LPRng instead of Postscript to print to a Samba server.
|
||
|
||
Erik Ratcliffe (erik@caldera.com) Caldera tells me that using LPRng
|
||
means that any printer driver can be used from Windows machines. On
|
||
the Samba server, they used an /etc/printcap entry that looked like
|
||
this:
|
||
______________________________________________________________________
|
||
raw:\
|
||
:rw:sh:
|
||
:lp=/dev/lp1
|
||
:sd=/var/spool/lpd/raw
|
||
:fx=flp
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
LPRng doesn't require :\ at the end of every line. A printer entry
|
||
will still need to be made in /etc/smb.conf for the physical printer.
|
||
The print command line needs to use the "raw" entry in /etc/printcap
|
||
and data must be sent to the printer in binary form. Try a print
|
||
command line like this:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
print command = lpr -b -Praw %s
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
You may also need to set the spooling on the Windows95 end to print
|
||
directly to the printer instead of spooling.
|
||
|
||
If you constantly get a extra page printing at the end of print jobs
|
||
from Windows clients, try adding an "sf" directive in /etc/printcap.
|
||
This will suppress form feeds separating jobs, but will not effect
|
||
form feeds within documents.
|
||
|
||
|
||
|
||
10. Sharing A Windows Printer With Linux Machines
|
||
|
||
To share a printer on a Windows machine, you must do the following:
|
||
|
||
|
||
1. You must have the proper entries in /etc/printcap and they must
|
||
correspond to the local directory structure (for the spool
|
||
directory, etc).
|
||
|
||
2. You must have the script /usr/bin/smbprint. This comes with the
|
||
Samba source, but not with all Samba binary distributions. A
|
||
slightly modifed copy is discussed below.
|
||
|
||
3. If you want to convert ASCII files to Postscript, you must have
|
||
nenscript, or its equivalent. nenscript is a Postscript converter
|
||
and is generally installed in /usr/bin.
|
||
|
||
4. You may wish to make Samba printing easier by having an easy-to-use
|
||
front end. A simple perl script to handle ASCII, Postscript or
|
||
created Postscript is given below.
|
||
|
||
5. You could also use MagicFilter to do the above. The details on
|
||
setting up MagicFilter are given below the perl script.
|
||
MagicFilter has advantages because it knows how to automatically
|
||
convert a lot of file formats.
|
||
|
||
The /etc/printcap entry below is for an HP 5MP printer on a Windows NT
|
||
host. The entries are as follows:
|
||
|
||
|
||
______________________________________________________________________
|
||
cm - comment
|
||
lp - device name to open for output
|
||
sd - the printer's spool directory (on the local machine)
|
||
af - the accounting file
|
||
mx - the maximum file size (zero is unlimited)
|
||
if - name of the input filter (script)
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
For more information, see the Printing HOWTO or the man page for
|
||
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:
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Make certain that the spool and accounting directories exist and are
|
||
writable. Ensure that the 'if' line holds the proper path to the
|
||
smbprint script (given below) and make sure that the proper device is
|
||
pointed to (the /dev special file).
|
||
|
||
Next is the smbprint script itself. It is usually placed in /usr/bin
|
||
and is attributable to Andrew Tridgell, the person who created Samba
|
||
as far as I know. It comes with the Samba source distribution, but is
|
||
absent from some binary distributions, so I have recreated it here.
|
||
|
||
You may wish to look at this carefully. There are some minor
|
||
alterations that have shown themselves to be useful.
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
#!/bin/sh -x
|
||
|
||
# This script is an input filter for printcap printing on a unix machine. It
|
||
# uses the smbclient program to print the file to the specified smb-based
|
||
# server and service.
|
||
# For example you could have a printcap entry like this
|
||
#
|
||
# smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
|
||
#
|
||
# which would create a unix printer called "smb" that will print via this
|
||
# script. You will need to create the spool directory /usr/spool/smb with
|
||
# appropriate permissions and ownerships for your system.
|
||
|
||
# Set these to the server and service you wish to print to
|
||
# In this example I have a WfWg PC called "lapland" that has a printer
|
||
# exported called "printer" with no password.
|
||
|
||
#
|
||
# Script further altered by hamiltom@ecnz.co.nz (Michael Hamilton)
|
||
# so that the server, service, and password can be read from
|
||
# a /usr/var/spool/lpd/PRINTNAME/.config file.
|
||
#
|
||
# In order for this to work the /etc/printcap entry must include an
|
||
# accounting file (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:
|
||
#
|
||
# The /usr/var/spool/lpd/PRINTNAME/.config file should contain:
|
||
# server=PC_SERVER
|
||
# service=PR_SHARENAME
|
||
# password="password"
|
||
#
|
||
# E.g.
|
||
# 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
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Most Linux distributions come with nenscript for converting ASCII
|
||
documents to Postscript. The following perl script makes life easier
|
||
be providing a simple interface to Linux printing via smbprint.
|
||
|
||
|
||
______________________________________________________________________
|
||
Usage: print [-a|c|p] <filename>
|
||
-a prints <filename> as ASCII
|
||
-c prints <filename> formatted as source code
|
||
-p prints <filename> as Postscript
|
||
If no switch is given, print attempts to
|
||
guess the file type and print appropriately.
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Using smbprint to print ASCII files tends to truncate long lines.
|
||
This script breaks long lines on whitespace (instead of in the middle
|
||
of a word), if possible.
|
||
|
||
The source code formatting is done with nenscript. It takes an ASCII
|
||
file and foramts it in 2 columns with a fancy header (date, filename,
|
||
etc). It also numbers the lines. Using this as an example, other
|
||
types of formatting can be accomplished.
|
||
|
||
Postscript documents are already properly formatted, so they pass
|
||
through directly.
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
#!/usr/bin/perl
|
||
|
||
# Script: print
|
||
# Authors: Brad Marshall, David Wood
|
||
# Plugged In Communications
|
||
# Date: 960808
|
||
#
|
||
# Script to print to a Postscript printer via Samba.
|
||
# Purpose: Takes files of various types as arguments and
|
||
# processes them appropriately for piping to a Samba print script.
|
||
#
|
||
# Currently supported file types:
|
||
#
|
||
# ASCII - ensures that lines longer than $line_length characters wrap on
|
||
# whitespace.
|
||
# Postscript - Takes no action.
|
||
# Code - Formats in Postscript (using nenscript) to display
|
||
# properly (landscape, font, etc).
|
||
#
|
||
|
||
# Set the maximum allowable length for each line of ASCII text.
|
||
$line_length = 76;
|
||
|
||
# Set the path and name of the Samba print script
|
||
$print_prog = "/usr/bin/smbprint";
|
||
|
||
# Set the path and name to nenscript (the ASCII-->Postscript converter)
|
||
$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 "
|
||
Usage: print [-a|c|p] <filename>
|
||
-a prints <filename> as ASCII
|
||
-c prints <filename> formatted as source code
|
||
-p prints <filename> as Postscript
|
||
If no switch is given, print attempts to
|
||
guess the file type and print appropriately.\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);
|
||
}
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Now the MagicFilter way. Thanks to Alberto Menegazzi
|
||
(flash.egon@iol.it) for this information.
|
||
|
||
Alberto says:
|
||
|
||
-------------------------------------------------------------- 1)
|
||
Install MagicFilter with the filter for the printers you need in
|
||
/usr/bin/local but DON'T fill /etc/printcap with the suggestion given
|
||
by the documentation from MagicFilter.
|
||
|
||
2) Write the /etc/printcap like this way (it's done for my 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:
|
||
|
||
You should explain that the lp=/dev/... is opened for locking so
|
||
"virtual" devices one for every remote printer should be used.
|
||
|
||
Example creating with : touch /dev/ljet4l
|
||
|
||
|
||
3) Write the filter /usr/local/bin/main-filter the same you suggest
|
||
using the ljet4l-filter instead of cat.
|
||
|
||
Here's mine.
|
||
|
||
#! /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. : here is the quote from the Print2Win mini-Howto about locking
|
||
and why creating virtual printers
|
||
|
||
---Starts here
|
||
|
||
Hint from 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
|
||
|
||
--------------------------------------------------------------
|
||
|
||
|
||
|
||
11. Backing Up Windows Machines to a Linux Host
|
||
|
||
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".
|
||
|
||
Another Windows backup script, contributed by Dan Tager
|
||
(dtager@marsala.com), is provided below. Dan's script also backs up
|
||
Unix machines via rsh, although that could be modified to use ssh
|
||
rather easily.
|
||
|
||
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
|
||
###########
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
Here's Dan's backup script:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
#!/bin/bash
|
||
|
||
BACKDIR=3D/backup
|
||
WINCMD=3D/usr/bin/smbclient
|
||
|
||
function CopyWinHost(){
|
||
|
||
# tars and gzips "windows shares" to a local directory using samba's
|
||
# smbclient
|
||
# argument 1 is the remote host window's host name
|
||
# argument 2 is the share name to be backed up
|
||
|
||
echo $1,$2,$3
|
||
REMOTE=3D$1
|
||
SHARE=3D$2
|
||
DEST=3D$3
|
||
|
||
# create a tarred gzip file using samba to copy direct from a
|
||
# windows pc
|
||
# 12345 is a password. Needs some password even if not defined on
|
||
# remote system
|
||
$WINCMD \\\\$REMOTE\\$SHARE 12345 -Tc -|gzip > $DEST
|
||
echo `date`": Done backing up "$REMOTE" to "$DEST
|
||
echo
|
||
}
|
||
|
||
function CopyUnixHost(){
|
||
|
||
# tars and gzips a directory using rsh
|
||
# argument 1 is the name of the remote source host
|
||
# argument 2 is the full path to the remote source directory
|
||
# argument 3 is the name of the local tar-gzip file. day of week
|
||
# plus .tgz will be appended to argument 3
|
||
|
||
REMOTE=3D$1
|
||
SRC=3D$2
|
||
DEST=3D$3
|
||
|
||
|
||
if rsh $REMOTE tar -cf - $SRC |gzip > $DEST; then
|
||
echo `date`": Done backing up "$REMOTE":"$SRC" to "$DEST
|
||
else
|
||
echo `date`": Error backing up "$REMOTE":"$SRC" to "$DEST
|
||
fi
|
||
|
||
}
|
||
|
||
# $1: win=3Dbackup windows machine, unix=3Dbackup unix machine
|
||
case $1 in
|
||
win)
|
||
# $2=3D remote windows name, $3=3Dremote share name,
|
||
# $4=3Dlocal destination directory
|
||
CopyWinHost $2 $3 $4;;
|
||
unix)
|
||
# $2 =3D remote host, $3 =3D remote directory,
|
||
# $4 =3D destination name
|
||
CopyUnixHost $2 $3 $4;;
|
||
esac
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
12. Using Samba Across Routed Networks
|
||
|
||
Andrew Tridgell states that SMB host browsing across routers is
|
||
problematic. Here are his suggestions to allow this:
|
||
|
||
-------------------------------------------------------------- For
|
||
cross-subnet (ie. routed) browsing you should do the following. There
|
||
are other methods but they are much more complex are error prone:
|
||
|
||
1) all computers that you want visible should use a single WINS server
|
||
(Samba or NT can do this)
|
||
|
||
2) the master browser for each subnet must be either NT or Samba.
|
||
(Win9X doesn't communicate cross-subnet browse info correctly)
|
||
|
||
3) You should use the same workgroup name on all subnets. This is not
|
||
strictly necessary but it is the simplest way to guarantee success. If
|
||
you can't arrange this then you must organise for a way for browse
|
||
info to propogate between subnets. (It does *not* propogate via WINS).
|
||
It propogates via two mechanisms: i) each browse master notices
|
||
workgroup announcements from other browse masters on the same
|
||
broadcast domain ii) each non-Win9X browse master contacts the global
|
||
DMB for the workgroup (typically the domain controller or a Samba box
|
||
marked as the domain master) and swaps full browse info periodically.
|
||
--------------------------------------------------------------
|
||
|
||
Also, Rakesh Bharania points out that Cisco routers can be configured
|
||
to forward SMB traffic in a way that allows browsing. His suggestion
|
||
is to configure the router interface which hosts SMB clients with a
|
||
command like this:
|
||
|
||
|
||
|
||
______________________________________________________________________
|
||
ip helper-address x.x.x.x
|
||
______________________________________________________________________
|
||
|
||
|
||
|
||
where x.x.x.x is the IP address of the SMB server.
|
||
|
||
|
||
|
||
13. Acknowledgements
|
||
|
||
Special thanks to Andrew Tridgell (tridge@linuxcare.com) for starting
|
||
and directing the Samba project and for keeping this document honest.
|
||
|
||
Brad Marshall (bmarshall@plugged.net.au) and Jason Parker
|
||
(jparker@plugged.net.au) contributed time, patience, scripting and
|
||
research.
|
||
|
||
Adam Neat (adamneat@ipax.com.au) and Dan Tager (dtager@marsala.com)
|
||
contributed the bash scripts used to back up Windows machines to a
|
||
Linux host.
|
||
|
||
Matthew Flint () told me about the use of the 'interfaces' option in
|
||
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) suggested
|
||
modifications to the section on Sharing A Linux Printer With Windows
|
||
Machines.
|
||
|
||
Alberto Menegazzi (flash.egon@iol.it) contributed the MagicFilter
|
||
setup to enable a Linux machine to share a Windows printer.
|
||
|
||
Rakesh Bharania (rbharani@cisco.com) contributed the suggestion for
|
||
Cisco router configuration.
|
||
|
||
Rich Gregory (rtg2t@virginia.edu) and others suggested that this
|
||
document show some details about the smbfs package and its use.
|
||
|
||
Andrea Girotto (icarus@inca.dei.unipd.it) contributed a number of
|
||
valuable suggestions throughout the document.
|
||
|
||
Thanks, also, to all of the international translators that have
|
||
brought this HOWTO to the non-English speaking world: Takeo Nakano
|
||
(nakano@apm.seikei.ac.jp), Klaus-Dieter Schumacher (Klaus-
|
||
Dieter.Schumacher@fernuni-hagen.de), Andrea Girotto
|
||
(icarus@inca.dei.unipd.it), Mathieu Arnold (arn_mat@club-internet.fr),
|
||
Stein Oddvar Rasmussen (Stein@kongsberg-energi.no) Nilo Menezes
|
||
(nmenezes@n3.com.br) and many others for whom I don't have contact
|
||
details.
|
||
|
||
|
||
|