Archivo

Archivo para Septiembre, 2009

Copiar archivo y particiones utilizando dd (Linux/UNIX)

Miércoles, 23 de Septiembre de 2009 jarrarte Sin comentarios

Introducción

dd es de esos comandos de Linux y UNIX “para temer”. Puede ser de mucha utilidad en algunas situaciones, pero también puede ser fatal si se usa mal, especialmente si no tenemos cuidado en los parámetros con los que lo invocamos.

En pocas palabras, dd permite copiar y convertir el contenido de un archivo a otro. El concepto de archivo es bastante amplio, ya que además de copiar archivos comunes, se pueden utilizar como entrada y salida los archivos de /dev, y así copiar una partición, generar archivos vacíos, generar archivos con contenido aleatorio, etc.

Formato

El formato es un poco diferente a los comandos de linux que conocemos, dado que dd se basa en parámetros del tipo opción=valor en lugar de utilizar el formato más común -op valor o –opción valor.

El archivo de entrada estará especificado por la opción if (por input file). Como es de suponer, el archivo de salida está especificado por la opción of (por output file).

Con la opción bs configuramos el tamaño de cada bloque que se leerá/convertirá/escribirá (con las opciones ibs, cbs y obs se configuran los tamaños de los bloques de cada proceso por separado). A éstos parámetros se les puede pasar un valores que sean el resultado de una multiplicación, por ejemplo, 1024×1024x1024 para expresar 1 GB. También se pueden utilizar sufijos como ser c (1 byte), w (2 bytes), b (512 bytes, asociado por defecto del tamaño de un sector de disco), kB (1000 bytes), K (1024 bytes), MB (1000*1000), M (1024*1024), GB (1000*1000*1000), G (1024*1024*1024), y así para T, P, E, Z, Y.

Con el parámetro count configuramos la cantidad de bloques a copiar; por lo tanto, el tamaño de lo transferido será bs*count. Aunque la última porción del archivo no tenga el tamaño de un bloque exacto, ese restante se transfirirá de todas formas.

Podemos utilizar el parámetro conv para hacer ciertas transformaciones además de la lectura y la escritura, y puede tener los siguientes valores:

  • lcase: transformar mayúsculas a minúsculas
  • ucase: transformar minúsculas a mayúsculas
  • swab: intercambiar cada par de bytes de entrada
  • excl: fallar si el archivo de salida existe
  • noerror: continuar aunque se encuentren errores de lectura
  • nocreat: no crea el archivo de salida

Otras opciones que me parecieron menos interesantes fueron: ascii, ebcdic, ibm, block, unblock, notrunc, sync, fdatasync y fsync (consultar las páginas man por más datos).

Ejemplos de uso

(De más está decir que no puedo asegurar que todos los ejemplos van a funcionar como deberían, ya que en algunos casos, ni siquiera puedo afirmar que “en mi máquina anda”. Por favor usar con responsabilidad. Dicho esto, continuamos…)

En los siguientes ejemplos veremos algunos ejemplos de uso del comando dd. En los casos que corresponda este comentario, se generarán archivos de 64MB, en 1000 bloques de a 64KB.

Duplicar una partición

En este ejemplo duplicaremos el contenido de una partición en otra. Creo que lo ideal es que sean las 2 del mismo tamaño, aunque si la partición de salida es más grande, también funcionaría.

dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=notrunc,noerror

Duplicar una partición en otro host (ésta me la enseñó MacGyver)

Es la misma idea que el ejemplo anterior, pero en lugar de duplicar la partición en un disco local, se duplica a través de la red, utilizando el comando netcat (también conocido como la navaja suiza de TCP/IP):

En el host de destino:

netcat -l -p 1234 | dd of=/dev/hdc bs=16065b

El el host de origen:

dd if=/dev/sda2 bs=16065b | netcat [IP-destino] 1234

También podemos duplicar una partición a un host remoto a través de SSH:

dd if=/dev/sda2 bs=16065b | ssh user@host "dd of=/dev/hdc bs=16065b"

