next up previous
Next: 고스트스크립트와 연동한 인쇄 방법 Up: 삼바의 활용 방안 Previous: PC 쪽의 사용자 디스크

PC 쪽의 네트웍 프린터 연결

유닉스 기계에서 PC쪽에 연결된 프린터를 공유하고 싶을 경우가 있을 것이다. 프린터 공유기를 구매해서 연결하는 방법이 가장 쉽지만, 부가 비용이 들게 된다. 다음의 방법을 생각해보자.

  1. 예로 NetBIOS 이름이 dark이라는 PC에 연결된 lp라는 이름을 가진 공유 프린터를 reuse.postech.ac.kr이라는 이름을 가진 UNIX 기계에서 사용하고 싶다고 가정하자.
  2. reuse에서 smbclient를 다음과 같이 동작시킨다.
    % smbclient '\\dark\lp' -P -N
    (P 선택 사양은 프린터를 의미, N 선택 사양은 패스워드 입력을 건너뛰는 것을 의미)
  3. lcd 명령을 사용하여 인쇄하고 싶은 파일이 있는 곳으로 간다.
    smb: \> lcd /usr/local/lib/ghostscript/examples
  4. put 명령을 사용하여 인쇄할 파일을 프린터로 보낸다. 프린터는 포스트스크립트를 지원한다고 가정한다.
    smb: \> put tiger.ps
  5. 프린터로 가서 인쇄 결과를 확인한다.

타이핑을 싫어하시는 분을 위해 비록 표준 삼바 패키지에는 포함되어 있지 않지만 printcap과 연동하여 사용할 수 있도록 하는 입력 통신 필터인 smbprint를 소개한다. BSD 계열의 프린팅 기능 (lpr, lpc)을 가진 호스트가 있다면 계속해서 이어질 일련의 설치 방법을 살펴보자.

--------------------- smbprint --------------------------------------------
#!/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.
#   Extract the directory name from the file name.
#   Concat this with /.config to get the config file.
#
eval acct_file=\$$#
spool_dir=`dirname $acct_file` 
config_file=$spool_dir/.config

# Should read the following variables set in the config file:
#   server
#   service
#   password
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/local/samba/bin/smbclient "\\\\$server\\$service" \
$password -U $server -N -P >> $logfile
---------------------------------------------------------------------------

위 파일을 /usr/local/samba/bin으로 복사하고 printcap에 다음의 내용을 삽입한다. printcap에 lp라는 이름이 이미 존재한다면, 충돌을 피하기 위해 반드시 다른 이름으로 바꾸어야 한다.

------- part of the printcap ----------------------------------------------
lp|laser|ps|SambaPrinter|PostScript:\
        lp=/dev/null:sd=/usr/spool/smb:if=/usr/local/samba/bin/smbprint
---------------------------------------------------------------------------

이상의 절차에 따라 smbprint를 설치했으며, printcap을 수정했다면, /usr/spool/smb 디렉토리를 만들어서 그곳에 다음 내용을 포함하는 .config라는 이름을 가진 파일을 넣어둔다.

------- .config -----------------------------------------------------------
server=dark
service=lp
password=""
---------------------------------------------------------------------------
(주의: server와 service 항목은 상황에 맞게 설정한다.)

이제 관리자 권한으로 lpc 명령을 사용하여 프린터 lp를 활성화시킨다. 이 시점에서 포스트스크립트 형식의 파일을 하나 골라 시험 인쇄를 해보라. 모든 관련 파일을 정확하게 설치했음에도 불구하고 몇분동안 인쇄가 진행되지 않으면, 어딘가에 문제가 생긴 것이다. 이렇게 시스템의 특성 차이로 인해 위의 방법이 통하지 않을 경우를 대비해 다른 대책을 강구해보도록 하겠다(참고: SunOS 4.1.x에서는 정상적으로 동작함을 확인하였다. 그러나 Digital UNIX에서는 printcap의 차이로 인해 제대로 동작하지 않음을 확인하였다.).

다른 대책을 소개하기에 앞서 SYSV 사용자를 즐겁게 해줄 내용이 있다. 다름이 아니라 1.9.17 버전에서는 SYSV 사용자를 위한 smbprint.sysv를 제공하고 있다. samba-1.9.17p1/examples/printing 디렉토리 아래를 한번 살펴보기 바란다. SYSV 계열에서 제공하는 lpadmin 명령을 이용하여 smbprint.sysv 쉘 스크립트를 추가하도록 한다.

--------------------- smbprint.sysv -----------------------------------------
# clear out the unwanted parameters
shift;shift;shift;shift;shift
# now the argument list is just the files to print

server=admin
service=hplj2
password=""

(
# NOTE You may wish to add the line `echo translate' if you want automatic
# CR/LF translation when printing.
       echo translate
        echo "print -"
        cat $*
) | /opt/samba/smbclient "\\\\$server\\$service" $password -N -P  > /dev/null
exit $?
---------------------------------------------------------------------------
(아직 필자가 smbprint.sysv 스크립트를 시험해보지 않았으므로 애독자 가운데
성공하신 분 계시면 전자 편지로 확인을 부탁드립니다.)

이제 이도저도 안되는 시스템의 문제점을 해결하기 위해, 다음에 간단한 csh 스크립트를 소개한다(작성자: kijoo@dice.postech.ac.kr (Kim Ki-joo)). 다음 파일(slpr)을 적당한 곳(예: /usr/local/bin)에 설치해두면 도움이 될 것이다. 비록 표준 입력을 통한 파이프 방식 또는 하나의 인자만을 받아들이는 제약점이 있지만, smbprint가 동작하지 않을 경우 훌륭한 대용품으로 사용할 수 있다. 원래 시스템에서 제공하는 lpr을 lpr.org로 변경하고 slpr을 lpr로 심볼릭 링크를 걸어두면 감쪽같이 일반 사용자를 속일 수 있을 것이다.

--------------------- slpr ------------------------------------------------
#!/bin/csh -f
#
# printing service using samba
# Written by kijoo

if ($#argv == 0) then
    cat - > /tmp/smblpr$$
    echo "print /tmp/smblpr$$" | \
		/usr/local/samba/bin/smbclient '\\dark\lp' -N -P
    rm /tmp/smblpr$$
else
    echo "print $1" | /usr/local/samba/bin/smbclient '\\dark\lp' -N -P
endif
---------------------------------------------------------------------------
(주의: '\\dark\lp' 부분을 상황에 맞게 설정한다.)

간단하게 PC용 lpd를 구해서 설치하는 방법도 있다. 하지만 ftpd와 마찬가지로 대부분이 상용이므로 불필요한 추가비용이 들게 된다. 이렇게 PC쪽을 이용하면 직렬 선이 아니라 병렬 선을 사용하므로 인쇄속도가 획기적으로 개선되며 (네트웍 카드가 내장된 프린터인 경우는 해당 무.), 유닉스 사용시 발생하는 제한된 프린터 버퍼 크기 문제가 저절로 해결된다는 부가적인 장점이 있다.



박재호
1999년2월26일 (금), 오후 3시9분25초