Comandos MUY UTILES para la consola

Empecé a editar este artículo hace varios meses. Finalmente me aburrí de recopilar comandos y lo publico tal como está. Si recuerdo algunos que se me hayan pasado por alto, o descubro nuevos, los iré agregando. Seguramente falten muchos que uso periódicamente y no me dí cuenta de agregar.

Quisiera compartir una lista de comandos útiles que suelo utilizar día a día, sin una organización u orden aparente. Son muchos de los comandos que todo SysAdmin conoce o está familiarizado. Tal vez muchos resulten básicos (por no usar otro adjetivo) para un SysAdmin, sin embargo pueden no serlo para alguien que recién comienza a interactuar con una shell.

Indice

  • Borrar el contenido de un archivo
  • Volver al directorio anterior
  • Cambiar rápidamente al directorio $HOME
  • Ver un log «en vivo y en directo»
  • Listar todos los puertos TDP y UDP abiertos
  • Listar todos los sockets Unix abiertos
  • Ejecutar un comando sin que quede registrado en el historial de Bash
  • Ejecutar un comando sólo si el anterior finaliza correctamente
  • Indicarle a un utilitario que deje de interpretar opciones
  • Crear varios niveles de directorio en un único comando
  • Crear y editar un archivo con cat
  • Listar todos los archivos abiertos
  • Omitir a grep en la salida de ps
  • Listar los archivos modificados en las últimas 24 horas
  • Listar sólo las conexiones establecidas
  • Identificar el proceso asociado a una conexión establecida
  • Obtener estadísticas de red
  • Remover la ruta en un nombre de archivo
  • Mandar un proceso a segundo plano
  • Terminar un proceso en segundo plano
  • Cómo saber el pid de la sesión actual
  • Contar filas repetidas
  • Buscar archivos por contenido
  • Buscar archivos por nombre
  • Conocer el formato de un filesystem
  • Invertir el orden de las líneas de un archivo
  • Invertir un string
  • Buscar ayuda
  • Imprimir un árbol de procesos
  • Volcar un archivo binario por salida estándar
  • Responder «yes» a cualquier comando interactivo
  • Realizar cálculos matemáticos por línea de comandos
  • Obtener rápidamente nuestro id de usuario
  • Matar procesos por nombre
  • Conectar con un pipe la stderr

Al grano.

Borrar el contenido de un archivo

Una forma rápida de vaciar un archivo es redirigir una salida nula:

> archivo

Volver al directorio anterior

No confundir con ir al directorio padre cd ... Funciona como la flecha izquierda de los navegadores:

cd -

Cambiar rápidamente al directorio $HOME

cd

Ver un log «en vivo y en directo»

tail -f /var/log/syslog

Listar todos los puertos TDP y UDP abiertos

netstat -tulpn

Listar todos los sockets Unix abiertos

netstat -xlpn

Ejecutar un comando sin que quede registrado en el historial de Bash

Práctico cuando necesitamos incluir una contraseña como parte de un comando, para no divulgarla en el historial. Sólo es necesario dejar un espacio en blanco delante del comando:

 COMANDO

Ejecutar un comando sólo si el anterior finaliza correctamente

apt-get update && apt-get upgrade

Indicarle a un utilitario que deje de interpretar opciones

Sólo se deben utilizar dos guiones del medio. Por ejemplo quiero buscar dos guiones del medio consecutivos en cierto contenido utilizando grep:

root@debian:~# history | grep '--'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

Aunque utilice comillas, grep interpreta el guión del medio como delimitador de una opción. La forma correcta es:

root@debian:~# history | grep -- --
  167  git commit --amend --reset-author
  508  history | grep '--'

En el primer comando, grep interpreta los guiones como opciones, a pesar de que se utilicen comillas, comillas dobles o escapes. En el segundo ejemplo, primero se indica a grep que deje de interpretar opciones y luego se pasa el parámetro sin inconvenientes.

Crear varios niveles de directorio en un único comando

Utilizar al opción -p de mkdir:

mkdir -p /ruta/a/un/directorio/anidado

Crear y editar un archivo con cat

cat > archivo

Para finalizar, presionar Ctrl+D (atajo de teclado para EOFEnd Of File).

Listar todos los archivos abiertos

Una forma rápida para saber qué archivos de log están siendo utilizados por demonios o servicios:

lsof | grep "\.log"

Omitir a grep en la salida de ps

