# rm-rf.es | Administración de sistemas

Blog de un SysAdmin Unix, Gnu/Linux, Windows y lo que haga falta.

ESXi SSH: comandos útiles de VMware CLI

A continuación os dejo un resumen de los comandos más básicos y utilizados a través de la shell y SSH de un host ESXi VMware. Por defecto, los hosts ESXi no tienen habilitado ni el servicio SSH ni el ESXi Shell. Es necesario activarlo manualmente del siguiente modo:

  1. Acceder al vCenter Server o al Host usando el cliente vSphere.
  2. Seleccionar el host del panel izquierdo o del inventario.
  3. Hacer click en la pestaña de configuración y luego en perfil de seguridad (Security Profile)
  4. En la sección ed servicios, hacer click en propiedades.
  5. Seleccionar ESXi Shell y SSH de la lista
  6. Hacer click en “opciones” y elegir “Start and stop manually” o “Start and stop with host” según si queremos únicamente arrancarlo para un momento o queremos que sea persistente a reinicios.

Comandos y operaciones del host ESXi

Información extendida del host ESXi

El comando “esxcfg-info” muestra información extendida del hardware del host ESXi:

~ # esxcfg-info | more
+Host : 
   \==+Hardware Info : 
      |----BIOS UUID................................................0xff 0x20 0x0 0x8 0xff 0xff 
      |----Product Name.............................................SUN BLADE X4-2B 
      |----Vendor Name..............................................Oracle Corporation
      |----Serial Number............................................XXXXX            
      |----Hardware Uptime..........................................744880994637 
      |----Ipmi Supported...........................................true
      \==+PCI Info : 
         \==+All Pci Devices : 
            \==+PCI Device : 
               |----Segment.........................................0x0000 
               |----Bus.............................................0x00 
               |----Slot............................................0x00 
               |----Function........................................0x00 
               |----Runtime Owner...................................vmkernel
               |----Has Configured Owner............................false
               |----Configured Owner................................
               |----Vendor Id.......................................0x8086 
               |----Device Id.......................................0x0e00 
               |----Sub-Vendor Id...................................0x108e 
               |----Sub-Device Id...................................0x434c 
               |----Vendor Name.....................................Intel Corporation
               |----Device Name.....................................Ivytown DMI2
               |----Device Class....................................1536 
               |----Device Class Name...............................Host bridge
               |----PIC Line........................................0 
               |----Old IRQ.........................................255 
               |----Vector..........................................0 
               |----PCI Pin.........................................4 
               |----Spawned Bus.....................................0 
               |----Flags...........................................521 
               \==+BAR Info : 
[...]

El TOP de VMware

El comando “esxtop” tiene prácticamente las mismas funcionalidades que el comando TOP de Linux:

~ # esxtop

Reiniciar todos los servicios de un host ESXi

~ #  /sbin/services.sh restart

Modo mantenimiento del ESXi Host

Los siguientes comandos activan y deshabilitan el modo de mantenimento de un Host ESXi:

~ # vim-cmd hostsvc/maintenance_mode_enter
~ # vim-cmd hostsvc/maintenance_mode_exit

Comandos de networking

Ver interfaces de red

El comando “esxcfg-nics” permite gestionar las interfaces de red del host ESXi y el parámetro “-l” las lista:

~ # esxcfg-nics -l
Name    PCI           Driver      Link Speed     Duplex MAC Address MTU    Description                   
vmnic0  0000:20:00.00 igb         Down 0Mbps     Half   00:10:e0: 1500   Intel Corporation I350 Gigabit Network Connection
vmnic1  0000:20:00.01 igb         Down 0Mbps     Half   00:10:e0: 1500   Intel Corporation I350 Gigabit Network Connection
vmnic2  0000:b0:00.00 ixgbe       Up   10000Mbps Full   00:1b:21: 1500   Intel Corporation 82599EB 10-Gigabit KX4 Network Connection
vmnic3  0000:b0:00.01 ixgbe       Up   10000Mbps Full   00:1b:21: 1500   Intel Corporation 82599EB 10-Gigabit KX4 Network Connection

Virtual Switches

