.\" Portions of this file are subject to the following copyright.  See
.\" the Net-SNMP's COPYING file for more details and other copyrights
.\" that may apply:
.\" /***********************************************************
.\" 	Copyright 1988, 1989 by Carnegie Mellon University
.\" 
.\"                       All Rights Reserved
.\" 
.\" Permission to use, copy, modify, and distribute this software and its 
.\" documentation for any purpose and without fee is hereby granted, 
.\" provided that the above copyright notice appear in all copies and that
.\" both that copyright notice and this permission notice appear in 
.\" supporting documentation, and that the name of CMU not be
.\" used in advertising or publicity pertaining to distribution of the
.\" software without specific, written prior permission.  
.\" 
.\" CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
.\" ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
.\" CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
.\" ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
.\" WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
.\" ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
.\" SOFTWARE.
.\" ******************************************************************/
.\" Portions of this file are copyrighted by:
.\" Copyright Copyright 2003 Sun Microsystems, Inc. All rights reserved.
.\" Use is subject to license terms specified in the COPYING file
.\" distributed with the Net-SNMP package.
.\" ******************************************************************/
.TH SNMPTRANSLATE 1 "13 Nov 2013" VVERSIONINFO "Net-SNMP"
.SH NAME
snmptranslate - translate MIB OID names between numeric and textual forms
.SH SYNOPSIS
.B snmptranslate
[OPTIONS] OID [OID]...
.SH DESCRIPTION
.B snmptranslate
is an application that translates one or more SNMP object identifier
values from their symbolic (textual) forms into their numerical forms
(or vice versa).  
.PP
OID is either a numeric or textual object identifier.
.SH OPTIONS
.TP 8
.B \-D\fI[TOKEN[,...]]
Turn on debugging output for the given
.IR "TOKEN" "(s)."
Try
.IR ALL
for extremely verbose output.
.TP
.B \-h
Display a brief usage message and then exit.
.TP
.BI \-m " MIBLIST"
Specifies a colon separated list of MIB modules to load for this
application.  This overrides the environment variable MIBS.
.IP
The special keyword
.I ALL
is used to specify all modules in all directories when searching for MIB
files.  Every file whose name does not begin with "." will be parsed as
if it were a MIB file.
.TP
.BI \-M " DIRLIST"
Specifies a colon separated list of directories to search for MIBs.
This overrides the environment variable MIBDIRS.
.TP
.BI \-T " TRANSOPTS"
Provides control over the translation of the OID values.  The
following
.I TRANSOPTS
are available:
.RS
.TP 6
.B \-TB
Print all matching objects for a regex search.
.TP
.B \-Td
Print full details of the specified OID.
.TP
.B \-Tp
Print a graphical tree, rooted at the specified OID.
.TP
.B \-Ta
Dump the loaded MIB in a trivial form.
.TP
.B \-Tl
Dump a labeled form of all objects.
.TP
.B \-To
Dump a numeric form of all objects.
.TP
.B \-Ts
Dump a symbolic form of all objects.
.TP
.B \-Tt
Dump a tree form of the loaded MIBs (mostly useful for debugging).
.TP
.B \-Tz
Dump a numeric and labeled form of all objects (compatible with MIB2SCHEMA format).
.RE
.TP
.B \-V
Display version information for the application and then exit.
.TP
.BI \-w " WIDTH"
Specifies the width of
.B \-Tp
and
.B \-Td
output. The default is very large.
.PP
In addition to the above options, 
.B snmptranslate
takes the OID input 
.RB ( \-I ),
MIB parsing
.RB ( \-M )
and OID output
.RB ( \-O )
options described in the 
.BR "INPUT OPTIONS" ", " "MIB PARSING OPTIONS" " and " "OUTPUT OPTIONS"
sections of the
.I snmpcmd(1) 
manual page.
.SH EXAMPLES
.IP \(bu 4
snmptranslate \-On \-IR sysDescr
.br
will translate "sysDescr" to a more qualified form:
.IP
system.sysDescr
.IP \(bu 4
snmptranslate \-Onf \-IR sysDescr
.br
will translate "sysDecr" to:
.IP
.RI .iso.org.dod.internet.mgmt.mib\-2.system.sysDescr
.IP \(bu 4 
snmptranslate \-Td \-OS system.sysDescr
.br
will translate "sysDecr" into:
.IP
.nf
SNMPv2\-MIB::sysDescr
sysDescr OBJECT\-TYPE
  \-\- FROM SNMPv2\-MIB
  \-\- TEXTUAL CONVENTION DisplayString
  SYNTAX OCTET STRING (0..255)
  DISPLAY\-HINT "255a"
  MAX\-ACCESS read\-only
  STATUS current
  DESCRIPTION "A textual description of the entity. This
               value should include the full name and
               version identification of the system's
               hardware type, software operating\-system,
               and networking software."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib\-2(1) system(1) 1 }
.fi
.IP \(bu 4 
snmptranslate \-Tp \-OS system
.br
will print the following tree:
.IP
.nf
+--system(1)
   |
   +-- -R-- String    sysDescr(1)
   |        Textual Convention: DisplayString
   |        Size: 0..255
   +-- -R-- ObjID     sysObjectID(2)
   +-- -R-- TimeTicks sysUpTime(3)
   +-- -RW- String    sysContact(4)
   |        Textual Convention: DisplayString
   |        Size: 0..255
   +-- -RW- String    sysName(5)
   |        Textual Convention: DisplayString
   |        Size: 0..255
   +-- -RW- String    sysLocation(6)
   |        Textual Convention: DisplayString
   |        Size: 0..255
   +-- -R-- Integer   sysServices(7)
   +-- -R-- TimeTicks sysORLastChange(8)
   |        Textual Convention: TimeStamp
   |
   +--sysORTable(9)
      |
      +--sysOREntry(1)
         |
         +-- ---- Integer   sysORIndex(1)
         +-- -R-- ObjID     sysORID(2)
         +-- -R-- String    sysORDescr(3)
         |        Textual Convention: DisplayString
         |        Size: 0..255
         +-- -R-- TimeTicks sysORUpTime(4)
                  Textual Convention: TimeStamp

.fi
.PP
.IP \(bu 4
snmptranslate \-Ta | head
.br
will produce the following dump:
.IP
.nf
dump DEFINITIONS ::= BEGIN
org ::= { iso 3 }
dod ::= { org 6 }
internet ::= { dod 1 }
directory ::= { internet 1 }
mgmt ::= { internet 2 }
experimental ::= { internet 3 }
private ::= { internet 4 }
security ::= { internet 5 }
snmpV2 ::= { internet 6 }
.fi
.PP
.IP \(bu 4
snmptranslate \-Tl | head
.br
will produce the following dump:
.IP
.nf
.RI .iso(1).org(3)
.RI .iso(1).org(3).dod(6)
.RI .iso(1).org(3).dod(6).internet(1)
.RI .iso(1).org(3).dod(6).internet(1).directory(1)
.RI .iso(1).org(3).dod(6).internet(1).mgmt(2)
.RI .iso(1).org(3).dod(6).internet(1).mgmt(2).mib\-2(1)
.RI .iso(1).org(3).dod(6).internet(1).mgmt(2).mib\-2(1).system(1)
.RI .iso(1).org(3).dod(6).internet(1).mgmt(2).mib\-2(1).system(1).sysDescr(1)
.RI .iso(1).org(3).dod(6).internet(1).mgmt(2).mib\-2(1).system(1).sysObjectID(2)
.RI .iso(1).org(3).dod(6).internet(1).mgmt(2).mib\-2(1).system(1).sysUpTime(3)
.fi
.PP
.IP \(bu 4
snmptranslate \-To | head
.br
will produce the following dump
.IP
.nf
.RI .1.3
.RI .1.3.6
.RI .1.3.6.1
.RI .1.3.6.1.1
.RI .1.3.6.1.2
.RI .1.3.6.1.2.1
.RI .1.3.6.1.2.1.1
.RI .1.3.6.1.2.1.1.1
.RI .1.3.6.1.2.1.1.2
.RI .1.3.6.1.2.1.1.3
.fi
.PP
.IP \(bu 4
snmptranslate \-Ts | head
.br
will produce the following dump
.IP
.nf
.RI .iso.org
.RI .iso.org.dod
.RI .iso.org.dod.internet
.RI .iso.org.dod.internet.directory
.RI .iso.org.dod.internet.mgmt
.RI .iso.org.dod.internet.mgmt.mib\-2
.RI .iso.org.dod.internet.mgmt.mib\-2.system
.RI .iso.org.dod.internet.mgmt.mib\-2.system.sysDescr
.RI .iso.org.dod.internet.mgmt.mib\-2.system.sysObjectID
.RI .iso.org.dod.internet.mgmt.mib\-2.system.sysUpTime
.fi
.PP
.IP \(bu 4
snmptranslate \-Tt | head
.br
will produce the following dump
.IP
.nf
  org(3) type=0
    dod(6) type=0
      internet(1) type=0
        directory(1) type=0
        mgmt(2) type=0
          mib\-2(1) type=0
            system(1) type=0
              sysDescr(1) type=2 tc=4 hint=255a
              sysObjectID(2) type=1
              sysUpTime(3) type=8
.fi
.SH "SEE ALSO"
snmpcmd(1), variables(5), RFC 2578-2580.
