This file is indexed.

/usr/bin/expect_lpunlock is in expect 5.45-7.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
#!/bin/sh
# -*- tcl -*-
# The next line is executed by /bin/sh, but not tcl \
exec tclsh8.6 "$0" ${1+"$@"}

package require Expect


# This script unhangs a printer which claims it is "waiting for lock".
# Written by Don Libes.  Based on English instructions from Scott Paisley.

# lpunlock figures out if the printer is on a server, and if so which,
# by looking in the local printcap file.  (You can override this by
# supplying a server name as an additional argument.)  It then rlogins
# to the server, recreates the device and resets the queue via lpc.

# assumes user has root privs on remote host via /.rhosts

# assumes printer is name of device on remote system

proc usage {} {
	send_user "usage: lpunlock <printer> \[<server>\]\n"
	send_user "example: lpunlock lw-isg durer\n"
	exit
}

if {$argc==0} usage
set printer [lindex $argv 0]

set client [exec hostname]

if {$argc == 1} {
	# if no arg2, look in local printcap for info
	spawn ed /etc/printcap
	expect "\n"			;# discard character count
	send "/$printer/\r"
	for {} {1} {} {
		expect -re ".*:rm=(\[^:]*):.*\r\n" {
			set server $expect_out(1,string)
			break
		} "\r\n*\\\r\n" {	;# look at next line of entry
			send "\r"
		} "\r\n*\n" {		;# no more lines of entry - give up
			set server $client
			break
		}
	}
} else {
	if {$argc == 2} {
		set server [lindex $argv 1]
	} else usage
}

set whoami [exec whoami]
if {[string match $server $client] && [string match $whoami "root"]} {
	spawn csh
	expect "# "
} else {
	# login to the print server as root.
	# Set timeout high because login is slow.
	set timeout 60
	spawn rlogin $server -l root
	expect	timeout	exit \
		eof exit \
		"Password*" {
			send_user "\ncouldn't login to $server as root\n"
			exit
		} "1#*"
	set timeout 10
}

# run lpc and 'stop printer'
send lpc\r				; expect "lpc>*"
send stop $printer\r			; expect "unknown*" exit \
						"disabled*lpc>*"

# exit lpc and cd /dev
send quit\r				; expect "#*"
send cd /dev\r				; expect "#*"

# figure out major/minor device numbers
send ls -l /dev/$printer\r		; expect timeout {
	send_user "\nbad device - couldn't get major/minor numbers\n"; exit
						} "crw*#*"
scan $expect_out(buffer) "ls -l %*s %*s 1 root %d, %d" major minor

# delete the lock and the printer device itself
send rm /var/spool/$printer/lock /dev/$printer\r	; expect #*

# recreate the printer device
send mknod $printer c $major $minor\r	; expect #*

# run lpc and 'start printer'
send lpc\r				; expect lpc>*
send start $printer\r			; expect started*lpc>*
send quit\r				; expect #*

# logout
send exit\r				; expect eof

send_user Printer unlocked and restarted.\n