Generar un archivo con ceros o contenido aleatorio

Los archivos generados con ceros o contenido aleatorio nos pueden servir como material para transferir entre discos o por la red para diagnosticar posibles problemas.

Con ceros:

dd if=/dev/zero of=/tmp/zeros bs=64k count=1000

Con contenido aleatorio:

dd if=/dev/urandom of=/tmp/myrandom bs=64k count=1000

Copiar una partición a un archivo

dd if=/dev/sda2 of=/tmp/part.image bs=4096 conv=notrunc,noerror

Si queremos copiar un CD/DVD a una imagen ISO, podemos ejecutar:

dd if=/dev/cdrom of=/tmp/myCD.iso bs=2048 conv=sync,notrunc

Parecido al ejemplo de duplicar una partición a través de la red, podemos respaldar nuestra partición a un archivo en un host remoto a través de SSH:

dd if=/dev/sda2 | ssh user@host "dd of=/home/user/partition.image"

Escribir basura en una partición

Cuando borramos archivos o utilizamos un formato rápido, la mayoría de los archivos pueden ser recuperados. Este ejemplo puede servir para asegurarnos que no se puedan recuperar los datos de una partición entera:

dd if=/dev/urandom of=/dev/hda

Convertir un archivo a MAYÚSCULAS

dd if=filename of=filename conv=ucase

Referencias

man dd
http://en.wikipedia.org/wiki/Dd_%28Unix%29

Categories: Linux, UNIX Tags: ,

Matar procesos en Windows (taskkill)

Martes, 15 de Septiembre de 2009 jarrarte 2 comentarios

Introducción

La forma más común para matar procesos en Windows seguramente sea utilizando el administrador de tareas, en la pestaña de “Procesos”, haciendo click derecho en el proceso que queremos cerrar por la fuerza:

Administrador de tareas

Si utilizamos Windows XP Professional (o Windows Vista), podemos utilizar el comando taskkill para terminar (de forma forzada si así lo necesitamos) un proceso por su id, su nombre o por filtros menos selectivos. Inclusive se puede utilizar para matar procesos de sistemas remotos. Entre las opciones para seleccionar el proceso a terminar, tenemos las más simples como ser por PID (process id) o nombre de imagen. También tenemos la posibilidad de utilizar un sistema de filtros, para los cuales el comando nos ofrece algunos nombres de variables y una lista de operadores para poder hacer comparaciones (por ejemplo, para terminar todos los procesos de un usuario, o para terminar los procesos que exceden cierto límite de uso de memoria RAM).

Ejemplos de uso

Veamos algunos ejemplos de uso:

  • TASKKILL /PID 1230 /PID 1241 /PID 1253: termina los procesos con PID 1230, 1241 y 1253.
  • TASKKILL /F /IM notepad.exe /IM mspaint.exe: termina de manera forzada los procesos con nombre de imagen “notepad.exe” o “mspaint.exe”.
  • TASKKILL /S otra-pc /F /IM notepad.exe: termina los bloc de notas en la PC de la red llamada “otra-pc”.
  • TASKKILL /F /FI “PID ge 1000″ /FI “WINDOWTITLE ne untitle*”: termina de manera forzada los procesos que tengan un PID mayor o igual a 1000, y además el título de la ventana no empiece con “untitle”. Notar que se puede utilizar un caracter de comodín (*) en los filtros, lo que facilita el uso de filtros menos selectivos. También se pueden utilizar varios filtros, para que el comando haga la intersección de los filtros.
  • TASKKILL /F /FI “USERNAME eq NT AUTHORITY\SYSTEM” /IM notepad.exe: termina de manera forzada los procesos con nombre de imagen “notepad.exe” que fueron iniciados por el usuario “NT AUTHORITY\SYSTEM”.
  • TASKKILL /S otra-pc /U dominio\usuario /FI “USERNAME ne NT*” /IM *: Utilizando el usuario “dominio\usuario”, termina de forma remota todos los procesos de los usuarios que su nombre no empiece con “NT” en la PC de la red llamada “otra-pc”. Si es necesario, pedirá que se ingrese la contraseña del usuario.
  • TASKKILL /S otra-pc /U nombreusuario /P contraseña”: Si no se ingresan filtros al invocar taskkill para un sistema remoto, el comando apaga la computadora remota (siempre y cuando el usuario tenga permisos para hacerlo)

La salida del comando es un listado de los procesos terminados en caso de que alguno cumpliera con el filtro:

C:\>TASKKILL /F /FI "PID ge 3599" /FI "IMAGENAME eq fdm.exe*"
Correcto: se terminó el proceso con PID 3600.

O un aviso si ningún proceso cumplió el filtro especificado:

C:\>TASKKILL /F /FI "PID ge 3599" /FI "IMAGENAME eq FOXIT*"
INFORMACIÓN: no hay tareas ejecutándose con los criterios especificados.

¿Y para Windows NT o 2000?

Para sistemas basados en Windows NT y 2000 vale la pena ver PsKill (link), una utilidad similar a taskkill.

Acceso directo para “limpiar” procesos que no responden

Una idea muy interesante es crear un acceso directo para matar de forma forzada todos los procesos que hayan dejado de responder. Esto es bastante simple, lo hacemos poniendo como comando del acceso directo lo siguiente:

taskkill.exe /f /fi "status eq not responding"

Sintaxis completa

La ayuda completa del comando taskkill es la siguiente:

C:\ >taskkill /?

TASKKILL [/S sistema] [/U usuario [/P contraseña]]
         { [/FI filtro] [/PID IdProceso | /IM NombreImagen] } [/F] [/T]

Descripción:
    Esta herramienta de la línea de comandos puede usarse en uno o más
    procesos.
    Los procesos pueden terminarse a través del Id. o del nombre de imagen.

Lista de parámetros:
    /S    sistema               Especifica el sistema remoto al que conectarse.
    /U    [dominio\]usuario    Especifica el contexto de usuario en el que se que el comando debe ejecutarse.
    /P     contraseña           Especifica la contraseña para el contexto de usuario dado. Pide la entrada si se omite.
    /F                          Especifica la terminación forzada de proceso(s).
    /FI     filtro              Especifica un conjunto de tarea que coinciden con el criterio especificado en el filtro.
    /PID    Id. de proceso      Especifica el ID. de proceso que se debe terminar.
    /IM     nombre de imagen    Especifica el nombre de imagen del proceso que debe terminar. El carácter comodín "*" puede usarse para especificar todos los nombres de imagen.
    /T                          Terminar árbol: termina el proceso especificado y todos los procesos secundarios iniciados por él.
    /?                          Muestra el uso de la ayuda.

Filtro(s):
    Nombre filtro   Operadores válidos         Valores válidos
    -------------   ------------------         ---------------
    STATUS          eq, ne                     RUNNING | NOT RESPONDING
    IMAGENAME       eq, ne                     Nombre de imagen.
    PID             eq, ne, gt, lt, ge, le     Valor de PID.
    SESSION         eq, ne, gt, lt, ge, le     Número de sesión
    CPUTIME         eq, ne, gt, lt, ge, le     Tiempo válido en el formato
                                               hh:mm:ss.
                                               hh - horas,
                                               mm - minutos, ss - segundos
    MEMUSAGE        eq, ne, gt, lt, ge, le     Uso de memoria en KB.
    USERNAME        eq, ne                     Nombre de usuario en formato
                                               [dominio\]usuario.
    MODULES         eq, ne                     Nombre de DLL
    SERVICES        eq, ne                     Nombre de servicio.
    WINDOWTITLE     eq, ne                     Título de ventana.

Nota: el carácter comodín "*" del modificador /IM se acepta solamente
      con filtros.

Nota: los procesos remotos siempre se terminarán de manera forzada
      sin tener en cuenta si la opción /F se ha especificado o no.
Categories: Windows Tags: