home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 August / PCWorld_1999-08_cd.bin / doc / HOWTO / SMB-HOWTO < prev    next >
Text File  |  1999-06-04  |  59KB  |  1,783 lines

  1.   SMB HOWTO
  2.   David Wood, dwood@plugged.net.au
  3.   v1.1, 25 March 1999
  4.  
  5.   This is the SMB HOWTO.  This document describes how to use the Server
  6.   Message Block (SMB) protocol, also called the Session Message Block,
  7.   NetBIOS or LanManager protocol, with Linux.
  8.   ______________________________________________________________________
  9.  
  10.   Table of Contents
  11.  
  12.  
  13.   1. Introduction
  14.  
  15.   2. Further Information
  16.  
  17.   3. Installation
  18.  
  19.   4. Running The Daemons
  20.  
  21.   5. General Configuration (/etc/smb.conf)
  22.  
  23.   6. Sharing A Linux Drive With Windows Machines
  24.  
  25.   7. Sharing A Windows Drive With Linux Machines
  26.  
  27.   8. Sharing A Linux Printer With Windows Machines
  28.  
  29.   9. Sharing A Windows Printer With Linux Machines
  30.  
  31.   10. Backing Up Windows Machines to a Linux Host
  32.  
  33.   11. Copyright
  34.  
  35.   12. Acknowledgements
  36.  
  37.  
  38.  
  39.   ______________________________________________________________________
  40.  
  41.   1.  Introduction
  42.  
  43.   This is the SMB HOWTO.  This document describes how to use the Server
  44.   Message Block (SMB) protocol, also called the Session Message Block,
  45.   NetBIOS or LanManager protocol, with Linux.  Although this document is
  46.   Linux-centric, Samba runs on most Unix-like operating systems.
  47.  
  48.   This document is maintained by David Wood (dwood@plugged.net.au).
  49.   Additions, modifications or corrections may be mailed there for
  50.   inclusion in the next release.
  51.  
  52.   Much more Samba documentation is available at the Samba Web site,
  53.   located at http://www.samba.org/ <http://www.samba.org/>.  You also
  54.   might try the comp.protocols.smb newsgroup.
  55.  
  56.   The SMB protocol is used by Microsoft Windows 3.11, NT and 95/98 to
  57.   share disks and printers.  Using the Samba suite of tools by Andrew
  58.   Tridgell (Andrew.Tridgell@anu.edu.au), UNIX (including Linux) machines
  59.   can share disk and printers with Windows hosts.  The smbfs tools by
  60.   Paal-Kr. Engstad (pke@engstad.ingok.hitos.no) and Volker Lendecke
  61.   (lendecke@namu01.gwdg.de) enable Unix machines to mount SMB shares
  62.   from Windows or Samba hosts.
  63.  
  64.   There are four things that one can do with Samba:
  65.  
  66.  
  67.   1. Share a Linux drive with Windows machines.
  68.  
  69.   2. Share a Windows drive with Linux machines.
  70.  
  71.   3. Share a Linux printer with Windows machines.
  72.  
  73.   4. Share a Windows printer with Linux machines.
  74.  
  75.   All of these are covered in this document.
  76.  
  77.   Disclaimer: The procedures and scripts either work for the author or
  78.   have been reported to work by the people that provided them.
  79.   Different configurations may not work with the information given here.
  80.   If you encounter such a situation, you may e-mail the author with
  81.   suggestions for improvement in this document, but the author
  82.   guarantees nothing.  What did you expect?  The author is, after all, a
  83.   consultant...
  84.  
  85.   Please note that for Windows 3.x machines to access SMB shares, they
  86.   must have a TCP/IP stack and the Win32s DLLs.  Both of these are
  87.   available on Microsoft's Web site (http://www.microsoft.com
  88.   <http://www.microsoft.com>).
  89.  
  90.  
  91.   2.  Further Information
  92.  
  93.   This HOWTO attempts to explain how to configure basic SMB file and
  94.   print services on a Linux machine.  Samba is a very complex and
  95.   complete package.  There would be no point in attempting to duplicate
  96.   all of the documentation for Samba here.
  97.  
  98.   For further information, please see the following documents:
  99.  
  100.   ╖  The Samba documentation, available as part of the Samba
  101.      distribution.  The distribution is available at:
  102.      ftp://ftp.samba.org/ <ftp://ftp.samba.org/>
  103.  
  104.   ╖  The Linux Printing HOWTO.
  105.  
  106.   ╖  The Print2Win Mini-HOWTO.
  107.  
  108.   ╖  Protocol Standard For A NetBIOS Service On A TCP/UDP Transport.
  109.  
  110.      RFC 1001
  111.         Concepts and Methods.
  112.  
  113.      RFC 1002
  114.         Detailed Specifications.
  115.  
  116.  
  117.  
  118.   3.  Installation
  119.  
  120.   First, in order to use Samba your machines must be on a single
  121.   ethernet LAN segment using the TCP/IP protocol.  Samba will not work
  122.   using other network protocols.  This is generally easy since Linux and
  123.   Windows 95/98/NT ship with TCP/IP support.  However, if you are using
  124.   Windows 3.X machines TCP/IP support will need to be added.
  125.  
  126.   SMB services cannot be used across routers.  If you want to do
  127.   something like that, you would need to set up an IP tunnel which is
  128.   beyond the scope of this document.
  129.  
  130.   To get the latest source version of Samba, go to this URL and pick the
  131.   closest mirror site to you: ftp://ftp.samba.org/
  132.   <ftp://ftp.samba.org/>.
  133.   However, if you have installed the RedHat distribution of Linux, you
  134.   have the option of installing it as a package.  Some other
  135.   distributions also include the Samba binaries.
  136.  
  137.   The following two daemons are required for the Samba package.  They
  138.   are typically installed in /usr/sbin and run either on boot from the
  139.   systems startup scripts or from inetd.  Example scripts are shown in
  140.   ``Running the Daemons''.
  141.  
  142.  
  143.   ______________________________________________________________________
  144.           smbd (The SMB daemon)
  145.           nmbd (Provides NetBIOS nameserver support to clients)
  146.   ______________________________________________________________________
  147.  
  148.  
  149.  
  150.   Please note that the name service provided by the nmbd daemon is
  151.   different from the name service provided by the Domain Name Service
  152.   (DNS).  NetBIOS name service is a 'Windows-style' name service used
  153.   for SMB.  In other words, having DNS name service tells you nothing
  154.   about the state of the ability for Samba to resolve host names.
  155.  
  156.   Typically, the following Samba binaries are installed in /usr/bin or
  157.   /usr/local/samba/bin, although the location is optional.
  158.  
  159.  
  160.   ______________________________________________________________________
  161.           smbclient       (An SMB client for UNIX machines)
  162.           smbprint        (A script to print to a printer on an SMB host)
  163.           smbprint.sysv   (As above, but for SVR4 UNIX machines)
  164.           smbstatus       (Lists the cuurent SMB connections for the local host)
  165.           smbrun          (A 'glue' script to facilitate runnning applciations
  166.                            on SMB hosts)
  167.   ______________________________________________________________________
  168.  
  169.  
  170.  
  171.   The binaries for smbfs file system support are discussed later in this
  172.   document.
  173.  
  174.   Additionally, a script called 'print' is included with this HOWTO,
  175.   which serves as a useful front end to the smbprint script.
  176.  
  177.   The Samba package is simple to install.  Simply retrieve the source
  178.   from the location mentioned above, and read the file README in the
  179.   distribution.  There is also a file called docs/INSTALL.txt in the
  180.   distribution that provides a simple step-by-step set of instructions.
  181.  
  182.   Following installation, place the daemons in /usr/sbin and the
  183.   binaries in /usr/bin.  Install the man pages in /usr/local/man.
  184.  
  185.   When you made the Samba package, you would have specified in the
  186.   Makefile the location for the configuration file, smb.conf.  This is
  187.   generally in /etc, but you can put it anywhere you like.  For these
  188.   directions, we will presume that you specified the location of the
  189.   configuration file as /etc/smb.conf, the log file location as log file
  190.   = /var/log/samba-log.%m and the lock directory as lock directory =
  191.   /var/lock/samba.
  192.  
  193.   Install the configuration file, smb.conf.  Go to the directory where
  194.   Samba was built.  Look in the subdirectory examples/simple and read
  195.   the file README.  Copy the file smb.conf found in that directory to
  196.   /etc.  BE CAREFUL!  If you have a Linux distribution that already has
  197.   Samba installed, you may already have a Samba configuration file in
  198.   /etc.  You should probably start with that one.
  199.   If you don't want to have your configuration file in /etc, put it
  200.   wherever you want to, then put a symlink in /etc:
  201.  
  202.  
  203.   ______________________________________________________________________
  204.           ln -s /path/to/smb.conf /etc/smb.conf
  205.   ______________________________________________________________________
  206.  
  207.  
  208.  
  209.  
  210.   4.  Running The Daemons
  211.  
  212.   The two SMB daemons are /usr/sbin/smbd and /usr/sbin/nmbd.
  213.  
  214.   You can run the Samba daemons from inetd or as stand-alone processes.
  215.   Samba will respond slightly faster as a standalone daemon than running
  216.   from inetd.
  217.  
  218.   In either case, you should check the file /etc/services for lines that
  219.   look like this:
  220.  
  221.  
  222.  
  223.        ______________________________________________________________________
  224.        netbios-ns      137/tcp         nbns
  225.        netbios-ns      137/udp         nbns
  226.        netbios-dgm     138/tcp         nbdgm
  227.        netbios-dgm     138/udp         nbdgm
  228.        netbios-ssn     139/tcp         nbssn
  229.        ______________________________________________________________________
  230.  
  231.  
  232.  
  233.  
  234.   Make sure they are all uncommented.  Depending on your distribution,
  235.   you may even need to add them.   Samba will not be able to bind to the
  236.   appropriate ports unless /etc/services has these entries.
  237.  
  238.   To run the daemons from inetd, place the following lines in the inetd
  239.   configuration file, /etc/inetd.conf:
  240.  
  241.  
  242.  
  243.        ______________________________________________________________________
  244.            # SAMBA NetBIOS services (for PC file and print sharing)
  245.            netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd
  246.            netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd
  247.        ______________________________________________________________________
  248.  
  249.  
  250.  
  251.  
  252.   Then restart the inetd daemon by running the command:
  253.  
  254.  
  255.   ______________________________________________________________________
  256.       kill -HUP `cat /var/run/inetd.pid`
  257.   ______________________________________________________________________
  258.  
  259.  
  260.  
  261.   To run the daemons from the system startup scripts, put the following
  262.   script in file called /etc/rc.d/init.d/smb (for a RedHat distribution)
  263.   and symbolically link it to the files specified in the comments:
  264.  
  265.        ______________________________________________________________________
  266.            #!/bin/sh
  267.  
  268.            #
  269.            # /etc/rc.d/init.d/smb - starts and stops SMB services.
  270.            #
  271.            # The following files should be synbolic links to this file:
  272.            # symlinks: /etc/rc.d/rc1.d/K35smb  (Kills SMB services on shutdown)
  273.            #           /etc/rc.d/rc3.d/S91smb  (Starts SMB services in multiuser mode)
  274.            #           /etc/rc.d/rc6.d/K35smb  (Kills SMB services on reboot)
  275.            #
  276.  
  277.            # Source function library.
  278.            . /etc/rc.d/init.d/functions
  279.  
  280.            # Source networking configuration.
  281.            . /etc/sysconfig/network
  282.  
  283.            # Check that networking is up.
  284.            [ ${NETWORKING} = "no" ] && exit 0
  285.  
  286.            # See how we were called.
  287.            case "$1" in
  288.              start)
  289.                echo -n "Starting SMB services: "
  290.                daemon smbd -D
  291.                daemon nmbd -D
  292.                echo
  293.                touch /var/lock/subsys/smb
  294.                ;;
  295.              stop)
  296.                echo -n "Shutting down SMB services: "
  297.                killproc smbd
  298.                killproc nmbd
  299.                rm -f /var/lock/subsys/smb
  300.                echo ""
  301.                ;;
  302.              *)
  303.                echo "Usage: smb {start|stop}"
  304.                exit 1
  305.            esac
  306.        ______________________________________________________________________
  307.  
  308.  
  309.  
  310.  
  311.   If when starting Samba you get an error that says something about the
  312.   daemon failing to bind to port 139, then you probably have another
  313.   Samba process already running that hasn't yet shut down.  Check a
  314.   process list (with 'ps auxww | grep mbd') to determine if another
  315.   Samba service is running.
  316.  
  317.  
  318.  
  319.   5.  General Configuration (/etc/smb.conf)
  320.  
  321.   Samba configuration on a Linux (or other UNIX machine) is controlled
  322.   by a single file, /etc/smb.conf.  This file determines which system
  323.   resources you want to share with the outside world and what
  324.   restrictions you wish to place on them.
  325.  
  326.   Since the following sections will address sharing Linux drives and
  327.   printers with Windows machines, the smb.conf file shown in this
  328.   section is as simple as you can get, just for introductory purposes.
  329.  
  330.  
  331.   Don't worry about the details, yet.  Later sections will introduce the
  332.   major concepts.
  333.  
  334.   Each section of the file starts with a section header such as
  335.   [global], [homes], [printers], etc.
  336.  
  337.   The [global] section defines a few variables that Samba will use to
  338.   define sharing for all resources.
  339.  
  340.   The [homes] section allows a remote users to access their (and only
  341.   their) home directory on the local (Linux) machine).  That is, users
  342.   trying to connect to this share from Windows machines, will be
  343.   connected to their personal home directories.  Note that to do this,
  344.   they must have an account on the Linux box.
  345.  
  346.   The sample smb.conf file below allows remote users to get to their
  347.   home directories on the local machine and to write to a temporary
  348.   directory.  For a Windows user to see these shares, the Linux box has
  349.   to be on the local network.  Then the user simply connects a network
  350.   drive from the Windows File Manager or Windows Explorer.
  351.  
  352.   Note that in the following sections, additional entries for this file
  353.   will be given to allow more resources to be shared.
  354.  
  355.  
  356.  
  357.        ______________________________________________________________________
  358.        ; /etc/smb.conf
  359.        ;
  360.        ; Make sure and restart the server after making changes to this file, ex:
  361.        ; /etc/rc.d/init.d/smb stop
  362.        ; /etc/rc.d/init.d/smb start
  363.  
  364.        [global]
  365.        ; Uncomment this if you want a guest account
  366.        ; guest account = nobody
  367.           log file = /var/log/samba-log.%m
  368.           lock directory = /var/lock/samba
  369.           share modes = yes
  370.  
  371.        [homes]
  372.           comment = Home Directories
  373.           browseable = no
  374.           read only = no
  375.           create mode = 0750
  376.  
  377.        [tmp]
  378.           comment = Temporary file space
  379.           path = /tmp
  380.           read only = no
  381.           public = yes
  382.        ______________________________________________________________________
  383.  
  384.  
  385.  
  386.  
  387.   Having written a new smb.conf, it is useful to test it to verify its
  388.   correctness.  You can test the correctness of a smb.conf file , using
  389.   the 'testparm' utility (man page: testparm); if testparm reports no
  390.   problems, smbd will correctly load the configuration file.
  391.  
  392.   Here's a good trick:  If your Samba server has more than one ethernet
  393.   interface, the smbd may bind to the wrong one.  If so, you can force
  394.   it to bind to the intended one by adding a line that looks like this
  395.   to the [global] section of /etc/smb.conf:
  396.  
  397.   There is now a GUI configuration tool for Samba:  GtkSamba.  See
  398.   http://www.open-systems.com/gtksamba.html <http://www.open-
  399.   systems.com/gtksamba.html>.
  400.  
  401.  
  402.  
  403.   6.  Sharing A Linux Drive With Windows Machines
  404.  
  405.   As shown in the simple smb.conf above, sharing Linux drives with
  406.   Windows users is easy.  However, like everything else with Samba, you
  407.   can control things to a large degree.  Here are some examples:
  408.  
  409.   To share a directory with the public, create a clone of the [tmp]
  410.   section above by adding something like this to smb.conf:
  411.  
  412.  
  413.  
  414.        ______________________________________________________________________
  415.        [public]
  416.           comment = Public Stuff
  417.           path = /home/public
  418.           public = yes
  419.           writable = yes
  420.           printable = no
  421.        ______________________________________________________________________
  422.  
  423.  
  424.  
  425.  
  426.   To make the above directory readable by the public, but only writable
  427.   by people in group staff, modify the entry like this:
  428.  
  429.  
  430.  
  431.        ______________________________________________________________________
  432.        [public]
  433.           comment = Public Stuff
  434.           path = /home/public
  435.           public = yes
  436.           writable = yes
  437.           printable = no
  438.           write list = @staff
  439.        ______________________________________________________________________
  440.  
  441.  
  442.  
  443.  
  444.   It used to be that easy; you would now be able to start Samba and
  445.   browse the shares from a Windows PC.  However, Microsoft has recently
  446.   made life slightly more difficult for those using Samba.  Windows 98,
  447.   Windows NT (service pack 3 or higher) and later builds of Windows 95
  448.   now use encrypted passwords by default.  Samba uses unencrypted
  449.   passwords by default.  You can't browse servers when either the client
  450.   or server is using encrypted passwords, because a connection cannot be
  451.   made anonymously.
  452.  
  453.   You can tell if you have a password type mismatch between client and
  454.   server if when you try to connect to a share you see a dialog box
  455.   which reads something like "You are not authorized to access that
  456.   account from this machine".
  457.  
  458.   You can either configure your Samba server to use encrypted passwords,
  459.   or configure the Windows machines to use unencrypted passwords.
  460.  
  461.   To get Windows to work with encrypted SMB passwords:
  462.  
  463.   Windows 95/98 =============
  464.  
  465.   Using the registry editor (regedit), create the registry setting
  466.   HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\VNETSUP Add a
  467.   new DWORD value: Value Name:  EnablePlainTextPassword Data:
  468.   0x01.
  469.  
  470.   Windows NT ==========
  471.  
  472.   Using the registry editor (regedit), create the registry setting
  473.   HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rdr\Parameters
  474.   Add a new DWORD value: Value Name:  EnablePlainTextPassword Data:
  475.   0x01
  476.  
  477.   Once these registry changes have been made, reboot the Windows machine
  478.   and try to map a network drive on the Samba server again.  It should
  479.   work as long as the Samba server is using plain text passwords.
  480.  
  481.   To configure Samba to use encrypted passwords:
  482.  
  483.   In the [global] section of /etc/smb.conf, add the following lines:
  484.  
  485.  
  486.  
  487.        ______________________________________________________________________
  488.        encrypt passwords = yes
  489.        smb passwd file = /etc/smbpasswd
  490.        ______________________________________________________________________
  491.  
  492.  
  493.  
  494.  
  495.   You are highly encouraged to read the files ENCRYPTION.txt, Win95.txt
  496.   and WinNT.txt in the Samba documentation before doing this!
  497.  
  498.   If your clients and server are using encrypted passwords, you will not
  499.   be able to browse the available shares on the server until an initial
  500.   connection has been made with the appropriate authentication.  To get
  501.   the initial connection, enter the share name manually in the Windows
  502.   File Manager or Explorer dialog box, in the form
  503.   '\\<hostname>\<sharename>'.  Log onto the server with a username and
  504.   password that is valid on the server!
  505.  
  506.   If you suspect that your NetBIOS name service is not correctly
  507.   configured (perhaps because you get 'host not found' errors when
  508.   trying to connect), try using just the IP address of the server:
  509.   '\\<host ip address>\<sharename>'.
  510.  
  511.   In order to get filenames to appear correctly, you may also need to
  512.   set some options in the appropriate share section.  These work for
  513.   Windows 95/98/NT clients, but may need to be modified if you have
  514.   Windows 3.X clients:
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.   ______________________________________________________________________
  530.       ; Mangle case = yes seems to give the correct filenames
  531.       ; for Win95/98/NT.
  532.       mangle case = yes
  533.  
  534.       ; If samba is case sensitive when looking for files
  535.       case sensitive = no
  536.  
  537.       ; Default case of files that are created
  538.       default case = lower
  539.  
  540.       ; Preserve case for all filenames
  541.       preserve case = yes
  542.  
  543.       ; Preserve case for dos (8.3) filenames
  544.       short preserve case = no
  545.   ______________________________________________________________________
  546.  
  547.  
  548.  
  549.  
  550.   For other tricks to play with drive shares, see the Samba
  551.   documentation or man pages.
  552.  
  553.  
  554.  
  555.  
  556.        ______________________________________________________________________
  557.        interfaces = 192.168.1.1/24
  558.        ______________________________________________________________________
  559.  
  560.  
  561.  
  562.  
  563.   Note:  The bit after the / is a reference to the subnet mask.  "24" is
  564.   the value to use for an unsegmented Class C network.  For more
  565.   information on subnet calculations, you might want to see
  566.   http://www.ziplink.net/~ralphb/IPSubnet/index.html
  567.   <http://www.ziplink.net/~ralphb/IPSubnet/index.html>.
  568.  
  569.   There is a lot more to Samba configuration than this, but this will
  570.   get you started.  If you want to do something more advanced, I refer
  571.   you to the Samba Web site mentioned above.
  572.  
  573.  
  574.  
  575.   7.  Sharing A Windows Drive With Linux Machines
  576.  
  577.   An SMB client program for UNIX machines is included with the Samba
  578.   distribution.  It provides an ftp-like interface on the command line.
  579.   You can use this utility to transfer files between a Windows 'server'
  580.   and a Linux client.
  581.  
  582.   To see which shares are available on a given host, run:
  583.  
  584.  
  585.   ______________________________________________________________________
  586.       /usr/sbin/smbclient -L host
  587.   ______________________________________________________________________
  588.  
  589.  
  590.  
  591.   where 'host' is the name of the machine that you wish to view.  this
  592.   will return a list of 'service' names - that is, names of drives or
  593.   printers that it can share with you.  Unless the SMB server has no
  594.   security configured, it will ask you for a password.  Get it the
  595.   password for the 'guest' account or for your personal account on that
  596.   machine.
  597.  
  598.   For example:
  599.  
  600.  
  601.   ______________________________________________________________________
  602.       smbclient -L zimmerman
  603.   ______________________________________________________________________
  604.  
  605.  
  606.  
  607.   The output of this command should look something like this:
  608.  
  609.  
  610.  
  611.        ______________________________________________________________________
  612.        Server time is Sat Aug 10 15:58:27 1996
  613.        Timezone is UTC+10.0
  614.        Password:
  615.        Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]
  616.  
  617.        Server=[ZIMMERMAN] User=[] Workgroup=[WORKGROUP] Domain=[]
  618.  
  619.                Sharename      Type      Comment
  620.                ---------      ----      -------
  621.                ADMIN$         Disk      Remote Admin
  622.                public         Disk      Public
  623.                C$             Disk      Default share
  624.                IPC$           IPC       Remote IPC
  625.                OReilly        Printer   OReilly
  626.                print$         Disk      Printer Drivers
  627.  
  628.  
  629.        This machine has a browse list:
  630.  
  631.                Server               Comment
  632.                ---------            -------
  633.                HOPPER               Samba 1.9.15p8
  634.                KERNIGAN             Samba 1.9.15p8
  635.                LOVELACE             Samba 1.9.15p8
  636.                RITCHIE              Samba 1.9.15p8
  637.                ZIMMERMAN
  638.        ______________________________________________________________________
  639.  
  640.  
  641.  
  642.  
  643.   The browse list shows other SMB servers with resources to share on the
  644.   network.
  645.  
  646.   To use the client, run:
  647.  
  648.  
  649.   ______________________________________________________________________
  650.       /usr/sbin/smbclient service <password>
  651.   ______________________________________________________________________
  652.  
  653.  
  654.  
  655.   where 'service' is a machine and share name.  For example, if you are
  656.   trying to reach a directory that has been shared as 'public' on a
  657.   machine called zimmerman, the service would be called
  658.   \\zimmerman\public.  However, due to shell restrictions, you will need
  659.   to escape the backslashes, so you end up with something like this:
  660.  
  661.   ______________________________________________________________________
  662.       /usr/sbin/smbclient \\\\zimmerman\\public mypasswd
  663.   ______________________________________________________________________
  664.  
  665.  
  666.  
  667.   where 'mypasswd' is the literal string of your password.
  668.  
  669.   You will get the smbclient prompt:
  670.  
  671.  
  672.  
  673.        ______________________________________________________________________
  674.        Server time is Sat Aug 10 15:58:44 1996
  675.        Timezone is UTC+10.0
  676.        Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]
  677.        smb: \>
  678.        ______________________________________________________________________
  679.  
  680.  
  681.  
  682.  
  683.   Type 'h' to get help using smbclient:
  684.  
  685.  
  686.  
  687.        ______________________________________________________________________
  688.        smb: \> h
  689.        ls             dir            lcd            cd             pwd
  690.        get            mget           put            mput           rename
  691.        more           mask           del            rm             mkdir
  692.        md             rmdir          rd             prompt         recurse
  693.        translate      lowercase      print          printmode      queue
  694.        cancel         stat           quit           q              exit
  695.        newer          archive        tar            blocksize      tarmode
  696.        setmode        help           ?              !
  697.        smb: \>
  698.        ______________________________________________________________________
  699.  
  700.  
  701.  
  702.  
  703.   If you can use ftp, you shouldn't need the man pages for smbclient.
  704.  
  705.   Although you can use smbclient for testing, you will soon tire of it
  706.   for real work.  For that you will probably want to use the smbfs
  707.   package.  Smbfs comes with two simple utilties, smbmount and
  708.   smbumount.  They work just like mount and umount for SMB shares.
  709.  
  710.   The smbfs package is now included in most Linux distributions.  One
  711.   important thing to note:  You must have smbfs support compiled into
  712.   your kernel to use these utilities!
  713.  
  714.  
  715.  
  716.   8.  Sharing A Linux Printer With Windows Machines
  717.  
  718.   To share a Linux printer with Windows machines, you need to make
  719.   certain that your printer is set up to work under Linux.  If you can
  720.   print from Linux, setting up an SMB share of the printer is stright
  721.   forward.
  722.  
  723.   See the Printing HOWTO to set up local printing.
  724.  
  725.   Since the author used a printer connected to a Windows NT machine (a
  726.   long time ago - before converting our network nearly totally to
  727.   Linux), this section should not be taken as definitive, but merely a
  728.   suggestion.  Anyone with details to share, please send them to
  729.   dwood@plugged.net.au so this section can be completed.
  730.  
  731.   Add printing configuration to your smb.conf:
  732.  
  733.  
  734.  
  735.        ______________________________________________________________________
  736.        [global]
  737.           printing = bsd
  738.           printcap name = /etc/printcap
  739.           load printers = yes
  740.           log file = /var/log/samba-log.%m
  741.           lock directory = /var/lock/samba
  742.  
  743.        [printers]
  744.           comment = All Printers
  745.           security = server
  746.           path = /var/spool/lpd/lp
  747.           browseable = no
  748.           printable = yes
  749.           public = yes
  750.           writable = no
  751.           create mode = 0700
  752.  
  753.        [ljet]
  754.           security = server
  755.           path = /var/spool/lpd/lp
  756.           printer name = lp
  757.           writable = yes
  758.           public = yes
  759.           printable = yes
  760.           print command = lpr -r -h -P %p %s
  761.        ______________________________________________________________________
  762.  
  763.  
  764.  
  765.  
  766.   Make certain that the printer path (in this case under [ljet]) matches
  767.   the spool directory in /etc/printcap!
  768.  
  769.   The lines:
  770.  
  771.  
  772.   ______________________________________________________________________
  773.      printcap name = /etc/printcap
  774.      load printers = yes
  775.   ______________________________________________________________________
  776.  
  777.  
  778.  
  779.   controls whether all the printers in /etc/printcap should be loaded by
  780.   default.  If you do this, there is no reason to set up printers
  781.   individually.  The section [printers] specifies options for the
  782.   printers that you wish to explicitly difine.  If the printing
  783.   subsystem you are using doesn't work this way (BSD), you need to set
  784.   up a fake printcap file (or to use the 'print command' technique, see
  785.   below).  For more information on the printcap system see the Printing
  786.   HOWTO.
  787.  
  788.   A useful technique to test the network connection is to change the
  789.   print command to:
  790.  
  791.  
  792.  
  793.   ______________________________________________________________________
  794.      print command = cp %S /tmp/print.%P.%S
  795.   ______________________________________________________________________
  796.  
  797.  
  798.  
  799.   The resulting file can then be analyzed.
  800.  
  801.   NOTE:  There are some problems sharing printers on UNIX boxes with
  802.   Windows NT machines using Samba.  One problem is with NT seeing the
  803.   shared printer properly.  To fix this, see the notes in the Samba
  804.   distribution in the file docs/WinNT.txt.  The other deals with
  805.   password problems.  See the comments in the same file for an annoying
  806.   gain of understanding and failure to fix the problem.
  807.  
  808.   Oleg L. Machulskiy (machulsk@shade.msu.ru) suggests that a better
  809.   print command to use in the above example would be:
  810.  
  811.  
  812.  
  813.        ______________________________________________________________________
  814.        print command = smb2ps %s | lpr -r -h -P %p
  815.        ______________________________________________________________________
  816.  
  817.  
  818.  
  819.  
  820.   where 'smb2ps' is a script which transforms the spool file received
  821.   from Windows into usual a usable Postscript file. It must cut off
  822.   first 3 lines and last 2 lines, because these lines contain some PJL
  823.   or PCL codes.
  824.  
  825.   That approach is only needed if your Windows machine is printing PCL
  826.   and not real Postscript.  I have found that Windows 95/98/NT don't
  827.   have a generic Postscript driver per se, but the "Digital turbo
  828.   Printserver 20" driver acts as a good general Postscript driver for
  829.   most setups.  I have also heard that the "Apple LaserWriter II NTX"
  830.   driver works for this purpose.
  831.  
  832.   Jeff Stern (jstern@eclectic.ss.uci.edu) reported the following that
  833.   may be of help to some of you:
  834.  
  835.   --------------------------%<---------------------------------- Problem
  836.   I was having was that I could print via lpd/lpr to my Linux printer,
  837.   from the Linux box itself.  But I couldn't get it to print from a
  838.   remote Win95 machine.  When I tried
  839.  
  840.   smbclient \\eclectic\belen -P
  841.  
  842.   and then tried to
  843.  
  844.   print myfile
  845.  
  846.   I got errors about access denied.  SO I reset the permissions on my
  847.   /var/spool/lpd/lp1 directory to 777.  I'm sorry, but that's what I had
  848.   to do.  I suppose alternatively I could have message with putting
  849.   everyone on the Linux box in the 'lp' group, or made the directory be
  850.   owned by the group 'users', etc..  But for now, this works (with
  851.   ownership root:lp).
  852.  
  853.   Finally, the other thing administrators should know is that the name
  854.   of the account on the WIndows machine (which is trying to use the
  855.   Linux printer via Samba) should have an equivalently-named account on
  856.   the Linux box.  Thus, if there is a user named 'joe' on the Windows
  857.   machine, (\\eclectic\belen) then there should be a user named 'joe' on
  858.   the Linux box. Then 'joe's login password will be the password to
  859.   access eclectic's belen printer.  This password will be asked for on
  860.   the Windows machine when setting up the printer on the Windows box
  861.   with Printers|Add Printer.
  862.  
  863.   I kind of thought maybe this wouldn't be the case, since I have set up
  864.   my printer to be 'public' in the smb.conf.  But apparently it still
  865.   asks for password. (The windows box unfortunately doesn't give you the
  866.   opportunity to supply a different user name to the remote (Linux)
  867.   printer. It just uses your local user name which you signed in as when
  868.   you started up Win95.
  869.   --------------------------%<----------------------------------
  870.  
  871.   Dr. Michael Langner (langner@fiz-chemie.de points out that write
  872.   permission problems on the /var/spool/lpd/ tree could be avoided by
  873.   use something like "path = /tmp" and "print command = lpr -r -P%p %s"
  874.   instead.
  875.  
  876.   Sometimes, a Postscript parsing error will occur with Postscript
  877.   printing from Windows machines that causes an extra page to be printed
  878.   at the end of every print job.  The last page will always have "%%[
  879.   Lastpage ]%%" at the top of it.  This seems to happen with Windows 95
  880.   and 98 only and is because the Postscript is malformed.
  881.  
  882.   One way to handle that is to use a script to remove that bit of bad
  883.   Postscript from the spooled jobs.  Another way is to try to find a
  884.   better Windows Postscript driver.  Probably the best way is to us
  885.   LPRng instead of Postscript to print to a Samba server.
  886.  
  887.   Erik Ratcliffe (erik@caldera.com) Caldera tells me that using LPRng
  888.   means that any printer driver can be used from Windows machines.  On
  889.   the Samba server, they used an /etc/printcap entry that looked like
  890.   this:
  891.  
  892.  
  893.  
  894.        ______________________________________________________________________
  895.        raw:\
  896.                :rw:sh:
  897.                :lp=/dev/lp1
  898.                :sd=/var/spool/lpd/raw
  899.                :fx=flp
  900.        ______________________________________________________________________
  901.  
  902.  
  903.  
  904.  
  905.   LPRng doesn't require :\ at the end of every line.  A printer entry
  906.   will still need to be made in /etc/smb.conf for the physical printer.
  907.   The print command line needs to use the "raw" entry in /etc/printcap
  908.   and data must be sent to the printer in binary form.  Try a print
  909.   command line like this:
  910.  
  911.  
  912.  
  913.        ______________________________________________________________________
  914.        print command = lpr -b -Praw %s
  915.        ______________________________________________________________________
  916.  
  917.  
  918.  
  919.  
  920.   You may also need to set the spooling on the Windows95 end to print
  921.   directly to the printer instead of spooling.
  922.  
  923.  
  924.  
  925.   9.  Sharing A Windows Printer With Linux Machines
  926.  
  927.   To share a printer on a Windows machine, you must do the following:
  928.  
  929.  
  930.   1. You must have the proper entries in /etc/printcap and they must
  931.      correspond to the local directory structure (for the spool
  932.      directory, etc).
  933.  
  934.   2. You must have the script /usr/bin/smbprint.  This comes with the
  935.      Samba source, but not with all Samba binary distributions.  A
  936.      slightly modifed copy is discussed below.
  937.  
  938.   3. If you want to convert ASCII files to Postscript, you must have
  939.      nenscript, or its equivalent.  nenscript is a Postscript converter
  940.      and is generally installed in /usr/bin.
  941.  
  942.   4. You may wish to make Samba printing easier by having an easy-to-use
  943.      front end.  A simple perl script to handle ASCII, Postscript or
  944.      created Postscript is given below.
  945.  
  946.   5. You could also use MagicFilter to do the above.  The details on
  947.      setting up MagicFilter are given below the perl script.
  948.      MagicFilter has advantages because it knows how to automatically
  949.      convert a lot of file formats.
  950.  
  951.   6.
  952.  
  953.      a. The /etc/printcap entry below is for an HP 5MP printer on a
  954.         Windows NT host.  The entries are as follows:
  955.  
  956.  
  957.         ________________________________________________________________
  958.                 cm - comment
  959.                 lp - device name to open for output
  960.                 sd - the printer's spool directory (on the local machine)
  961.                 af - the accounting file
  962.                 mx - the maximum file size (zero is unlimited)
  963.                 if - name of the input filter (script)
  964.         ________________________________________________________________
  965.  
  966.  
  967.  
  968.      For more information, see the Printing HOWTO or the man page for
  969.      printcap.
  970.  
  971.  
  972.  
  973.           ___________________________________________________________________
  974.           # /etc/printcap
  975.           #
  976.           # //zimmerman/oreilly via smbprint
  977.           #
  978.           lp:\
  979.                   :cm=HP 5MP Postscript OReilly on zimmerman:\
  980.                   :lp=/dev/lp1:\
  981.                   :sd=/var/spool/lpd/lp:\
  982.                   :af=/var/spool/lpd/lp/acct:\
  983.                   :mx#0:\
  984.                   :if=/usr/bin/smbprint:
  985.           ___________________________________________________________________
  986.  
  987.  
  988.  
  989.  
  990.  
  991.      Make certain that the spool and accounting directories exist and
  992.      are writable.  Ensure that the 'if' line holds the proper path to
  993.      the smbprint script (given below) and make sure that the proper
  994.      device is pointed to (the /dev special file).
  995.  
  996.      Next is the smbprint script itself.  It is usually placed in
  997.      /usr/bin and is attributable to Andrew Tridgell, the person who
  998.      created Samba as far as I know.  It comes with the Samba source
  999.      distribution, but is absent from some binary distributions, so I
  1000.      have recreated it here.
  1001.  
  1002.      You may wish to look at this carefully.  There are some minor
  1003.      alterations that have shown themselves to be useful.
  1004.  
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018.  
  1019.  
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.      ___________________________________________________________________
  1058.      #!/bin/sh -x
  1059.  
  1060.      # This script is an input filter for printcap printing on a unix machine. It
  1061.      # uses the smbclient program to print the file to the specified smb-based
  1062.      # server and service.
  1063.      # For example you could have a printcap entry like this
  1064.      #
  1065.      # smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
  1066.      #
  1067.      # which would create a unix printer called "smb" that will print via this
  1068.      # script. You will need to create the spool directory /usr/spool/smb with
  1069.      # appropriate permissions and ownerships for your system.
  1070.  
  1071.      # Set these to the server and service you wish to print to
  1072.      # In this example I have a WfWg PC called "lapland" that has a printer
  1073.      # exported called "printer" with no password.
  1074.  
  1075.      #
  1076.      # Script further altered by hamiltom@ecnz.co.nz (Michael Hamilton)
  1077.      # so that the server, service, and password can be read from
  1078.      # a /usr/var/spool/lpd/PRINTNAME/.config file.
  1079.      #
  1080.      # In order for this to work the /etc/printcap entry must include an
  1081.      # accounting file (af=...):
  1082.      #
  1083.      #   cdcolour:\
  1084.      #       :cm=CD IBM Colorjet on 6th:\
  1085.      #       :sd=/var/spool/lpd/cdcolour:\
  1086.      #       :af=/var/spool/lpd/cdcolour/acct:\
  1087.      #       :if=/usr/local/etc/smbprint:\
  1088.      #       :mx=0:\
  1089.      #       :lp=/dev/null:
  1090.      #
  1091.      # The /usr/var/spool/lpd/PRINTNAME/.config file should contain:
  1092.      #   server=PC_SERVER
  1093.      #   service=PR_SHARENAME
  1094.      #   password="password"
  1095.      #
  1096.      # E.g.
  1097.      #   server=PAULS_PC
  1098.      #   service=CJET_371
  1099.      #   password=""
  1100.  
  1101.      #
  1102.      # Debugging log file, change to /dev/null if you like.
  1103.      #
  1104.      logfile=/tmp/smb-print.log
  1105.      # logfile=/dev/null
  1106.  
  1107.  
  1108.      #
  1109.      # The last parameter to the filter is the accounting file name.
  1110.      #
  1111.      spool_dir=/var/spool/lpd/lp
  1112.      config_file=$spool_dir/.config
  1113.  
  1114.      # Should read the following variables set in the config file:
  1115.      #   server
  1116.      #   service
  1117.      #   password
  1118.      #   user
  1119.      eval `cat $config_file`
  1120.  
  1121.      #
  1122.      # Some debugging help, change the >> to > if you want to same space.
  1123.      #
  1124.      echo "server $server, service $service" >> $logfile
  1125.  
  1126.      (
  1127.      # NOTE You may wish to add the line `echo translate' if you want automatic
  1128.      # CR/LF translation when printing.
  1129.              echo translate
  1130.              echo "print -"
  1131.              cat
  1132.      ) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P >> $logfile
  1133.      ___________________________________________________________________
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.      Most Linux distributions come with nenscript for converting ASCII
  1140.      documents to Postscript.  The following perl script makes life eas¡
  1141.      ier be providing a simple interface to Linux printing via smbprint.
  1142.  
  1143.  
  1144.      ___________________________________________________________________
  1145.      Usage: print [-a|c|p] <filename>
  1146.             -a prints <filename> as ASCII
  1147.             -c prints <filename> formatted as source code
  1148.             -p prints <filename> as Postscript
  1149.              If no switch is given, print attempts to
  1150.              guess the file type and print appropriately.
  1151.      ___________________________________________________________________
  1152.  
  1153.  
  1154.  
  1155.      Using smbprint to print ASCII files tends to truncate long lines.
  1156.      This script breaks long lines on whitespace (instead of in the mid¡
  1157.      dle of a word), if possible.
  1158.  
  1159.      The source code formatting is done with nenscript.  It takes an
  1160.      ASCII file and foramts it in 2 columns with a fancy header (date,
  1161.      filename, etc).  It also numbers the lines.  Using this as an exam¡
  1162.      ple, other types of formatting can be accomplished.
  1163.  
  1164.      Postscript documents are already properly formatted, so they pass
  1165.      through directly.
  1166.  
  1167.  
  1168.  
  1169.  
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.      ___________________________________________________________________
  1190.      #!/usr/bin/perl
  1191.  
  1192.      # Script:   print
  1193.      # Authors:  Brad Marshall, David Wood
  1194.      #           Plugged In Communications
  1195.      # Date:     960808
  1196.      #
  1197.      # Script to print to a Postscript printer via Samba.
  1198.      # Purpose:  Takes files of various types as arguments and
  1199.      # processes them appropriately for piping to a Samba print script.
  1200.      #
  1201.      # Currently supported file types:
  1202.      #
  1203.      # ASCII      - ensures that lines longer than $line_length characters wrap on
  1204.      #              whitespace.
  1205.      # Postscript - Takes no action.
  1206.      # Code       - Formats in Postscript (using nenscript) to display
  1207.      #              properly (landscape, font, etc).
  1208.      #
  1209.  
  1210.      # Set the maximum allowable length for each line of ASCII text.
  1211.      $line_length = 76;
  1212.  
  1213.      # Set the path and name of the Samba print script
  1214.      $print_prog = "/usr/bin/smbprint";
  1215.  
  1216.      # Set the path and name to nenscript (the ASCII-->Postscript converter)
  1217.      $nenscript = "/usr/bin/nenscript";
  1218.  
  1219.      unless ( -f $print_prog ) {
  1220.              die "Can't find $print_prog!";
  1221.      }
  1222.      unless ( -f $nenscript ) {
  1223.              die "Can't find $nenscript!";
  1224.      }
  1225.  
  1226.      &ParseCmdLine(@ARGV);
  1227.  
  1228.      # DBG
  1229.      print "filetype is $filetype\n";
  1230.  
  1231.      if ($filetype eq "ASCII") {
  1232.              &wrap($line_length);
  1233.      } elsif ($filetype eq "code") {
  1234.              &codeformat;
  1235.      } elsif ($filetype eq "ps") {
  1236.              &createarray;
  1237.      } else {
  1238.              print "Sorry..no known file type.\n";
  1239.              exit 0;
  1240.      }
  1241.      # Pipe the array to smbprint
  1242.      open(PRINTER, "|$print_prog") || die "Can't open $print_prog: $!\n";
  1243.      foreach $line (@newlines) {
  1244.              print PRINTER $line;
  1245.      }
  1246.      # Send an extra linefeed in case a file has an incomplete last line.
  1247.      print PRINTER "\n";
  1248.      close(PRINTER);
  1249.      print "Completed\n";
  1250.      exit 0;
  1251.  
  1252.      # --------------------------------------------------- #
  1253.      #        Everything below here is a subroutine        #
  1254.      # --------------------------------------------------- #
  1255.      sub ParseCmdLine {
  1256.              # Parses the command line, finding out what file type the file is
  1257.  
  1258.              # Gets $arg and $file to be the arguments (if the exists)
  1259.              # and the filename
  1260.              if ($#_ < 0) {
  1261.                      &usage;
  1262.              }
  1263.              # DBG
  1264.      #       foreach $element (@_) {
  1265.      #               print "*$element* \n";
  1266.      #       }
  1267.  
  1268.              $arg = shift(@_);
  1269.              if ($arg =~ /\-./) {
  1270.                      $cmd = $arg;
  1271.              # DBG
  1272.      #       print "\$cmd found.\n";
  1273.  
  1274.                      $file = shift(@_);
  1275.              } else {
  1276.                      $file = $arg;
  1277.              }
  1278.  
  1279.              # Defining the file type
  1280.              unless ($cmd) {
  1281.                      # We have no arguments
  1282.  
  1283.                      if ($file =~ /\.ps$/) {
  1284.                              $filetype = "ps";
  1285.                      } elsif ($file =~ /\.java$|\.c$|\.h$|\.pl$|\.sh$|\.csh$|\.m4$|\.inc$|\.html$|\.htm$/) {
  1286.                              $filetype = "code";
  1287.                      } else {
  1288.                              $filetype = "ASCII";
  1289.                      }
  1290.  
  1291.                      # Process $file for what type is it and return $filetype
  1292.              } else {
  1293.                      # We have what type it is in $arg
  1294.                      if ($cmd =~ /^-p$/) {
  1295.                              $filetype = "ps";
  1296.                      } elsif ($cmd =~ /^-c$/) {
  1297.                              $filetype = "code";
  1298.                      } elsif ($cmd =~ /^-a$/) {
  1299.                              $filetype = "ASCII"
  1300.                      }
  1301.              }
  1302.      }
  1303.  
  1304.      sub usage {
  1305.              print "
  1306.      Usage: print [-a|c|p] <filename>
  1307.             -a prints <filename> as ASCII
  1308.             -c prints <filename> formatted as source code
  1309.             -p prints <filename> as Postscript
  1310.              If no switch is given, print attempts to
  1311.              guess the file type and print appropriately.\n
  1312.      ";
  1313.              exit(0);
  1314.      }
  1315.  
  1316.      sub wrap {
  1317.              # Create an array of file lines, where each line is < the
  1318.              # number of characters specified, and wrapped only on whitespace
  1319.  
  1320.              # Get the number of characters to limit the line to.
  1321.              $limit = pop(@_);
  1322.  
  1323.              # DBG
  1324.              #print "Entering subroutine wrap\n";
  1325.              #print "The line length limit is $limit\n";
  1326.  
  1327.              # Read in the file, parse and put into an array.
  1328.              open(FILE, "<$file") || die "Can't open $file: $!\n";
  1329.              while(<FILE>) {
  1330.                      $line = $_;
  1331.  
  1332.                      # DBG
  1333.                      #print "The line is:\n$line\n";
  1334.  
  1335.                      # Wrap the line if it is over the limit.
  1336.                      while ( length($line) > $limit ) {
  1337.  
  1338.                              # DBG
  1339.                              #print "Wrapping...";
  1340.  
  1341.                              # Get the first $limit +1 characters.
  1342.                              $part = substr($line,0,$limit +1);
  1343.  
  1344.                              # DBG
  1345.                              #print "The partial line is:\n$part\n";
  1346.  
  1347.                              # Check to see if the last character is a space.
  1348.                              $last_char = substr($part,-1, 1);
  1349.                              if ( " " eq $last_char ) {
  1350.                                  # If it is, print the rest.
  1351.  
  1352.                                  # DBG
  1353.                                  #print "The last character was a space\n";
  1354.  
  1355.                                  substr($line,0,$limit + 1) = "";
  1356.                                  substr($part,-1,1) = "";
  1357.                                  push(@newlines,"$part\n");
  1358.                              } else {
  1359.                                   # If it is not, find the last space in the
  1360.                                   # sub-line and print up to there.
  1361.  
  1362.                                  # DBG
  1363.                                  #print "The last character was not a space\n";
  1364.  
  1365.                                   # Remove the character past $limit
  1366.                                   substr($part,-1,1) = "";
  1367.                                   # Reverse the line to make it easy to find
  1368.                                   # the last space.
  1369.                                   $revpart = reverse($part);
  1370.                                   $index = index($revpart," ");
  1371.                                   if ( $index > 0 ) {
  1372.                                     substr($line,0,$limit-$index) = "";
  1373.                                     push(@newlines,substr($part,0,$limit-$index)
  1374.                                         . "\n");
  1375.                                   } else {
  1376.                                     # There was no space in the line, so
  1377.                                     # print it up to $limit.
  1378.                                     substr($line,0,$limit) = "";
  1379.                                     push(@newlines,substr($part,0,$limit)
  1380.                                         . "\n");
  1381.                                   }
  1382.                              }
  1383.                      }
  1384.                      push(@newlines,$line);
  1385.              }
  1386.              close(FILE);
  1387.      }
  1388.  
  1389.      sub codeformat {
  1390.              # Call subroutine wrap then filter through nenscript
  1391.              &wrap($line_length);
  1392.  
  1393.              # Pipe the results through nenscript to create a Postscript
  1394.              # file that adheres to some decent format for printing
  1395.              # source code (landscape, Courier font, line numbers).
  1396.              # Print this to a temporary file first.
  1397.              $tmpfile = "/tmp/nenscript$$";
  1398.              open(FILE, "|$nenscript -2G -i$file -N -p$tmpfile -r") ||
  1399.                      die "Can't open nenscript: $!\n";
  1400.              foreach $line (@newlines) {
  1401.                      print FILE $line;
  1402.              }
  1403.              close(FILE);
  1404.  
  1405.              # Read the temporary file back into an array so it can be
  1406.              # passed to the Samba print script.
  1407.              @newlines = ("");
  1408.              open(FILE, "<$tmpfile") || die "Can't open $file: $!\n";
  1409.              while(<FILE>) {
  1410.                      push(@newlines,$_);
  1411.              }
  1412.              close(FILE);
  1413.              system("rm $tmpfile");
  1414.      }
  1415.  
  1416.      sub createarray {
  1417.              # Create the array for postscript
  1418.              open(FILE, "<$file") || die "Can't open $file: $!\n";
  1419.              while(<FILE>) {
  1420.                      push(@newlines,$_);
  1421.              }
  1422.              close(FILE);
  1423.      }
  1424.      ___________________________________________________________________
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.      Now the MagicFilter way.  Thanks to Alberto Menegazzi
  1431.      (flash.egon@iol.it) for this information.
  1432.  
  1433.      Alberto says:
  1434.  
  1435.      --------------------------%<---------------------------------- 1)
  1436.      Install MagicFilter with the filter for the printers you need in
  1437.      /usr/bin/local but DON'T fill /etc/printcap with the suggestion
  1438.      given by the documentation from MagicFilter.
  1439.  
  1440.      2) Write the /etc/printcap like this way (it's done for my LaserJet
  1441.      4L):
  1442.  
  1443.      lp|ljet4l:\ :cm=HP LaserJet 4L:\ :lp=/dev/null:\
  1444.      # or /dev/lp1 :sd=/var/spool/lpd/ljet4l:\
  1445.      :af=/var/spool/lpd/ljet4l/acct:\ :sh:mx#0:\
  1446.      :if=/usr/local/bin/main-filter:
  1447.  
  1448.      You should explain that the lp=/dev/... is opened for locking so
  1449.      "virtual" devices one for every remote printer should be used.
  1450.  
  1451.      Example creating with : touch /dev/ljet4l
  1452.  
  1453.      3) Write the filter /usr/local/bin/main-filter the same you suggest
  1454.      using the ljet4l-filter instead of cat.
  1455.  
  1456.      Here's mine.
  1457.  
  1458.      #! /bin/sh logfile=/var/log/smb-print.log
  1459.      spool_dir=/var/spool/lpd/ljet4l ( echo "print -"
  1460.      /usr/local/bin/ljet4l-filter ) | /usr/bin/smbclient
  1461.      "\\\\SHIR\\HPLJ4" -N -P >> $logfile
  1462.  
  1463.      P.S. : here is the quote from the Print2Win mini-Howto about lock¡
  1464.      ing and why creating virtual printers
  1465.  
  1466.      ---Starts here
  1467.  
  1468.      Hint from Rick Bressler :
  1469.  
  1470.      Good tip sheet.  I use something very similar.  One helpful tip,
  1471.      this is not a particularly good idea:
  1472.  
  1473.      :lp=/dev/null:\
  1474.  
  1475.      lpr does an 'exclusive' open on the file you specify as lp=.  It
  1476.      does this in order to prevent multiple processes from trying to
  1477.      print to the dame printer at the same time.
  1478.  
  1479.      The side effect of this is that in your case, eng and colour can't
  1480.      print at the same time, (usually more or less transparent since
  1481.      they probably print quickly and since they queue you probably don't
  1482.      notice) but any other process that tries to write to /dev/null will
  1483.      break!
  1484.  
  1485.      On a single user system, probably not a big problem.  I have a sys¡
  1486.      tem with over 50 printers.  It would be a problem there.
  1487.  
  1488.      The solution is to create a dummy printer for each.  Eg: touch
  1489.      /dev/eng.
  1490.  
  1491.      I have modified the lp entries in the printcap file above to take
  1492.      into account Rick's suggestion. I did the following:
  1493.  
  1494.  
  1495.      #touch /dev/eng #touch /dev/colour
  1496.  
  1497.      ---Ends here
  1498.  
  1499.      --------------------------%<----------------------------------
  1500.  
  1501.  
  1502.  
  1503.      10.  Backing Up Windows Machines to a Linux Host
  1504.  
  1505.      Adam Neat (adamneat@ipax.com.au) kindly contributed the following
  1506.      script to back up Windows machines to a Linux host, using the
  1507.      smbclient utility.  Adam says that it is used to backup Windows 3.x
  1508.      and NT machines to a Linux based DAT SCSI Drive.
  1509.  
  1510.      Adam is not proud of the coding style used here, but it works.  As
  1511.      I like to say, "If it works and its stupid, then it is not stupid".
  1512.  
  1513.      In this script, the string 'agnea1' is the username on the Linux
  1514.      machine that does the backups.
  1515.  
  1516.  
  1517.  
  1518.  
  1519.      ___________________________________________________________________
  1520.      #!/bin/bash
  1521.  
  1522.      clear
  1523.      echo Initialising ...
  1524.      checkdate=`date | awk '{print $1}'`
  1525.  
  1526.      if [ -f "~agnea1/backup-dir/backup-data" ]; then
  1527.  
  1528.              echo "ERROR: No config file for today!"
  1529.              echo "FATAL!"
  1530.              exit 1
  1531.      fi
  1532.  
  1533.      if [ -d "~agnea1/backup-dir/temp" ]; then
  1534.  
  1535.              echo "ERROR: No tempoary directory found!"
  1536.              echo
  1537.              echo "Attempting to create"
  1538.              cd ~agnea1
  1539.              cd backup-dir
  1540.              mkdir temp
  1541.              echo "Directory Made - temp"
  1542.      fi
  1543.  
  1544.      if [ "$1" = "" ]; then
  1545.  
  1546.              echo "ERROR: enter in a machine name (ie: cdwriter)"
  1547.              exit 1
  1548.      fi
  1549.  
  1550.      if [ "$2" = "" ]; then
  1551.  
  1552.              echo "ERROR: enter in a SMB (Lan Manager) Resource (ie: work)"
  1553.              exit 1
  1554.      fi
  1555.  
  1556.      if [ "$3" = "" ]; then
  1557.  
  1558.              echo "ERROR: enter in an IP address for $1 (ie:
  1559.              130.xxx.xxx.52)" exit 1
  1560.      fi
  1561.  
  1562.  
  1563.      #############################################################################
  1564.      # Main Section
  1565.      #
  1566.      #############################################################################
  1567.  
  1568.      cd ~agnea1/backup-dir/temp
  1569.      rm -r ~agnea1/backup-dir/temp/*
  1570.      cd ~agnea1/backup-dir/
  1571.  
  1572.      case "$checkdate"
  1573.      in
  1574.              Mon)
  1575.                      echo "Backuping for Monday"
  1576.                      cat backup-data | /usr/local/samba/bin/smbclient
  1577.                      \\\\$1\\$2 -I$3 -N echo "Complete"
  1578.  
  1579.                              if [ -d "~agnea1/backup-dir/Monday" ]; then
  1580.                                      echo "Directory Monday Not found ...
  1581.                                      making" mkdir
  1582.                                      ~agnea1/backup-dir/Monday
  1583.                              fi
  1584.  
  1585.                      echo "Archiving ..."
  1586.                      cd ~agnea1/backup-dir/temp
  1587.                      tar -cf monday.tar *                echo "done ..."
  1588.                      rm ~agnea1/backup-dir/Monday/monday.tar
  1589.                      mv monday.tar ~agnea1/backup-dir/Monday
  1590.                      ;;
  1591.  
  1592.  
  1593.              Tue)
  1594.                      echo "Backuping for Tuesday"
  1595.                      cat backup-data | /usr/local/samba/bin/smbclient
  1596.                      \\\\$1\\$2 -I$3 -N echo "Complete"
  1597.  
  1598.                              if [ -d "~agnea1/backup-dir/Tuesday" ]; then
  1599.                                      echo "Directory Tuesday Not found ...
  1600.                                      making" mkdir
  1601.                                      ~agnea1/backup-dir/Tuesday
  1602.                              fi
  1603.                      echo "Archiving ..."
  1604.                      cd ~agnea1/backup-dir/temp
  1605.                      tar -cf tuesday.tar *
  1606.                      echo "done ..."
  1607.                      rm ~agnea1/backup-dir/Tuesday/tuesday.tar
  1608.                      mv tuesday.tar ~agnea1/backup-dir/Tuesday
  1609.                      ;;
  1610.  
  1611.              Wed)
  1612.                      echo "Backuping for Wednesday"
  1613.                      cat backup-data | /usr/local/samba/bin/smbclient
  1614.                      \\\\$1\\$2 -I$3 -N echo "Complete"
  1615.  
  1616.                              if [ -d "~agnea1/backup-dir/Wednesday" ]; then
  1617.                                      echo "Directory Wednesday Not found
  1618.                                      ... making" mkdir
  1619.                                      ~agnea1/backup-dir/Wednesday
  1620.                              fi
  1621.                      echo "Archiving ..."
  1622.                      cd ~agnea1/backup-dir/temp
  1623.                      tar -cf wednesday.tar *
  1624.                      echo "done ..."
  1625.                   rm ~agnea1/backup-dir/Wednesday/wednesday.tar
  1626.                      mv wednesday.tar ~agnea1/backup-dir/Wednesday
  1627.                      ;;
  1628.  
  1629.              Thu)
  1630.                      echo "Backuping for Thrusday"
  1631.                      cat backup-data | /usr/local/samba/bin/smbclient
  1632.                      \\\\$1\\$2 -I$3 -N echo "Complete"
  1633.  
  1634.                              if [ -d "~agnea1/backup-dir/Thursday" ]; then
  1635.                                      echo "Directory Thrusday Not found ...
  1636.                                      making" mkdir
  1637.                                      ~agnea1/backup-dir/Thursday
  1638.                              fi
  1639.                      echo "Archiving ..."
  1640.                      cd ~agnea1/backup-dir/temp
  1641.                      tar -cf thursday.tar *
  1642.                      echo "done ..."
  1643.                      rm ~agnea1/backup-dir/Thursday/thursday.tar
  1644.                      mv thursday.tar ~agnea1/backup-dir/Thursday
  1645.                      ;;
  1646.  
  1647.  
  1648.              Fri)
  1649.                      echo "Backuping for Friday"
  1650.                      cat backup-data | /usr/local/samba/bin/smbclient
  1651.                      \\\\$1\\$2 -I$3 -N echo "Complete"
  1652.  
  1653.                              if [ -d "~agnea1/backup-dir/Friday" ]; then
  1654.                                      echo "Directory Friday Not found ...
  1655.                                      making" mkdir
  1656.                                      ~agnea1/backup-dir/Friday
  1657.                              fi
  1658.                      echo "Archiving ..."
  1659.                      cd ~agnea1/backup-dir/temp
  1660.                      tar -cf friday.tar *
  1661.                      echo "done ..."
  1662.                      rm ~agnea1/backup-dir/Friday/friday.tar
  1663.                      mv friday.tar ~agnea1/backup-dir/Friday
  1664.                      ;;
  1665.  
  1666.              *)
  1667.                      echo "FATAL ERROR: Unknown variable passed for day"
  1668.                      exit 1;;
  1669.  
  1670.      esac
  1671.      ###########
  1672.      ___________________________________________________________________
  1673.  
  1674.  
  1675.  
  1676.  
  1677.  
  1678.  
  1679.      11.  Copyright
  1680.  
  1681.      This HOWTO is copyright 1996-9 by David Wood.  It may be reproduced
  1682.      in any form and freely distributed as long as the file stays
  1683.      intact, including this statement.
  1684.  
  1685.  
  1686.  
  1687.      12.  Acknowledgements
  1688.  
  1689.      Brad Marshall (bmarshall@plugged.net.au) and Jason Parker
  1690.      (jparker@plugged.net.au) contributed time, patience, scripting and
  1691.      research.
  1692.  
  1693.      Adam Neat (adamneat@ipax.com.au) contributed the bash script used
  1694.      to back up Windows machines to a Linux host.
  1695.  
  1696.      Matthew Flint () told me about the use of the 'interfaces' option
  1697.      in smb.conf.
  1698.  
  1699.      Oleg L. Machulskiy (machulsk@shade.msu.ru), Jeff Stern
  1700.      (jstern@eclectic.ss.uci.edu), Dr. Michael Langner (langner@fiz-
  1701.      chemie.de and Erik Ratcliffe (erik@caldera.com) suggested
  1702.      modifications to the section on Sharing A Linux Printer With
  1703.      Windows Machines.
  1704.  
  1705.      Alberto Menegazzi (flash.egon@iol.it) contributed the MagicFilter
  1706.      setup to enable a Linux machine to share a Windows printer.
  1707.  
  1708.      Andrea Girotto (icarus@inca.dei.unipd.it) contributed a number of
  1709.      valuable suggestions throughout the document.
  1710.  
  1711.      Thanks, also, to all of the international translators that have
  1712.      brought this HOWTO to the non-English speaking world: Takeo Nakano
  1713.      (nakano@apm.seikei.ac.jp), Klaus-Dieter Schumacher (Klaus-
  1714.      Dieter.Schumacher@fernuni-hagen.de), Andrea Girotto
  1715.      (icarus@inca.dei.unipd.it) and many others for whom I don't have
  1716.      contact details.
  1717.  
  1718.  
  1719.  
  1720.  
  1721.  
  1722.  
  1723.  
  1724.  
  1725.  
  1726.  
  1727.  
  1728.  
  1729.  
  1730.  
  1731.  
  1732.  
  1733.  
  1734.  
  1735.  
  1736.  
  1737.  
  1738.  
  1739.  
  1740.  
  1741.  
  1742.  
  1743.  
  1744.  
  1745.  
  1746.  
  1747.  
  1748.  
  1749.  
  1750.  
  1751.  
  1752.  
  1753.  
  1754.  
  1755.  
  1756.  
  1757.  
  1758.  
  1759.  
  1760.  
  1761.  
  1762.  
  1763.  
  1764.  
  1765.  
  1766.  
  1767.  
  1768.  
  1769.  
  1770.  
  1771.  
  1772.  
  1773.  
  1774.  
  1775.  
  1776.  
  1777.  
  1778.  
  1779.  
  1780.  
  1781.  
  1782.  
  1783.