Al igual que las interfaces de red, los virtual switches se pueden gestionar con el comando esxcfg-vswitch, para listarlos también usamos el parámetro “-l”:

~ # esxcfg-vswitch -l
Switch Name      Num Ports   Used Ports  Configured Ports  MTU     Uplinks   
vSwitch0         4352        18          128               1500    vmnic2,vmnic3

  PortGroup Name        VLAN ID  Used Ports  Uplinks   
  VM Network            4095    10          vmnic2,vmnic3
  VM Management Network 10      1           vmnic2,vmnic3
  iSCSI                 20      1           vmnic2,vmnic3
  Management Network    10      1           vmnic2,vmnic3

Tanto con las interfaces de red como los virtual switches podemos realizar operaciones avanzadas que normalmente se realizan gráficamente desde el vCenter.

Comandos de máquinas virtuales

Listado de máquinas virtuales

~ # vim-cmd vmsvc/getallvms
Vmid             Name       File         Guest OS
1      vCenter   [vmware01] vCenter.vmx  VMware vCenter Server Appliance
10     redhat1   [vmware01] redhat01.vmx Red Hat Enterprise Linux
[...]

Arrancar, parar o reiniciar una máquina virtual

A partir del Vmid que sacamos con el comando anterior podemos controlar el estado de la máquina virtual:

Arrancar máquina virtual

~ # vim-cmd vmsvc/power.on Vmid
~ # vim-cmd vmsvc/power.on 10

Parar máquina virtual

~ # vim-cmd vmsvc/power.off Vmid
~ # vim-cmd vmsvc/power.off 10

Reiniciar máquina virtual

~ # vim-cmd vmsvc/power.reboot Vmid
~ # vim-cmd vmsvc/power.reboot 10

Ver el estado de una máquina virtual

~ # vim-cmd vmsvc/power.getstate Vmid
~ # vim-cmd vmsvc/power.getstate 10

Ver información y configuración de una máquina virtual

~ # vim-cmd vmsvc/get.summary Vmid
~ # vim-cmd vmsvc/get.summary 10
Listsummary:

(vim.vm.Summary) {
   dynamicType = , 
   vm = 'vim.VirtualMachine:10', 
   runtime = (vim.vm.RuntimeInfo) {
      dynamicType = , 
      device = (vim.vm.DeviceRuntimeInfo) [
         (vim.vm.DeviceRuntimeInfo) {
[...]

Borrar una máquina virtual

El siguiente comando borra la máquina virtual, incluyendo tanto la configuración como el disco de la VM:

~ # vim-cmd vmsvc/destroy Vmid
~ # vim-cmd vmsvc/destroy 10

Instalar VMware Tools

El siguiente comando instala (o comienza la instalación) de las VMware tools en la máquina virtual. En el caso de un sistema Linux, por ejemplo, se montará el CD Virtual a través del cual podemos manualmente ejecutar la instalación.

~ # vim-cmd vmsvc/tools.install vmid
~ # vim-cmd vmsvc/tools.install 10

Registrar una máquina virtual en el inventario del host

Para añadir al inventario de un host una máquina virtual que se encuentra dentro de un datastore visible por el Host ESXi utilizamos el siguiente comando, siempre atacando al archivo de configuración de la máquina virtual (.vmx):

~ # vim-cmd solo/registervm /vmfs/vol/datastore01/rhel01/rhel01.vmx

Comandos iSCSI

Listar adaptadores iSCSI

~ # esxcli iscsi adapter list
Adapter  Driver     State   UID                              Description           
-------  ---------  ------  -------------------------------  ----------------------
vmhba33  iscsi_vmk  online  iqn.1998-01.com.vmware:7f2ab991  iSCSI Software Adapter

Dynamic Discovery de Targets iSCSI

~ # esxcli iscsi adapter discovery sendtarget add --address="ip/dns[:port]" --adapter="adapter_name"

Ejemplo:

~ # esxcli iscsi adapter discovery sendtarget add --address=192.168.1.100:3260 --adapter=vmhba33

Rescan y Rediscovery de dispositivos de almacenamiento

~ # esxcli iscsi adapter discovery rediscover
~ # esxcli storage core adapter rescan --adapter=vmhba33

Comandos SAN/Fibre Channel

Listar adaptadores FC, WWNN y WWPN

El siguiente comando muestra un listado de adaptadores FC, WWNN (World Wide node name) y “World Wide Por Name”

~ # esxcli storage san fc list
Adapter: vmhba33
   Port ID: 012820
   Node Name: 20:00:00:xx
   Port Name: 21:00:00:xx
   Speed: 10 Gbps
   Port Type: NPort
   Port State: ONLINE

Mostrar información de eventos Fibre Channel

~ # esxcli storage san fc events get
FC Event Log                                                
-------------------------------------------------------------
2014-05-13 11:28:45.431 [vmhba33] LINK UP                    
2014-05-13 14:25:42.514 [vmhba33] RSCN received for PID...
[...]

Personalizar PS1 prompt de forma sencilla

Tanto si sois lo suficientemente vagos como para personalizar el prompt PS1 (prompt string 1) de vuestra línea de comandos como si os resulta tedioso crearlo manualmente esta utilidad online os gustará.

La sintaxis del PS1 es un festival de contra-barras, barras, códigos de color y estilo y muchas otras ordenes más que pueden resultar complejas de generar manualmente. El PS1, para shells en bash se configura en el archivo ~/.bashrc, este sería un ejemplo:

export PS1="\[\e[00;37m\][\$?]\[\e[0m\]\[\e[01;32m\]\u\[\e[0m\]\[\e[00;37m\]@\[\e[0m\]\[\e[01;37m\]\h\[\e[0m\]\[\e[00;37m\]:[\w] \\$\[\e[0m\]"

Semejante línea únicamente para especificar:

  • Exit status code del comando anterior
  • Usuario de la shell en negrita y color verde
  • Hostname en negrita y color blanco
  • PWD en el que nos encontramos
  • Tipo de shell (usuario/superusuario).
[0]alex@hostname:[/usr/local/src] $

En el sitio web bashrcgenerator.com tenéis una interfaz a través de la cual podéis craer un PS1 simplemente arrastrando los distintos elementos y personalizándolos. Podéis añadir y quitar funciones, cambiar colores y estilo, cambiar el orden de los elementos, etc.

bashrc ps1 prompt generator

Podéis usarlo para generar el prompt PS1 base y luego modificarlo manualmente para añadir funcionalidades más avanzadas que ahí no aparezcan. Podemos por ejemplo añadir condiciones, realizar acciones según el resultado del comando anterior, visualizar el número en el que el comando se almacenará en el history, mostrar si hay jobs en background, etc En la página man de bash tenéis el listado de funcionalidades disponibles:

When executing interactively, bash displays the primary prompt PS1 when it is ready to read  a  command,  and the secondary prompt PS2 when it needs more input
to complete a command.  Bash allows these prompt strings to be customized by
inserting a number of backslash-escaped special characters that are decoded as follows:
\a     an ASCII bell character (07)
\d     the date in "Weekday Month Date" format (e.g., "Tue May 26")
\D{format} the format is passed to strftime(3) and the result is inserted into the prompt string; an empty format results in a locale-specific time representation.  The braces are required
\e     an ASCII escape character (033)
\h     the hostname up to the first `.'
\H     the hostname
\j     the number of jobs currently managed by the shell
\l     the basename of the shell's terminal device name
\n     newline
\r     carriage return
\s     the name of the shell, the basename of $0 (the portion following the final slash)
\t     the current time in 24-hour HH:MM:SS format
\T     the current time in 12-hour HH:MM:SS format
\@     the current time in 12-hour am/pm format
\A     the current time in 24-hour HH:MM format
\u     the username of the current user
\v     the version of bash (e.g., 2.00)
\V     the release of bash, version + patch level (e.g., 2.00.0)
\w     the  current  working  directory,  with  $HOME  abbreviated with a tilde (uses the value of the PROMPT_DIRTRIM variable)
\W     the basename of the current working directory, with $HOME abbreviated with a tilde
\!     the history number of this command
\#     the command number of this command
\$     if the effective UID is 0, a #, otherwise a $
\nnn   the character corresponding to the octal number nnn
\\     a backslash
\[     begin a sequence of non-printing characters, which could be used to embed  a  terminal  control sequence into the prompt
\]     end a sequence of non-printing characters

Poner un proceso en segundo plano y desasociarlo de la shell

La situación es la siguiente, tenemos una shell bash ejecutando un proceso cuyo tiempo de ejecución va a ser muy largo y necesitamos cerrar la shell, por supuesto no podemos parar el proceso y arrancarlo de nuevo. Para solucionar este problema podemos hacer uso de los comandos bg (recordad el artículo sobre gestión de trabajos en BASH (jobs, fg, bg, &… que escribí hace un tiempo) y disown.

Por ejemplo, tenemos este comando en ejecución que simplemente escribe algo en un fichero de texto cada dos segundos. Lo tenemos en primer plano (fg):

Nota: los paréntesis son porque ejecuto una sub-shell para que interprete todos los comandos (separados por “;” como un único comando.

$ (while true; do echo "prueba - `date`" >> test.txt; sleep 2; done)

Puedo ver que efectivamente escribe cada dos segundos ejecutando un tail al fichero:

$ tail -f test.txt 
prueba - Thu Apr 11 21:11:56 CEST 2013
prueba - Thu Apr 11 21:11:58 CEST 2013
prueba - Thu Apr 11 21:12:00 CEST 2013
prueba - Thu Apr 11 21:12:02 CEST 2013
prueba - Thu Apr 11 21:12:04 CEST 2013

Ahora le vamos a mandar una señal SIGSTOP al proceso. Esto lo detendrá temporalmente. Para ello usamos Ctrl + z “^z”. En la misma shell de bash desde la que lo hemos parado vemos con el comando jobs que el proceso está parado:

$ jobs
[1]+  Stopped                 ( while true; do
    echo "prueba - `date`" >> test.txt; sleep 2;
done )

Ahora lo vamos a pasar a segundo plano (background) con el comando bg:

$ bg
[1]+ ( while true; do
    echo "prueba - `date`" >> test.txt; sleep 2;
done ) &

Y automáticamente el proceso seguirá funcionando, pero ahora ya en segundo plano:

$ tail -f test.txt
prueba - Thu Apr 11 21:17:34 CEST 2013
prueba - Thu Apr 11 21:17:36 CEST 2013
prueba - Thu Apr 11 21:17:38 CEST 2013
prueba - Thu Apr 11 21:17:40 CEST 2013
prueba - Thu Apr 11 21:17:42 CEST 2013

Finalmente ejecutamos el comando disown para desasociar el comando a la shell en la que nos encontramos, ya podremos entonces cerrar con tranquilidad la terminal. Básicamente lo que hace este comando es evitar que se mande una señal SIGHUP al proceso cuando cerramos la shell:

$ disown

Bash y SSH: establecer timeout por inactividad

La variable de entorno TMOUT nos permite definir el tiempo que queremos permitir a un usuario permanecer dentro de la shell o sesión SSH sin hacer nada (estado idle o inactivo). Por defecto no hay límite de tiempo por lo que un usuario podrá permanecer de forma indefinida conectado al sistema independientemente de que la sesión se esté utilizando o no.

Para configurar esta variable, simplemente la añadimos dentro de nuestro perfil de variables/configuraciones de bash ~/.bash_profile o ~/.bashrc. Conviene configurarla como read only para evitar que el propio usuario pueda modificarla:

# Establecemos en 2 minutos (120 segundos) el Timeout para la sesión bash/ssh
TMOUT=120
readonly TMOUT

Refrescamos la shell o entramos y salimos para que sea efectivo:

$ bash

También podemos establecerla a tiempo real mediante export:

$ export TMOUT=120

A partir de ahora, si dejamos la shell abierta durante 2 minutos sin realizar ninguna tarea automáticamente nos desconectará de la sesión:

$ timed out waiting for input: auto-logout

apropos: buscador de comandos en la shell

Es imposible conocer todos los comandos que nos ofrece cualquier shell, para solucionar este “problema” existen herramientas que nos hacen la vida más fácil, una de ellas es el comando apropos.

Apropos es un comando que busca dentro de las descripciones de cada una de las páginas man las palabras claves que le indiquemos pasandolas como argumentos. Estas palabras claves pueden contener comodines o ser la palabra clave exacta.

Por ejemplo, si quisieramos buscar comandos que sirven para copiar ficheros podríamos hacerlo del siguiente modo (suponiendo un sistema en idioma inglés):

$ apropos "copy files"
cp (1)               - copy files and directories
cpio (1)             - copy files to and from archives
install (1)          - copy files and set attributes

Como véis nos muestra tres comandos que pueden servirnos para realizar operaciones de copiado de ficheros. Otro ejemplo podría ser la búsqueda de un comando/programa para gestionar particiones:

$ apropos "partition"
addpart (8)          - simple wrapper around the "add partition" ioctl
cfdisk (8)           - Curses/slang based disk partition table manipulator for Linux
delpart (8)          - simple wrapper around the "del partition" ioctl
fdisk (8)            - Partition table manipulator for Linux
iostat (1)           - Report Central Processing Unit (CPU) statistics and input/output statistics for devices, partitions an...
mpartition (1)       - partition an MSDOS hard disk
partprobe (8)        - inform the OS of partition table changes
partx (8)            - telling the kernel about presence and numbering of on-disk partitions.
sfdisk (8)           - Partition table manipulator for Linux

Como véis es un comando muy útil en situaciones que no conocemos un comando para realizar una determinada tarea.

Escanear rango de Ips

Existen muchas formas de escanear desde shell un rango de IPs o subnet, por ejemplo con nmap o creando un script en bash, perl, etc. No obstante aquí va una forma sencilla que he encontrado en Shell Fu:

for IP in 192.168.1.{1..10}; do if ping $IP -c 1 > /dev/null; then echo $IP alive; else echo $IP dead; fi; done

Y la salida (escaneo desde la 192.168.1.1 a 192.168.1.10

~$ for IP in 192.168.1.{1..10}; do if ping $IP -c 1 > /dev/null; then echo $IP alive; else echo $IP dead; fi; done
192.168.1.1 alive
192.168.1.2 dead
192.168.1.3 dead
192.168.1.4 dead
192.168.1.5 dead
192.168.1.6 dead
192.168.1.7 dead
192.168.1.8 dead
192.168.1.9 dead
192.168.1.10 dead

Chuleta: Atajos de teclado para Shell Bash

Os dejo el enlace a la descarga de una excelente recopilación a modo de chuleta que han realizado en beerpla.net relacionada con atajos de teclados en la Shell Linux Bash, sin duda conociendo estos atajos de teclado incrementarás tu rendimiento y rapidez en la shell por excelencia, Bash:

Tabla de equivalencias entre comandos DOS y UNIX

Esta tabla servirá de referencia a aquellos usuarios que pasen de DOS a UNIX o viceversa:

Tarea ...                         DOS                     UNIX

Listar ficheros dir/w dir ls dir ls -l Mostrar contenido de ficheros type cat Mostrar contenido de ficheros type filename | more more paginando Copiar fichero copy cp Buscar cadena en fichero find grep fgrep Comparar ficheros comp diff Renombrar fichero rename OR ren mv Borrar fichero erase OR del rm Borrar directorio rmdir OR rd rmdir Cambiar permisos de ficheros attrib chmod Crear directorio mkdir o md mkdir Moverse entre directorios chdir OR cd cd Ayuda help man apropos Mostrar fecha y hora date, time date Mostrar espacio disponible chkdsk df Imprimir fichero print lpr Mostrar cola de impresión print lpq

Fuente: DOS to UNIX Translation

Descubre los comandos que más utilizas en la shell

Con la siguiente línea de comandos, descubriras que es lo que más usas en tu shell:

history | awk '{print $2}' | sort | uniq -c | sort -rn | head

La explicación es sencilla:
history -> muestra el historico de comandos ejecutados
awk ‘{print $2}‘ -> filtra y muestra solamente la segunda columna del historico
sort -> ordena el listado
uniq -c -> junta todas las líneas que son iguales
sort -rn ->Ordena de forma numérica e invertida
head -> muestra solamente los 10 primeros resultados.

Simplemente es una curiosidad más ;)