📄 vampiredriversfunctions
字号:
#!/bin/bash######################################################################### smb.conf parser class#### Copyright (C) Kurt Pfeifle <kpfeifle@danka.de>, 2004.#### This program is free software; you can redistribute it and/or modify## it under the terms of the GNU General Public License as published by## the Free Software Foundation; either version 2 of the License, or## (at your option) any later version.#### This program is distributed in the hope that it will be useful,## but WITHOUT ANY WARRANTY; without even the implied warranty of## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the## GNU General Public License for more details.#### You should have received a copy of the GNU General Public License## along with this program; if not, write to the Free Software## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.################################################################################################################################################ Here an example calling sequence##!/bin/sh ## set -x## source VampireDriversFunctions#### Start local variables#### You must define these variable (possibly in a source script)## nthost=192.168.17.1## printeradmin=Administrator## adminpasswd=not4you## smbhost=knoppix## smbprinteradmin=knoppix## smbadminpasswd=knoppix#### End of local variables###### functions to call#### fetchenumdrivers3listfromNThost # repeat, if no success at first## createdrivernamelist ## createprinterlistwithUNCnames # repeat, if no success at first## createmapofprinterstodriver## splitenumdrivers3list## makesubdirsforWIN40driverlist## splitWIN40fileintoindividualdriverfiles## fetchtheWIN40driverfiles## uploadallWIN40drivers## makesubdirsforW32X86driverlist## splitW32X86fileintoindividualdriverfiles## fetchtheW32X86driverfiles## uploadallW32X86drivers## End of example calling sequence####################################################################### -----------------------------------------------------------------------------# -----------------------------------------------------------------------------function vampiredrivers_readme(){echo -e " \n\############################################################################# # About the \"Vampire Printer Drivers\" set of functions....# --------------------------------------------------------## (C) Kurt Pfeifle <kpfeifle@danka.de>, 2004# License: GPL## ------------------------------------------------------------## Version: 0.8 (largely \"self-documented\" now, but not yet # completely -- if it ever will be....)## Thanks a lot to Fabian Franz for helping me with some important# Bash-Scripting-Questions!## This set of functions provides a framework to snatch all printer# driver info and related files from a Windows NT print server.# It then uploads and installs the drivers to a Samba server. (The# Samba server needs to be prepared for this: a valid [print$]# share, with write access set for a \"printer admin\".)## The main commands used are \"smbclient\" and \"rpcclient\" combined# with \"grep\", \"sed\" and \"awk\". Probably a Perl or Python script# would be better suited to do this, mainly because we have to cope# with printer and driver names which are containing spaces in# them, so a lot of shell escaping is required to handle these.# Also, I am not very savvy in scripting, so I invented some very# obscure methods to work around my knowledge gaps. When I download# the driver files from the Windows NT box, I put all related driver# files into their own sub directory, using the same name as the# driver. Also, driver versions \"0\", \"2\" and \"3\" are placed in# further subdirectories.## # Known problems: # --------------- # # 1) I found one printer driver containing a \"slash\" which is not # handled by this script: \"HP Color LaserJet 5/5M PS\". (There # are more of these in the wild, of course.) -- The reason: I # didn't find a way to create a Unix directory containing a \"slash\".# UPDATE: The script replaces the \"/\" with a \"_\" and also renames# the drivername accordingly, when it is uploaded to the Samba # [print$] share....# # 2) There is an unsolved problem in case a real file name deviates # in its case sensitive spelling from how it is displayed by the # \"rpcclient enumdrivers\" command. I encountered cases where # rpcclient displayed \"PS5UI.DLL\" as a file name, but \"smbclient # mget\" retrieved \"ps5ui.dll\" from the NT printserver, and the # driverinstallation failed because \"smbclient mput\" tried to put # \"PS5UI.DLL\" back onto the Samba server where UNIX only had# \"ps5ui.dll\" available (which of course failed). -- UPDATE: this# is now solved. All files are renamed now to the same # case-sensitive spelling as \"rpcclient ... enumdrivers 3\" # announces. This includes renaming into both, uppercase or# lowercase, as the case might be....# # 3) This script is probably not portable at all and relies on lots# of Bash-isms.# # 4) This script runs with rpcclient from Samba-3.0.2a (or later) only# (because it uses the \"Version\" parameter for \"adddriver\").## The following functions use a few external variables to log# into the 2 hosts. We suggest that you create a file which # contains the variables and that you source that file at the# beginning of this script... # # ################################################################### ntprinteradmin=Administrator # any account on the NT host # # with \"printer admin\" privileges# ntadminpasswd=not4you # the \"printer admin\" password on # # the NT print server# nthost=windowsntprintserverbox # the netbios name of the NT print # # server# # smbprinteradmin=knoppix # an account on the Samba server # # with \"printer admin\" privileges# smbadminpasswd=2secret4you # the \"printer admin\" password on # # the Samba server# smbhost=knoppix # the netbios name of the Samba # # print server## ################################################################### # NOTE: these functions also work for 2 NT print servers: snatch all # drivers from the first, and upload them to the second server (which # takes the role of the \"Samba\" server). Of course they also work # for 2 Samba servers: snatch all drivers from the first (which takes # the role of the NT print server) and upload them to the second....# # # ............PRESS \"q\" TO QUIT............" \|less}#set -x# -----------------------------------------------------------------------------# ----------- print a little help... ------------------------------------------# -----------------------------------------------------------------------------function helpwithvampiredrivers(){if stringinstring help $@ ; thenhelpwithvampiredrivers ;else echo " "; echo " 1. Run the functions of this script one by one."; echo " "; echo " 2. List all functions with the \"enumallfunctions\" call."; echo " "; echo " 3. After each functions' run, check if it completed successfully."; echo " "; echo " 4. For each function, you can ask for separate help by typing"; echo " \"<functionname> --help\"." echo " "; echo " 5. Often network conditions prevent the MS-RPC calls" echo " implemented by Samba to succeed at the first attempt." echo " You may have more joy if you try more than once or twice...."; echo " "; echo " 6. I can not support end-users who have problems with this script." echo " However, we are available for paid, professional consulting," echo " training and troubleshooting work."; echo " "; echo " ";fi}# -----------------------------------------------------------------------------# ----------- enumerate all builtin functions... ------------------------------# -----------------------------------------------------------------------------function enumallfunctions(){if stringinstring help $@ ; thenhelpwithvampiredrivers ;else echo " " echo " " echo "--> Running now function enumallfunctions()..." echo "==============================================" echo -e " \n\ NOTE: run the listed functions in the same order as listed below. EXAMPLE: \"knoppix@ttyp6[knoppix]$ helpwithvampiredrivers\" HELP: the \"--help\" parameter prints usage hints regarding a function. EXAMPLE: \"knoppix@ttyp6[knoppix]$ fetchenumdrivers3listfromNThost --help\" function vampiredrivers_readme() function enumallfunctions() function helpwithvampiredrivers() function fetchenumdrivers3listfromNThost() # repeat, if no success at first function createdrivernamelist() function createprinterlistwithUNCnames() # repeat, if no success at first function createmapofprinterstodrivers() function splitenumdrivers3list() function makesubdirsforW32X86driverlist() function splitW32X86fileintoindividualdriverfiles() function fetchallW32X86driverfiles() function uploadallW32X86drivers() function makesubdirsforWIN40driverlist() function splitWIN40fileintoindividualdriverfiles() function fetchallWIN40driverfiles() function uploadallWIN40drivers()" echo " "fi}# this is a helperfunction (Thanks to Fabian Franz!)function stringinstring(){ case "$2" in *$1*) return 0 ;; esac return 1}# -----------------------------------------------------------------------------# ----------- Create an "enumprinters 3" list --------------------- -----------# -----------------------------------------------------------------------------#function helpwithfetchenumdrivers3listfromNThost(){echo -e " \n\################################################################################# # About fetchenumdrivers3listfromNThost()....# -------------------------------------------## PRECONDITIONS: 1) This function expects write access to the current directory. # 2) This function expects to have the '\$nthosts', # '\$ntprinteradmin' and '\$ntadminpasswd' variables set to # according values.## WHAT IT DOES: This function connects to the '\$nthost' (using the credentials# '\$ntprinteradmin' with '\$ntadminpasswd', retrieves a list of # drivers (with related file names) from that host, and saves the# list under the name of '\${nthost}/enumdrivers3list.txt' (ie. it# also creates the '\$nthost' subdirectory in the current one). It# further prints some more info to stdout.## IF IT DOESN'T WORK: It may happen that the function doesn't work at the first# time (there may be a connection problem). Just repeat a# few times. It may work then. You will recognize if it # does.## HINT: The current values: 'nthost'=\"$nthost\"# 'ntprinteradmin'=\"$ntprinteradmin\"# 'ntadminpasswd'=<not shown here, check yourself!># ################################################################################"echo " "}# -----------------------------------------------------------------------------function fetchenumdrivers3listfromNThost(){if stringinstring help $@ ; thenhelpwithfetchenumdrivers3listfromNThost;else echo " " echo " " echo "--> Running now function fetchenumdrivers3listfromNThost" echo "========================================================" [ -d ${nthost} ] || mkdir "${nthost}"; rpcclient -U${ntprinteradmin}%${ntadminpasswd} -c 'enumdrivers 3' ${nthost} \ | sed -e '/^.*Driver Name: \[.*\]/ y/\//_/' \ | tee \ ${nthost}/enumdrivers3list.txt; NUMBEROFDIFFERENTDRIVERNAMES=$( grep "Driver Name:" ${nthost}/enumdrivers3list.txt \ | sort -f \ | uniq \ | wc -l ); echo " "; echo "--> Finished in running function fetchenumdrivers3listfromNThost...."; echo "====================================================================" echo "NUMBEROFDIFFERENTDRIVERNAMES retrieved from \"${nthost}\" is $NUMBEROFDIFFERENTDRIVERNAMES".; echo " --> If you got \"0\" you may want to try again. <---"; echo "================================================================"; echo " "; enumdrivers3list=`cat ${nthost}/enumdrivers3list.txt`;fi}# -----------------------------------------------------------------------------# ----------- Create a list of all available drivers installed ----------------# ------------------------on the NT print server-------------------------------# -----------------------------------------------------------------------------#function helpwithcreatedrivernamelist(){echo -e " \n\################################################################################# # About createdrivernamelist()...# -------------------------------## PRECONDITIONS: 1) This function expects to find the subdirectory '\$nthost' # and the file '\${nthost}/enumdrivers3list.txt' to exist.# 2) This function expects to have the '\$nthosts' variable set # to an according value.## WHAT IT DOES: This function dissects the '\${nthost}/enumdrivers3list.txt' # and creates other textfiles from its contents:# - '\${nthost}/drvrlst.txt'# - '\${nthost}/completedriverlist.txt'# and further prints some more info to stdout.## HINT: The current value: 'nthost'=\"$nthost\"# ################################################################################"}# -----------------------------------------------------------------------------function createdrivernamelist(){if stringinstring help $@ ; thenhelpwithcreatedrivernamelist;else echo " "; echo " "; echo "--> Running now function createdrivernamelist...."; echo "================================================="; cat ${nthost}/enumdrivers3list.txt \ | grep "Driver Name:" \ | awk -F "[" '{ print $2 }' \ | awk -F "]" '{ print $1 }' \ | sort -f \ | uniq \ | tr / _ \ | sed -e 's/$/\"/' -e 's/^ */\"/' \ | tee \ ${nthost}/drvrlst.txt; drvrlst=$(echo ${nthost}/drvrlst.txt); cat ${nthost}/enumdrivers3list.txt \ | grep "Driver Name:" \ | awk -F "[" '{ print $2 }' \ | awk -F "]" '{ print $1 }' \ | sort -f \ | uniq \ | sed -e 's/$/\"/' \ | cat -n \ | sed -e 's/^ */DRIVERNAME/' -e 's/\t/\="/' \ | tee \ ${nthost}/completedriverlist.txt; NUMBEROFDRIVERS=`cat ${nthost}/completedriverlist.txt| wc -l`; echo " "; echo "--> Finished in running function createdrivernamelist...."; echo "===============================================================================" echo "NUMBEROFDRIVERS retrieve-able from \"${nthost}\" is $NUMBEROFDRIVERS".; echo " --> If you got \"0\" you may want to run \"fetchenumdrivers3listfromNThost\"" echo " again. <---"; echo "==============================================================================="; echo " "; driverlist=`cat ${nthost}/completedriverlist.txt`; # alternative method suggested by Fabian Franz: # | awk 'BEGIN {n=1} { print "DRIVERNAME"n"=\""$0"\""; n=n+1 } 'fi}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -