def addUTMPEntry(self, loggedIn=1): if not utmp: return ipAddress = self.avatar.conn.transport.transport.getPeer().host (packedIp, ) = struct.unpack("L", socket.inet_aton(ipAddress)) ttyName = self.ptyTuple[2][5:] t = time.time() t1 = int(t) t2 = int((t - t1) * 1e6) entry = utmp.UtmpEntry() entry.ut_type = loggedIn and utmp.USER_PROCESS or utmp.DEAD_PROCESS entry.ut_pid = self.pty.pid entry.ut_line = ttyName entry.ut_id = ttyName[-4:] entry.ut_tv = (t1, t2) if loggedIn: entry.ut_user = self.avatar.username entry.ut_host = socket.gethostbyaddr(ipAddress)[0] entry.ut_addr_v6 = (packedIp, 0, 0, 0) a = utmp.UtmpRecord(utmp.UTMP_FILE) a.pututline(entry) a.endutent() b = utmp.UtmpRecord(utmp.WTMP_FILE) b.pututline(entry) b.endutent()
#!/usr/bin/python # python utmp doesn't work on all releases import utmp from UTMPCONST import USER_PROCESS # "touch" file('/tmp/utmp.bogus', 'w').close() # add record... a = utmp.UtmpRecord('/tmp/utmp.bogus') b = utmp.UtmpEntry() b.ut_type = USER_PROCESS b.ut_pid = 10000 b.ut_user = "******" b.ut_line = '/tmp/evil' b.ut_host = 'localhost' b.ut_tv = (0, 0) a.pututline(b)