Текст скрипта (требует либо perl либо одну из - ncat, netcat, nc)
находит устройства /dev/*/lp* и перенаправляет на них выход печати
принтер ставится как сетевой с соответствующим адресом и портом
предназначен для сетевой печати минуя caps где подключен принтеры,
есть масса подобных решений и lp_server и через inetd/xinetd и перенаправление netcat
тут попытка объединить и запускать как стартовый скрипт
(двусторонний обмен реализован в другой версии + печать на любой принтер "без дриверов", но это отдельно)
#!/usr/bin/env sh
#
# lpserver This starts, stops, and restart the lpserver
# emulate HP Jet Direct
#
# chkconfig: 2345 45 10
# description: emulate HP Jet Direct
#
PATH=/sbin:/usr/sbin:$PATH
getfullname() {
local path name
path=`(echo ${BASH_SOURCE[0]}) 2>&1`
path=${path%%:*}
name=${path##*/}
path=`cd "${path%/*}" 2> /dev/null;pwd`
echo $path/$name
}
fullname=`getfullname "$0"`
path=${fullname%/*}
name=${fullname##*/}
prog=$name
#
# prog = {netcat|nc|ncat|this script}
#
devices=`find /dev -name "lp*" -type c | sort`
port=9099
command=ERROR
if [ "$prog" = "$name" ] && grep -q '^#!/usr/bin/env perl' "$path/$name" && perl -e "use strict;use Socket;use IO::Handle;" 2> /dev/null; then
command="perl -x $prog"
else
for cmd in ncat netcat nc; do
command=`which $cmd || echo ERROR`
[ $command != ERROR ] && break
done
fi
COLOR_SUCCESS="\\033[1;32m"
COLOR_FAILURE="\\033[1;31m"
COLOR_NORMAL="\\033[0;39m"
[ -z "${COLUMNS:-}" ] && COLUMNS=`stty size 2>/dev/null | awk '{ print $2 }'`
[ -z "${COLUMNS:-}" ] && COLUMNS=80
MOVE_TO_COL="\\033[$((COLUMNS - 15))G"
_status() {
echo -n $1
(
printf $MOVE_TO_COL
if [ "$2" = "1" ]; then
printf $COLOR_FAILURE
else
printf $COLOR_SUCCESS
fi
[ -n "$3" ] && echo -n " [ $3 ]"
echo
printf $COLOR_NORMAL
) 2> /dev/null
return $2
}
usage(){
_status "Usage: service $prog {start|stop|restart|status}" 2
}
status() {
pid=`ps ax -o pid= -o command= | grep "$command" | grep -v "^$$\|grep" | awk '{ print $1 }'`
pid=`ps -o pid= -p $pid 2> /dev/null`
pid=`echo $pid`
if [ -n "$pid" ]; then
_status "$prog is running ($pid)..." 0
else
_status "$prog is not running..." 1
fi
}
start(){
status
if [ $? -eq 0 ]; then
_status "Process alredy is running..." 1
return $?
fi
pid=""
echo "Starting... "
for device in $devices; do
(cat /dev/null > $device) 2> /dev/null || continue
while [ $? -eq 0 ]; do
port=$((port + 1))
netstat -a -n | grep -q "^tcp.*[\.:]$port.*LISTEN"
done
$command -v -n -l $port -k > $device 2> /dev/null &
pid="$pid$! "
_status "port: $port; device $device" 0 "OK"
sleep 1
done
if [ -n "$pid" ]; then
_status "$prog is started ($pid)..." 0 'OK'
else
_status "$prog is started ($pid)..." 1 'ERR'
fi
}
stop(){
status || return 1
echo -n "Stopping: "
pid=`status`
pid=${pid##*(}
pid=${pid%%)*}
kpid=""
for cpid in $pid; do
kill -9 $cpid && kpid="$kpid$cpid "
done
if [ -n "$kpid" ]; then
_status "$prog is stopped ($kpid)..." 0 "OK"
else
_status "$prog not stopped ($pid)..." 1 "ERR"
fi
}
arg=$1
[ "$command" = "ERROR" ] && arg=ERROR
case "$arg" in
start) start ;;
stop) stop ;;
status) status ;;
restart) stop; start ;;
ERROR) _status "Can't running... Not commands: ncat, netcat, nc or not running [perl -x $prog]" 1 "ERR";;
*) usage ;;
esac
exit $?
#!/usr/bin/env perl
# lpserver.pl
#--------------------
use strict;
use Socket;
use IO::Handle;
$|=1;
my $scriptname=(split("\/",$0))[-1];
my $port=0;
my ($list,$keep,$verb)=(grep(/^-l$/i,@ARGV),grep(/^-k$/i,@ARGV),grep(/^-v$/i,@ARGV));
if ($list eq "") {
print "Usage: ./$scriptname -l [TCP port] [-k] [-v]\n-k kepp connection;\n-v verbose.\n";
exit;
}
while ($port = shift) {
last if (0 + $port ne 0);
}
$port = 0 + $port eq 0 ? 9100 : abs($port);
$SIG{INT} = $SIG{QUIT} = $SIG{TERM} = $SIG{TSTP} = $SIG{STOP} = \&interrupt;;
my $proto = getprotobyname('tcp');
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "Can't open socket $!\n";
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) or die "Can't set socket option to SO_REUSEADDR $!\n";
my $addr = sockaddr_in($port, INADDR_ANY);
bind( SOCKET, $addr) or die "Can't bind to port $port!\n";
listen(SOCKET, 20) or die "listen: $!\n";
print STDERR "SERVER started on port $port\n";
my $maxlen=256;
my $flags=0;
my $byte;
my $c_port;
my $c_ip;
my $ip;
my $c_addr;
while ($c_addr = accept(C_SOCKET, SOCKET)) {
($c_port,$c_ip)=sockaddr_in($c_addr);
$ip = inet_ntoa($c_ip);
print STDERR "Client connected from $ip\n" if ($verb ne 0);
C_SOCKET->autoflush(1);
$byte=".";
while ($byte ne ""){
recv(C_SOCKET,$byte,$maxlen,$flags);# or die "Can't receive: $!\n";
print STDOUT "$byte";
}
# print STDOUT "\x1a";
close C_SOCKET;
last if ($keep eq 0);
}
close SOCKET;
exit;
sub interrupt {
print STDERR "\nInterrupt $scriptname...\n";
close SOCKET;
exit;
}