En el artículo Tip: cómo ocultar el proceso grep en la salida de ps compartí este ingenioso truco.

root@hal9000:/usr/home/emi # ps x | grep "ntpd"
1620  -  Ss     0:00.07 /usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift
1682  2  S+     0:00.00 grep ntpd

Simplemente se debe encerrar cualquier letra del patrón de búsqueda entre corchetes:

root@hal9000:/usr/home/emi # ps x | grep "[n]tpd"
1620  -  Ss     0:00.07 /usr/sbin/ntpd -c /etc/ntp.conf -p /var/run/ntpd.pid -f /var/db/ntpd.drift

Listar los archivos modificados en las últimas 24 horas

Otro interesante comando que compartí previamente en el artículo Listar los archivos modificados en las últimas 24 horas:

find . -type f -mtime -1 -exec ls -gGh --full-time '{}' \; | cut -d ' ' -f 4,5,7

Listar sólo las conexiones establecidas

netstat -tupn | grep EST

Identificar el proceso asociado a una conexión establecida

Información útil que provee netstat:

netstat -tupnee

Obtener estadísticas de red

netstat -s

Remover la ruta en un nombre de archivo

El utilitario basename remueve el directorio y sufijo en un nombre de archivo. Muy útil al momento de crear scripts:

root@linuxito:/usr/local/nginx# pwd
/usr/local/nginx
root@linuxito:/usr/local/nginx# basename $(pwd)
nginx

Mandar un proceso a segundo plano

Si hemos lanzado un proceso largo en primer plano, y deseamos que continúe ejecutando en segundo plano (como si lo hubiésemos lanzado con &), sólo es necesario presionar Ctrl+Z para suspenderlo y luego bgpara que continúe en background.

emi@hal9000:~ % ping 8.8.8.8 >/dev/null 
^Z
Suspended
emi@hal9000:~ % jobs
[1]  + Suspended                     ping 8.8.8.8 > /dev/null
emi@hal9000:~ % bg 1
[1]    ping 8.8.8.8 > /dev/null &
emi@hal9000:~ % jobs
[1]    Running                       ping 8.8.8.8 > /dev/null

Terminar un proceso en segundo plano

Si hemos lanzado un proceso en segundo plano y deseamos terminarlo abruptamente (kill), no es necesario conocer su PID. Es posible matarlo indicando su número de trabajo:

emi@hal9000:~ % jobs
[1]    Running                       ping 8.8.8.8 > /dev/null
emi@hal9000:~ % kill %1
emi@hal9000:~ % jobs
[1]    Terminated                    ping 8.8.8.8 > /dev/null

Cómo saber el pid de la sesión actual

En Bash, la variable $ expande al PID de la sesión actual (instancia de Bash en ejecución):

echo $$

Contar filas repetidas

Algo como lo que haría un administrador de bases de datos al usar COUNT(*) en conjunto con GROUP BY. Contar la cantidad de repeticiones de una misma fila utilizando sort y uniq:

[COMANDO] | sort | uniq -c | sort -nr

Buscar archivos por contenido

Una vez más grep al rescate, por lejos mi comando favorito:

grep -r 'ssl' /etc/apache2/*

Este comando busca recursivamente la palabra «ssl» dentro del contenido de todos los archivos dentro del directorio /etc/apache2/.

Buscar archivos por nombre

Con la opción -iname se ignoran mayúsculas/minúsculas (case) en los nombres de archivo. Utilizar asteriscos para buscar patrones:

find /etc/apache2/ -iname "*.conf"

Conocer el formato de un filesystem

Pasar el nombre de dispositivo como parámetro a file:

root@devuan:~# file -s /dev/sda1 
/dev/sda1: Linux rev 1.0 ext4 filesystem data, UUID=bed6a1f2-ec59-4913-9af6-0e2f66ac2954, volume name "ROOT" (needs journal recovery) (extents) (large files) (huge files)

Invertir el orden de las líneas de un archivo

El comando tac es cat pero concatena e imprime en orden reverso:

tac ARCHIVO
root@devuan:~# cat /etc/shells 
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
root@devuan:~# tac /etc/shells
/bin/rbash
/bin/bash
/bin/dash
/bin/sh
# /etc/shells: valid login shells

Invertir un string

El comando rev permite invertir un string (transformar «hola» en «aloh»). Opera sobre cada línea de un archivo de manera individual:

root@devuan:~# rev /etc/shells
sllehs nigol dilav :sllehs/cte/ #
hs/nib/
hsad/nib/
hsab/nib/
hsabr/nib/

Buscar ayuda

Para buscar ayuda en páginas de manual (por ejemplo, si no conocemos la página de manual que debemos consultar) recurrir a apropos:

apropos PALABRA_CLAVE

Imprimir un árbol de procesos

Hay varias formas de hacerlo:

tree
ps -ejH
ps axjf

Volcar un archivo binario por salida estándar

hexdump -C ARCHIVO

Responder «yes» a cualquier comando interactivo

Trivial:

yes | COMANDO

Yes imprime el caracter ‘y’ forever, no como el pájaro de Homero.

Realizar cálculos matemáticos por línea de comandos

La herramienta bc se puede utilizar como calculadora de línea de comandos:

emi@hal9000:~ % echo "1024*1024" | bc
1048576

Obtener rápidamente nuestro id de usuario

Y de todos los grupos a los que pertenecemos:

emi@hal9000:~ % id
uid=1001(emi) gid=0(wheel) groups=0(wheel),44(video),920(vboxusers)

Matar procesos por nombre

Matar o enviar cualquier señal por nombre de ejecutable en vez de PID:

pkill PROGRAMA

Conectar con un pipe la stderr

Si necesitamos conectar tanto la salida estandar (stdout) como la salida de errores (stderr) de un proceso, a la entrada estandar (stdin) de otro, debemos agregar ampersand luego del pipe:

COMANDO1 |& COMANDO2

Actualizado: noviembre de 2017.

Change Timezone in CentOS | Cambiar el timezone en Centos

First, make a backup of the existing localtime file. It’s always good practice to make backups of original config files.

[gaarai@server ~]$ sudo mv /etc/localtime /etc/localtime.bak

Next, create the link:

[gaarai@server ~]$ sudo ln -s /usr/share/zoneinfo/America/Chicago /etc/localtime

Make sure to replace America/Chicago with the directory (if your zone has one) and filename of the timezone you wish to use.

Now you just need to test your change. Run date from the command line, and ensure that the appropriate time, date, and timezone are reported.

Bash Script para backup de todas las bases de MySQL

#!/bin/bash

USER=»super usuario»
PASSWORD=»ingrese la clave aquí»
OUTPUT=»/directorio/donde/se/va/a/backapear»

rm «$OUTPUT/*gz» > /dev/null 2>&1

databases=`mysql –user=$USER –password=$PASSWORD -e «SHOW DATABASES;» | tr -d «| » | grep -v Database`

for db in $databases; do
if [[ «$db» != «information_schema» ]] && [[ «$db» != _* ]] ; then
echo «Dumping database: $db»
mysqldump –force –opt –user=$USER –password=$PASSWORD –databases $db > $OUTPUT/`date +%Y%m%d`.$db.sql
gzip $OUTPUT/`date +%Y%m%d`.$db.sql
fi
done

How to clean /tmp on Centos/cPanel server | Limpiar /tmp en un servidor CentOS

How to clean /tmp on Centos/cPanel server

open SSH to your server, if SSH will not connect due to disk space full in tmp, reboot your server in cloud server manager then try again.
Once connected run the following command

yum install tmpwatch -y

once tmpwatch is installed run command

/usr/sbin/tmpwatch -am 12 /tmp

this will delete all files over 12 hours old

next, we will configure your server to do this automatically.

from SSH type:  crontab -e

go to the very bottom and paste

0 4 * * * /usr/sbin/tmpwatch -am 12 /tmp

then press Control+X (on PC) or Command+x (on Mac) you will get confirmation do you want to save. Type Y for yes, and press enter.

The Location for the corntab for root ,    /var/spool/cron  so you can add the line by using CSE

You can remove session file using following command.

# cd /tmp
# rm -rf sess_*

Bloquear dominio para que no envíe mail usando SMTP exim

How to Disable a Domain From Sending Email

You can easily disable inbound email for a single domain simply by switching off the MX records and/or removing the domain from /etc/localdomains.  However, disabling a domain from sending email off of your server is slightly more complicated.  Even if you manage to disable the domain of an account from sending out, you still have to deal with the fact that the cPanel user itself can send email.  This user has the address of user@serverhostname, and is the default sender for scripts that utilize sendmail.  In other words, any PHP or Perl script that sends email off of your server without using proper SMTP authentication will send mail as the cPanel user.

Disable Email from Specific Domains

First, create a file called /etc/blockedsenderdomains, and add the list of domains to block email from to this file, one line at a time.
Then go into WHM > Exim Configuration Manager > Advanced Editor, and add the following to “Section: CONFIG” part:

domainlist blocked_domains = lsearch;/etc/blockedsenderdomains

In the ROUTERSTART section, add:

reject_domains:
 driver = redirect
 domains = +blocked_domains
 allow_fail
 data = :fail: Connection rejected: SPAM source $domain is manually blacklisted.

Then save the file.


Primero hacer 2do paso y luego editar con nano /etc/exim.conf  el 1er paso porque en cpanel no te deja agregar linas de config, es una verga.

 

Problemas html acentos y eñes: charset UTF-8 / ISO-8859-1

Problemas html acentos y eñes: charset UTF-8 / ISO-8859-1

La codificación de las páginas web (charset) es un problema recurrente para los webmasters, porque:

  • Depende del editor en que se haya hecho la web, si en el trabajamos por defecto en UTF-8 o ISO-8859-1. Si el archivo original estaba escrito en ISO-8859-1 y lo editamos en UTF-8, veremos los caracteres especiales mal codificados. Si guardamos ese archivo tal cual, estaremos corrompiendo la codificación original (se guardará mal, con UTF-8). Y viceversa.
  • Depende de la configuración del Apache.
  • Depende de si hay un archivo oculto .htaccess en el directorio raíz que sirve nuestra web (httpdocs, public_html o similar)
  • Depende de si se especifica en las etiquetas META de los HTML resultantes.
  • Depende de si se especifica en la cabecera de un archivo PHP.
  • Depende del charset elegido en la base de datos (si se usa una base de datos para mostrar contenidos con un CMS, tal como Joomla, Drupal, phpNuke, o una aplicación propia que sea dinámica).

Por lo general, si nunca tienen que aparecer acentos o eñes en nuestra web, nos es indiferente la codificación (aunque pueden haber otros símbolos que nos fastidien). Aunque si nuestra web está en español, lo más normal es que coloquemos acentos y eñes. Para ello, el estándar HTML está preparado para colocar todos los símbolos y acentos que nos sean necesarios, codificándolos. Así, para los acentos y eñes, deberíamos colocar:

á -> á
é -> é
í -> í
ó -> ó
ú -> ú
ñ -> ñ

Variantes valenciano-catalán-balear para acentos abiertos:

à -> à
è -> è
ò -> ò

De este modo, veremos todos caracteres correctamente, independientemente del charset.

Sin embargo, puede ser tedioso para ciertos contenidos tener que ir traduciendo nosotros manualmente los caracteres. Es en estos casos donde vale la pena perder un poco de tiempo para ajustar las distintas configuraciones.


Primero, habría que determinar en nuestra web con las etiquetas META que nuestra web debe servirse en la codificación que nosotros elijamos. O sea, dentro de :

<meta http-equiv=»Content-Type» content=»text/html; charset=UTF-8″ />

o bien

<meta http-equiv=»Content-Type» content=»text/html; charset=ISO-8859-1″ />


Si seguimos con el problema, Segundo, ver si por defecto tiene el servidor (apache) algún charset predefinido. Si es así, se ignorarán las etiquetas META del html.
En un servidor Linux, el archivo charset está en:

/etc/apache2/conf.d/charset

también puede cambiarse en el archivo httpd.conf

Debería aparecer sólo «AddDefaultCharset off», para que haga caso de las etiquetas META (lo ideal). Podemos poner, por ejemplo, «AddDefaultCharset UTF-8», y así apache siempre emitirá las webs en UTF-8. El problema es que esto afecta a todo el servidor, y si luego tenemos alguna web que vaya a usar otra codificación tendremos un problema. Por eso, lo ideal es que esté a Off y que cada web defina cómo quiere mostrarse.

Pero puede darse el caso de que nosotros no seamos los administradores del servidor y sólo tengamos un Plesk, y no podamos acceder al archivo charset por encontrarse fuera de nuestro rango de permisos. Podemos, entonces, pedirle al administrador del servidor que coloque el parámetro anterior a Off, o bien…


Alternativa 1: Colocar un archivo .htaccess en el directorio raíz de la web
Los .htaccess son archivos de configuración que sobreescriben algunas configuraciones del apache sólo para determinados casos. Hay que tener en cuenta que estos archivos:

  • Pueden funcionar total o parcialmente, dependiendo de la configuración del servidor (cuestión de seguridad).
  • Son archivos ocultos, por lo que para verlos tenéis que tener habilitada la función «ver archivos ocultos» en vuestro programa que acceda por ftp.

Este archivo .htaccess debería tener al menos una línea de este tipo

AddDefaultCharset utf-8


Alternativa 2: Colocar una directiva en php que fuerce a mostrarse en la codificación deseada
Esto es, sólo sirve si el archivo tiene extensión «.php». Recordemos que el html y el php pueden convivir en el mismo fichero, con lo que si renombramos un «.html» a «.php», el resutlado es exactamente el mismo (si tenemos instalado el php en nuestro servidor, claro está).
En la primera línea del archivo que deseemos indicarle la codificación (o lo antes posible) deberíais colocar la siguiente cabecera:

<?php header(‘Content-Type: text/html; charset=UTF-8’); ?>


Para todos los casos donde funcione el comando «AddCharset»
– Puede especificarse el charset según la extensión del archivo. Si, por ejemplo, queremos que los «.php» sean UTF-8 y los «.html» sean ISO, podemos colocar estas dos instrucciones seguidas:

AddCharset UTF-8 .php
AddCharset ISO-8859-1 .html

Script en Bash para Backup SQL con un Dump y enviarlo al Mail.

Backup en Bash

#!/bin/sh
timestamp=$(date ‘+%d-%m-%Y@%H:%M’)
mysqldump –user=»USUARIO» –password=»CLAVE» –all-databases | gzip > /home/DIRECTORIO/basesdedatosRentasyWeb_$timestamp.sql.gz
mutt -s «Backup Diario DE USUARIO | $timestamp» -a /home/DIRECTORIO/basesdedatosRentasyWeb_$timestamp.sql.gz -c CORREO-DE-DESTINO@CORREO.COM < /root/mensajebackup.txt rm /home/DIRECTORIO/basesdedatosRentasyWeb_$timestamp.sql.gz echo "Backup hecho, enviado y borrado" #exit 0

RSS AutoPilot

Si no funciona el Web Scraper, es porque en el php.ini no está la opcion «allow_url_fopen»

Hi,
The plugin requires allow_url_fopen to be enabled in order to download content, we even didn’t think somebody may disable it.

Xcode7 con iOS10 (con un enlace simbólico)

Installing on iOS 10 with Xcode 7

Like many developers, I was anxious to install iOS 10 on my devices. This summer, I went all in and installed iOS 10 beta on my primary iPhone, iPad, as well as watchOS 3 beta on my Apple Watch. I have had remarkably few issues, but one of the major problems was installing apps that I still needed to work on that needed to be shipped before iOS 10 came out.

The problem

By default, you cannot install an app from Xcode 7 on a device running iOS 10. You will see an error that reads, “Could not find Developer Disk Image” as shown below.

Xcode 7 iOS 10 error

The problem is that Xcode 7 does not have support for iOS 10. Using Terminal, you can easily see which operating systems Xcode is able to support.

$ cd /Applications/Xcode.app/Content/Developer/Platforms/iPhoneOS.platform/DeviceSupport
$ ls

Xcode 7 device support

The solution

In order for Xcode 7 to install apps on your device running iOS 10, you first need to make sure that it works with Xcode 8. Download the beta, and open a project with your device connected. Typically, you will need to wait for the symbol files to install, and then you should be able to install. In some cases, restarting your device is necessary, or even resetting the network settings (Settings -> General -> Reset -> Reset Network Settings).

Once that it working, you can look in the Xcode beta device support folder to find iOS 10 support.

Xcode beta device support

There are a couple options to give Xcode 7 the information that it needs. You could copy over the folder containing 10.0 support, but the simplest option is to create asymbolic link using the ln command in Terminal (documentation). As you type this out in Terminal, be sure to use Tab to help autocomplete the directory names in order to avoid typos. And naturally, if either Xcode app is in a different place, or the exact version of iOS 10 is different, you will make adjustments for your environment.

$ ln -s
   /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.0\ \(14A5339a\)/
   /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.0

ESTE ES EL COMANDO QUE USE EN EL MAC MINI:

ln -s /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.0\ \(14A345\)/ /Applications/Xcode7.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/10.0

 

Xcode device support with link

After adding the link, you will need to quit and restart Xcode 7. Connect your iOS 10 device, and you should now be able to install and run your app!

Xcode 7 running on iOS 10