Saltar a contenido

Linux

Enlaces

Gestión de paquetes

Equivalencias entre apt/dpkg y pacman

Acción Debian/Ubuntu Arch
Actualizar la base de datos de paquetes apt update sudo pacman -Syy
Actualizar el sistema apt upgrade sudo pacman -Syu
Instalar un paquete apt install <paquete> sudo pacman -S <paquete>
Desinstalar un paquete dejando sus dependencias apt remove <paquete> sudo pacman -R <paquete>
Desinstalar un paquete y sus dependencias dejando las usadas por otros apt autoremove sudo pacman -Rs <paquete>
Desinstalar paquete, dependencias y ficheros de configuración apt purge sudo pacman -Rns <paquete>
Eliminar paquetes huérfanos apt autoremove sudo pacman -Rns $(pacman -Qdtq)
Buscar un paquete apt search / apt-cache search pacman -Ss <paquete>
Comprobar si un paquete está instalado dpkg -l \| grep <paquete> pacman -Q <paquete>
Listar los ficheros de un paquete dpkg -L <paquete> pacman -Ql <paquete>
Comprobar a qué paquete pertenece un archivo dpkg -S <archivo> pacman -Qo <archivo>
Listar todos los paquetes instalados apt list --installed pacman -Q
Listar paquetes instalados fuera de los repositorios apt list --installed \| grep -v / pacman -Qm

Comandos apt y dpkg

(Fuentes: 1, 2)

  • Encontrar un paquete por su nombre: apt-cache search 'cadena'
  • Encontrar un paquete ya instalado que contiene un fichero: dpkg -S 'fichero'
  • Encontrar un paquete no instalado que contiene un fichero: apt-file search 'fichero'
  • Localizar el repositorio del que procede un paquete: apt-cache policy 'paquete'
  • Listar los ficheros que contiene un paquete ya instalado: dpkg -L paquete
  • Listar los ficheros que contiene un paquete no instalado: apt-file list paquete (antes hay que hacer apt-file update)
  • Listar los ficheros de un fichero .deb: dpkg -c paquete.deb
  • Purgar los paquetes que quedaron en estado rc tras eliminarse (configuración residual): sudo apt purge ~c
  • Solucionar problemas con paquetes mal instalados: dpkg --configure -a

Para usar apt-file hay que instalarlo y actualizar su base de datos previamente:

1
2
$ sudo apt-get install apt-file
$ sudo apt-file update

Aplicaciones y servicios interesantes

Comandos útiles

  • strace -e file [command]: runs command, printing out any time a file is opened or checked.
  • strace -e file,network,process [command]: the same as above, but also printing network process and subcommands run.
  • strace -e file,process -f [command]: the -f parameter follows forks -- in case it's not main command but a subshell that you're interested in.
  • strace -p [PID]: Connect to pid PID and start tracing.
  • route -n / netstat -nr: Tabla de rutas del sistema (muestra IPs en lugar de hostnames).
  • du -h --max-depth=1 .: Tamaño de un directorio y sus subdirectorios directos.
  • du -sh */ | sort -h: Muestra los directorios del directorio actual ordenados por tamaño (en formato humano) indicando su tamaño.
  • find [directorio] ! -user [usuario] -ls: Lista los ficheros que NO pertenecen a un usuario.
  • badblocks -swv /dev/sda: Bloquear sectores defectuosos (sustituir /dev/sda por el dispositivo que corresponda.
  • sudo badblocks /dev/sda > badblocks.txt; sudo fsck -l badblocks.txt /dev/sda: Bloqueo de sectores defectuosos del disco duro (fuente).
  • mkdosfs -F 32 -v -n "" /dev/sdc1: Formato de partición en FAT32.
  • cat fichero.txt | awk '{print $5}': Imprime la quinta columna (separando por espacios) de cada linea del fichero.
  • cat fichero.txt | cut -d' ' -f5: Imprime la quinta columna (separando por espacios) de cada linea del fichero.
  • cat fichero.txt | sed -e 's/ /\n/g': Sustituye todos los espacios del fichero por retornos de carro.
  • netstat -ntu|grep :80|wc -l: número de conexiones al servidor HTTP.
  • netstat -ntu|grep :21|wc -l: número de conexiones al servidor FTP.
  • netstat -tulanp: Lista los puertos TCP/UDP abiertos (tanto de servidores como de clientes).
  • netstat -tlnp: Lista los puertos TCP abiertos de los servicios.
  • sudo netstat -lp --inet: Puertos de red abiertos y procesos asociados.
  • crontab -e: Añadir un job a cron.
  • sudo blkid: Lista los dispositivos de bloques (discos) disponibles en el sistema.
  • sudo nmap -sP 192.168.1.0/24: Descubrir todos los equipos presentes en la red 192.168.1.0.
  • sudo dd if=/dev/zero of=/dev/mmcblk0: Formateo de una tarjeta de memoria (en realidad vale para cualquier dispositivo de almacenamiento).
  • sudo tcpdump -s 0 -i ppp0 -w trafico.pcap: Captura de tráfico por el interfaz ppp0.
  • iptables -L -n: Listar reglas iptables en formato numérico (muestra IPs en lugar de hostnames).
  • iptables -t nat -L: Listar reglas iptables de tabla NAT.
  • wget -q -O - url: Hace la request de la URL sin emitir trazas (-q = no verbose) y redireccionando la response a la salida estándar (-O -).
  • cat /etc/resolv.conf: Muestra el gateway en uso.
  • nmcli dev show <adaptador_red>: Muestra los parámetros de la conexión de red (IP, gateway, DNS's, etc.).
  • ldd <binario>: Indica las librerías que usa el binario.
  • exiftool -AllDates='2010:08:08 15:35:33' -overwrite_original photo.jpg: Actualiza todas las fechas dentro de la metainformación de un JPG.
  • exiftool -all= photo.jpg: Borrar toda la metainformación de una foto (por cuestiones de privacidad antes de subirla a un sitio por ejemplo).
  • mplayer -vo caca MovieName.avi: Reproduce un vídeo en consola con ascii. Para verlo en blanco y negro sustituir caca por aa.
  • sudo traceroute -4T -p 22 192.168.1.203: Comprobar la traza hasta alcanzar un determinado puerto en una determinada máquina.
  • dig @8.8.8.8 -t any eduardofilo.es: Query DNS de los registros de cualquier tipo a través del servidor 8.8.8.8 al dominio eduardofilo.es.
  • sudo stat /proc/1/exe: Nos da pistas de si el sistema funciona sobre SysV, Upstart o Systemd (fuente).
  • stty < /dev/port: (sustituir port por lo que corresponda) Interroga el puerto para encontrar sus parámetros de conexión.
  • zenity: Para dotar de cuadros de diálogo a los scripts bash. Documentación
  • taskset: Para fijar un proceso a un conjunto de CPUs. Por ejemplo taskset -c 0-3 <command> fija el proceso <command> a las CPUs 0-3.

SSH

Alias SSH

Para asimilar un identificador a una pareja user@host, editar el fichero ~/.ssh/config y añadir un bloque como el siguiente (fuente):

1
2
3
Host example
  HostName example.com
  User exampleuser

Tunel de un puerto remoto por SSH

(Fuente) Para conducir el tráfico hasta un host:puerto remoto canalizándolo por un tunel seguro, se puede utilizar el comando ssh. Por ejemplo, vamos a tunelizar una conexión contra el puerto telnet de la máquina remota telnet.example.com por medio del usuario ssh-user para tenerlo disponible en el puerto 2000 local de nuestra máquina:

1
ssh -f ssh-user@telnet.example.com -L 2000:telnet.example.com:23 -N

A partir de ahora podremos conectarnos al telnet conectando con localhost:2000.

Autentificación automática por SSH

Conseguiremos que la autentificación del cliente se haga por medio de una pareja de claves privada/pública en lugar de con identificador de usuario/password. Primero generamos la pareja de claves pública-privada ejecutando en el cliente ssh-keygen:

1
2
3
4
5
6
7
8
9
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@machine

Las claves se almacenan por defecto en ~/.ssh/, quedando el directorio así:

1
2
3
4
5
$ ls -l
total 12
-rw-------  1 user user  883 2005-08-13 14:16 id_rsa
-rw-r--r--  1 user user  223 2005-08-13 14:16 id_rsa.pub
-rw-r--r--  1 user user 1344 2005-08-04 02:14 known_hosts

Los ficheros id_rsa e id_rsa.pub contienen respectivamente las claves privada y pública. El fichero known_hosts contiene la lista de las claves públicas de las máquinas reconocidas.

Ahora se debe copiar la clave pública al servidor, al fichero ~/.ssh/authorized_keys. Para ello se utiliza el comando ssh-copy-id:

1
2
$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@machine1
$ ssh-copy-id -i ~/.ssh/id_rsa.pub user@machine2

ssh-copy-id es un script que se conecta a la máquina y copia el archivo (indicado por la opción -i) en ~/.ssh/authorized_keys, y ajusta los permisos a los valores adecuados.

Si no se dispone del programa ssh-copy-id se puede realizar una copia manual a la máquina remota del fichero conteniendo la clave pública (por ejemplo usando scp o sftp) y añadir su contenido al fichero ~/.ssh/authorized_keys.

Ahora la conexión debería funcionar sin necesidad de introducir la clave. Si no es así es posible que sea un problema de permisos en los ficheros. Los permisos correctos deben ser similares a estos:

1
2
$ chmod go-w ~ ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

La conexión SSH se realizará indicando el fichero con la clave privada como argumento de la siguiente forma:

1
$ ssh -i ~/.ssh/id_rsa user@machine

(Si el nombre del fichero con la clave privada es precisamente el del ejemplo, es decir id_rsa, creo que no es necesario indicarlo con la opción -i).

Ejecución remota de aplicaciones XWindow

  1. Abrir el servidor X (Cygwin)
  2. Iniciar sesión remota: ssh -X [usuario]@[máquina]
  3. Ejecutar la aplicación

Uso básico de screen

A continuación indico el uso típico:

  1. Arrancamos una sesión:

    1
    shell ~$ screen
    
  2. Aparece una splashscreen que cerramos pulsando enter y ya podemos trabajar

  3. Lanzamos un comando:

    1
    screenshell_1 ~$ top
    
  4. Para cerrar la sesión screen que acabamos de abrir, tan sólo hay que lanzar el comando exit (en este ejemplo, parando previamente el comando top que habíamos lanzado). Ahora sin embargo pretendemos dejarla abierta, con el comando top en ejecución, para volver a ella más adelante. Es lo que se llama un detach (sirve para recordar la tecla que se pulsa al final de la combinación de teclas). Para ello pulsamos la combinación de teclas:

    1
    "Ctrl-a" "d"
    
  5. Habremos vuelto a nuestro bash inicial. Cuando en cualquier momento queramos recuperar la sesión screen, lo haremos con el comando:

    1
    shell ~$ screen -r
    
  6. Ahora estaremos viendo de nuevo la salida del comando top que habíamos dejado arrancado dentro de la sesión screen. Volvemos a abandonar la sesión sin cerrarla procediendo por tanto como en el paso 4:

    1
    "Ctrl-a" "d"
    
  7. De vuelta al bash inicial, vamos a abrir una segunda sesión screen para ver cómo podemos movernos a una u a otra. Arrancamos la sesión como hicimos con la primera:

    1
    shell ~$ screen
    
  8. Cerramos la splashscreen y ejecutamos algún comando para reconocer la sesión cuando volvamos a ella. Por ejemplo:

    1
    screenshell_2 ~$ ping 8.8.8.8
    
  9. Abandonamos la sesión dejándola abierta:

    1
    "Ctrl-a" "d"
    
  10. De vuelta al bash inicial ahora tenemos dos sesiones screen lanzadas. Ahora el comando screen -r no se puede lanzar sin especificar el identificador de la sesión tras la opción -r. Obtenemos la lista de sesiones con el siguiente comando:

    1
    2
    3
    4
    5
    shell ~$ screen -list
    There are screens on:
        12629.pts-7.eduardo-HP-Folio-13 (04/04/15 13:55:03) (Detached)
        12609.pts-7.eduardo-HP-Folio-13 (04/04/15 13:54:51) (Detached)
    2 Sockets in /var/run/screen/S-edumoreno.
    
  11. Ahora, para recuperar una de ella, por ejemplo la más vieja que contenía lanzado el comando top incorporaremos el identificador de la sesión tras la opción -r (si la sesión aparece en el listado como Attached, no podremos conectar a no ser que añadamos la opción -d):

    1
    shell ~$ screen -r 12609.pts-7.eduardo-HP-Folio-13
    
  12. Como se comentaba en el punto 4, para cerrar las sesiones simplemente saldremos con exit, aunque también, y sobre todo en caso de que la sesión se quedara bloqueada con algún comando que no se pudiera cerrar, se puede matar la sesión con la siguiente combinación de teclas:

    1
    "Ctrl-a" "k"
    

GRUB

Configuración de opción predeterminada en GRUB

Fuente

  1. Editar fichero /etc/default/grub y modificar el parámetro GRUB_DEFAULT dando el valor saved en lugar del valor numérico que encontraremos.
  2. Ejecutar sudo update-grub.
  3. Ejecutar sudo grub-set-default N siendo N la posición de la entrada del menú de GRUB que queremos que actúe como predeterminada (contando desde 0).

Problemas con GRUB

Reinstalar GRUB 2

UEFI

Arranque y servicios

Ficheros implicados en arranque

  • /etc/rc.local: This script is executed at the end of each multiuser runlevel.

Instalación/desinstalación de scripts SysV/Upstart

Los scripts del serivicio deberán tener una cabecera especial que indique cómo deben comportarse en cada nivel de ejecución. Por ejemplo éste es el que tiene MySQL:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          mysql
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $time
# Should-Stop:       $network $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop the mysql database server daemon
# Description:       Controls the main MySQL database server daemon "mysqld"
#                    and its wrapper script "mysqld_safe".
### END INIT INFO
#
  • Instalar: sudo update-rc.d SERVICE defaults
  • Desinstalar: sudo update-rc.d -f SERVICE remove

Creación de servicios Systemd

  1. Crear un archivo en /etc/systemd/system/ con el nombre del servicio y la extensión .service.
  2. Insertar el siguiente contenido:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    [Unit]
    Description=Nombre del servicio
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    Type=simple
    ExecStart=/bin/bash /home/usuario/script_arranque.sh
    Restart=on-abort
    User=usuario
    Group=usuario
    
    [Install]
    WantedBy=multi-user.target
    
  3. Activar el nuevo servicio:

    1
    $ sudo systemctl enable mi_servicio.service
    
  4. Para no esperar al reinicio, arrancar manualmente el servicio:

    1
    $ sudo systemctl start mi_servicio.service
    
  5. Para comprobar si el servicio se inicia correctamente:

    1
    $ sudo systemctl status mi_servicio.service
    

Gestión de servicios Systemd

  • systemctl start SERVICE - Use it to start a service. Does not persist after reboot
  • systemctl stop SERVICE - Use it to stop a service. Does not persist after reboot
  • systemctl restart SERVICE - Use it to restart a service
  • systemctl reload SERVICE - If the service supports it, it will reload the config files related to it without interrupting any process that is using the service.
  • systemctl status SERVICE - Shows the status of a service. Tells whether a service is currently running.
  • systemctl enable SERVICE - Turns the service on, on the next reboot or on the next start event. It persists after reboot.
  • systemctl disable SERVICE - Turns the service off on the next reboot or on the next stop event. It persists after reboot.
  • systemctl is-enabled SERVICE - Check if a service is currently configured to start or not on the next reboot.
  • systemctl is-active SERVICE - Check if a service is currently active.
  • systemctl show SERVICE - Show all the information about the service.
  • systemctl mask SERVICE - Completely disable a service by linking it to /dev/null; you cannot start the service manually or enable the service.
  • systemctl unmask SERVICE - Removes the link to /dev/null and restores the ability to enable and or manually start the service.

Kernel y módulos

Añadir un módulo al kernel

1
$ sudo modprobe <modulo>

Si se quiere añadir de forma permanente, es decir, de forma automática en el arranque, se incorpora el nombre del módulo al fichero /etc/modules.

Cuando el módulo que se carga es un driver de un dispositivo, el kernel envía un evento al subsistema udev. La monitorización de estos mensajes se puede hacer teniendo abierto un terminal con el siguiente comando lanzado (fuente):

1
$ udevadm monitor --property

Listado de módulos

1
$ lsmod

Información de un módulo

1
$ modinfo <modulo>

Usuarios

Gestión de usuarios

  • sudo adduser userName: Añade usuario creando home.
  • sudo usermod -a -G groupName userName: Añade el usuario userName ya existente al grupo groupName ya existente.
  • sudo userdel -r userName: Borra el usuario eliminando su home.

Cambiar ID de usuario

Por ejemplo para sincronizar con los IDs de un sistema de archivos montado por NFS y así no tener problemas de permisos. En el siguiente ejemplo se cambia el ID del usuario edumoreno a 1002:

1
sudo usermod -u 1002 edumoreno

Eliminar petición password en sudo

Es necesario reconfigurar el fichero /etc/sudoers para que no se solicite el password del usuario a la hora de hacer sudo, dado que necesitamos que se haga sudo desde un proceso que no tendrá interacción con el usuario. Para conseguir esto hay que hacer dos cosas:

  1. Incorporar el usuario que nos interesa al grupo sudo del sistema
  2. Situar al final del fichero de configuración /etc/sudoers lo siguiente:
1
%sudo ALL=NOPASSWD: ALL

Hay que fijarse que la linea anterior normalmente ya aparece en el fichero pero comentada con una almohadilla. Se puede aprovechar la linea quitando el carácter almohadilla del principio, pero hay que tener en cuenta que no es suficiente con eso. Hay que mover la linea al final del fichero ya que las lineas siguientes pueden sobreescribir su efecto.

Importante: La edición del fichero /etc/sudoers sólo se puede hacer con el comando visudo. Este comando hay que lanzarlo con sudo a su vez, por lo que se hará de la siguiente forma:

1
$ sudo visudo

Migración masiva de usuarios

(Fuente)

Para los casos en los que sea necesario replicar los usuarios de un servidor Linux a otro o en los que se vaya a migrar a un servidor con más recursos, el siguiente procedimiento puede ser de utilidad.

Los escenarios son varios, desde los servidores que ejecutan algún tipo de base de datos, los que tienen ciertas aplicaciones, los que alojan páginas Web, etcétera. Para fines de la demostración pensaremos que el servidor está dedicado como servidor de archivos, mismos que se almacenan en el home de cada uno de los usuarios. NOTA: El presente procedimiento da por hecho que se hayan realizado las configuraciones necesarias en el nuevo servidor.

Primero, lo que debe respaldarse es la lista de usuarios con su respectiva contraseña. El archivo /etc/passwd contiene las cuentas de los usuarios en el sistema bajo el siguiente formato de ejemplo:

1
2
3
4
5
6
7
8
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/
nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
nitsuga:x:500:500::/home/nitsuga:/bin/bash
nitsuga2:x:501:501::/home/nitsuga2:/bin/bash
nitsuga3:x:502:502::/home/nitsuga3:/bin/bash

Como se observa, el segundo campo respectivo al hash de la contraseña no se muestra. La contraseña se encuentra en el archivo /etc/shadow

1
2
3
4
5
6
7
8
root:$1$/7zmwgAa$Jd5ja7nsC4nTm
O3s0.Z1j1:13445:0:99999:7:::
bin:*:13445:0:99999:7:::
daemon:*:13445:0:99999:7:::
adm:*:13445:0:99999:7:::
nitsuga:$1$QwPqN0Vc$dn9OIyE3HQUh5W4Yh/.aQ.:13498:2:1:1:::
nitsuga2:$1$635CQht0$rFIbilzKqfc1zStqeOwlk/:13496:2:45:7:::
nitsuga3:$1$635CQht0$rFIbilzKqfc1zStqeOwlk/:13496:2:45:7:::

Se procederá a unir el usuario con su contraseña utilizando el comando pwunconv para “desactivar” el shadow, quedando así las contraseñas en el archivo passwd.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
root:$1$/7zmwgAa$Jd5ja7nsC4n
TmO3s0.Z1j1:0:0:root:/root:/bin/bash
bin:*:1:1:bin:/bin:/sbin/nologin
daemon:*:2:2:daemon:/sbin:/sbin/
nologin
adm:*:3:4:adm:/var/adm:/sbin/nologin
nitsuga:$1$QwPqN0Vc$dn9OIyE3HQUh5W4Yh/.aQ.:500:500::/home/
nitsuga:/bin/bash
nitsuga2:$1$635CQht0$rFIbilzKqfc1zStqeOwlk/:501:501::/home/nitsuga2:/bin/bash
nitsuga3:$1$635CQht0$rFIbilzKqfc1zStqeOwlk/:502:502::/home/nitsuga3:/bin/bash

Depuración de /etc/passwd

Se copiará el archivo /etc/passwd a uno de trabajo /etc/passwd.migracion. Ahora se editará el archivo y se quitarán todos los usuarios propios del sistema (root, usuarios de demonios, etcétera) dejando sólo los usuarios que van a ser autenticados.

1
2
3
nitsuga:$1$QwPqN0Vc$dn9OIyE3HQUh5W4Yh/.aQ.:500:500::/home/nitsuga:/bin/bash
nitsuga2:$1$635CQht0$rFIbilzKqfc1zStqeOwlk/:501:501::/home/nitsuga2:/bin/bash
nitsuga3:$1$635CQht0$rFIbilzKqfc1zStqeOwlk/:502:502::/home/nitsuga2:/bin/bash

También se copiará el archivo /etc/group a /etc/group.migracion

1
2
3
4
5
6
7
8
9
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
nitsuga:x:500:
nitsuga2:x:501:
nitsuga3:x:502:
nitsuga8:x:507:

Y se editará para dejar sólo los grupos de los usuarios:

1
2
3
nitsuga:x:500:
nitsuga2:x:501:
nitsuga3:x:502:

Ahora se respaldará el home de los usuarios, suponiendo que se encuentra bajo el directorio/home, se hará lo siguiente desde raíz (/):

1
[root@localhost /]# tar -cpzvf home.tgz home/

En el que las banderas:

  • c = crea el archivo
  • p = preserva los permisos
  • z = comprime el archivo .tar generado
  • v = da salida detallada
  • f = especifica el archivo a crear (para este caso home.tgz)

Ahora bien, se realizará la transferencia de los archivos home.tgz, passwd.migracion y group.migracion al nuevo servidor:

1
2
3
4
5
[root@localhost /]# scp /home.tgz root@nuevoservidor

[root@localhost /]# scp /etc/passwd.migracion root@nuevoservidor

[root@localhost /]# scp /etc/group.migracion root@nuevoservidor

Una vez en el nuevo servidor se deberá verificar que no se repitan tanto los UID como los GID entre los dos servidores. Se realizará:

1
2
3
4
5
[root@localhost /]# cp –p home.tgz / ; tar –zxvf home.tgz

[root@localhost /]# cp –p passwd.migracion /etc ; pwunconv ; cat passwd.migracion >> passwd; pwconv

[root@localhost /]# cp –p group.migracion /etc ; cat group.migracion >> group

Configuración del sistema

Ficheros interesantes

Fichero Utilidad
/usr/lib/os-release Información sobre la distribución
/etc/security/limits.conf Configuration file for the pam_limits module. Permite limitar el número de ficheros abiertos por el sistema, el número de procesos, etc.

Ficheros definición variables de entorno

Si se necesita definir una variable global se podrá hacer en los ficheros:

  • /etc/environment
  • /etc/profile
  • /etc/profile.d
  • /etc/bashrc o /etc/bash.bashrc

Si es a nivel de usuario se hará en:

  • ~/.bashrc
  • ~/.bash_profile

Error "error while loading shared libraries: ..."

Runtime error. The linker hasn't found your libraries. Either they are not installed properly or the linker doesn't know where they are (most probably in /usr/local/lib). To get your linker to update its list of libraries type:

1
$ ldconfig /usr/local/lib

or as a temporary measure:

1
$ export LD_LIBRARY_PATH="/usr/local/lib"

En este documento se dan más detalles.

Proxy HTTP en consola

Setting up proxy at Firefox do not have effects at console, which means your wget, ssh, apt-get, yum etc do not access through the proxy you set at Firfox browser. To setup http proxy at console, you can do as bellow, assume the proxy IP is 219.93.2.113 and port 3128:

1
$ export http_proxy='http://219.93.2.113:3128/'

Remember, you have to specified http://, and to know more about export, check out HERE. To clear your http proxy and use back yours, do this:

1
$ export http_proxy=''

Redirección de salidas en bash

Para redirigir ambas salidas de un programa (estandar y error) hacer lo siguiente:

1
$ COMANDO>FICHERO_O_DISPOSITIVO 2>&1

Para redirigir la salida de error a un fichero o dispositivo:

1
$ COMANDO 2>FICHERO_O_DISPOSITIVO

En esta página se documenta con más detalle este tema.

Convertir nombres de ficheros de ISO a UTF-8

Al migrar una web, o al copiar un sistema de archivos, te puedes encontrar con nombres de ficheros en otras codificaciones de caracteres. Mediante el siguiente comando transformaríamos los nombres de ficheros desde ISO-8869-1 a UTF-8:

1
$ convmv -r -f ISO-8859-1 -t UTF-8  --notest *

Recodificar contenido de ficheros de Windows a UTF-8

1
$ recode ISO-8859-15/CR-LF..UTF8 fichero.txt

Para todos los ficheros de texto de un directorio:

1
$ find . ! -type d -name "*.txt" -exec recode ISO-8859-15/CR-LF..UTF8 {} \;

Obtener hash MD5 de una cadena

1
$ echo -n "<cadena>"|md5sum

Localización de ficheros .desktop

  • Los del usuario se encuentran en: ~/.local/share/applications
  • Los del sistema en: /usr/share/applications

Permisos

Ajustes de permisos a ficheros y directorios por separado

1
2
3
4
$ #Para los ficheros:
$ find . ! -type d -exec chmod 664 {} \;
$ #Para los directorios:
$ find . -type d -exec chmod 775 {} \;

Bits SUID, SGID y sticky

Manual de LuCAS

Discos, particiones y montaje

Reparación del sistema de archivos cuando se pone en modo "sólo lectura"

1
$ sudo fsck

Recuperación de pendrive o tarjeta de memoria corrupta

Con TestDisk/Photorec.

Enlaces

Montar imagen de disco o partición

(Fuente, también aquí)

  1. Averiguar la estructura de las particiones:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    $ fdisk -l Rpi_8gb_wheezy_backup.img
    Disco Rpi_8gb_wheezy_backup.img: 7,5 GiB, 8068792320 bytes, 15759360 sectores
    Unidades: sectores de 1 * 512 = 512 bytes
    Tamaño de sector (lógico/físico): 512 bytes / 512 bytes
    Tamaño de E/S (mínimo/óptimo): 512 bytes / 512 bytes
    Tipo de etiqueta de disco: dos
    Identificador del disco: 0x000981cb
    
    Dispositivo                Inicio Comienzo    Final Sectores Tamaño Id Tipo
    Rpi_8gb_wheezy_backup.img1            8192   122879   114688    56M  c W95 FAT32 (LBA)
    Rpi_8gb_wheezy_backup.img2          122880 15759359 15636480   7,5G 83 Linux
    
  2. Calcular el offset multiplicando el sector de comienzo de la partición por el tamaño del sector:

    1
    122880 * 512 = 62914560
    
  3. Montar:

    1
    $ sudo mount -t ext4 -o loop,offset=62914560,ro,noexec Rpi_8gb_wheezy_backup.img mnt
    

Backup de un FileSystem

Backup:

1
$ dd if=/dev/hdx | gzip > /path/to/image.gz

Restauración:

1
$ gzip -dc /path/to/image.gz | dd of=/dev/hdx

Montar ext4 para usuario

Normalmente al automontar una partición ext4 se respetarán los ID's de los propietarios:grupos de los ficheros. Para montar temporalmente con permisos ajustados para un usuario, utilizar bindfs de esta forma:

1
2
3
# El punto de partida es una partición automontada de esta forma:
# /dev/sdb1                                   306616440      64348   290907216   1% /media/edumoreno/47acea17-841f-42d3-85f2-886543f056db
sudo bindfs -u $(id -u) -g $(id -g) /media/edumoreno/47acea17-841f-42d3-85f2-886543f056db /home/edumoreno/mnt/

Compartir ficheros en red

Compartir ficheros con Samba

Aparte de instalar y configurar Samba (fichero /etc/samba/smb.conf) hay que dar de alta los usuarios UNIX que se usarán a través de Samba y asignarles un password para el acceso por el mismo. Esto se hace con el comando:

1
$ sudo smbpasswd -a usuario

Montaje de carpeta compartida samba en /etc/fstab

Crear un fichero /home/usuario/.smbcredentials con el siguiente contenido:

1
2
user=usuario
password=password

Añadir la siguiente línea a /etc/fstab:

1
192.168.1.100/carpeta_compartida /home/usuario/punto_montaje cifs uid=usuario,gid=usuario,credentials=/home/usuario/.smbcredentials,iocharset=utf8,sec=ntlmv2,file_mode=0664,dir_mode=0775 0 0

Montado de unidades de red con autofs

NFS

(Fuente)

  1. Instalar paquetes:

    1
    $ sudo apt-get install autofs nfs-common
    
  2. Añadir lo siguiente al final del fichero /etc/auto.master:

    1
    /home/usuario/red   /etc/auto.red
    
  3. Crear fichero /etc/auto.red con el siguiente contenido (cambiar rw por ro si se desea acceso de sólo lectura):

    1
    montaje  -fstype=nfs4,rw 192.168.1.100:/path/directory
    
  4. Crear enlaces a los directorios montados con autofs:

    1
    2
    $ cd ~
    $ ln -s /home/usuario/red/montaje montaje
    

SMB/CIFS

(Fuente)

  1. Instalar paquetes:

    1
    $ sudo apt-get install autofs smbclient cifs-utils
    
  2. Añadir lo siguiente al final del fichero /etc/auto.master:

    1
    /home/usuario/red /etc/auto.red --timeout=600
    
  3. Crear fichero /etc/auto.red con el siguiente contenido:

    1
    montaje  -fstype=cifs,rw,noperm,netbiosname=${HOST},credentials=/home/usuario/.smbcredentials  ://192.168.1.100/carpeta_compartida
    
  4. Crear fichero /home/usuario/.smbcredentials con el siguiente contenido:

    username=<usuario> password=<password>

  5. Proteger el fichero:

    1
    $ chmod 600 /home/usuario/.smbcredentials
    
  6. Crear enlaces a los directorios montados con autofs:

    1
    2
    $ cd ~
    $ ln -s /home/usuario/red/montaje montaje
    

Escritorio

Configuración de gedit

Al menos las últimas versiones de gedit no tienen un panel de ajustes para las opciones predeterminadas. Cada vez que arranca aparecen preajustados 8 espacios como anchura del tabulador y no sustituye por espacios. Puede sacarse una lista de todos los ajustes que se pueden cambiar con el siguiente comando:

1
gsettings list-recursively | grep -i gedit.preferences.editor

Los ajustes del tabulador mencionados antes, para pasar a 4 espacios, ejecutar:

1
2
gsettings set org.gnome.gedit.preferences.editor insert-spaces true
gsettings set org.gnome.gedit.preferences.editor tabs-size 4

Otro ajuste interesante es el del wrap mode. Se puede hacer con (puede valer 'none', 'word', 'char', o 'word-char'):

1
gsettings set org.gnome.gedit.preferences.editor wrap-mode 'word'

Recursos gráficos

1
2
3
4
5
6
7
8
9
/usr/share/icons
/usr/share/app-install/icons
/usr/share/pixmaps
/usr/share/icons/gnome
/usr/share/icons/hicolor
/usr/share/icons/Human
/usr/share/icons/Humanity        <---
/usr/share/icons/oxygen
/usr/share/icons/default.kde4    <---

Multimedia

Redimensionado de imágenes en lote

Por ejemplo a 1080 de alto manteniendo el ratio dentro de un directorio llamado resized:

1
$ convert '*.jpg[x1080]' resized/%03d.jpg

En ocasiones, si hay varios miles de fotos, se puede llenar la memoria. En este caso hacer la conversión con el siguiente comando, que trata las imágenes una a una:

1
2
3
4
5
6
a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" ${a})
  convert ${i}[x1080] resized/${new}
  let a=a+1
done

Crop y resize de imágenes en lote

1
2
3
4
5
6
a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" ${a})
  convert ${i} -crop wxh+x+y -resize wsxhs -gravity Center ${new}
  let a=a+1
done

donde:

  • w: ancho del crop
  • h: alto del crop
  • x: posición horizontal esquina superior derecha del crop
  • y: posición vertical esquina superior derecha del crop
  • ws: ancho del reescalado final
  • hs: alto del reescalado final

Conversión de formato de imágenes en lote

1
2
3
4
5
for file in *.jpg; do
  filename=$(basename "$file")
  fileid=${filename%%.*}
  convert ${filename} ${fileid}.png
done

Montaje de gif a partir de imágenes

1
convert -delay n -loop 0 *.jpg output.gif

donde:

  • n: milisegundos entre cada frame.

Split de vídeos

(Fuente)

Con el siguiente comando:

1
$ ffmpeg -i archivo_original.mp4 -codec copy -ss 00:00:00 -t 00:04:09 archivo_recortado.mp4

Donde el valor de la opción -ss es el instante de inicio en hh:mm:ss y el valor de -t es la longitud en hh:mm:ss

Es importante respetar el orden de las opciones, sobre todo poner al principio la opción -i que indica el fichero de entrada. De no hacerlo así (se explica aquí) las opciones de codec no saben localizar bien los codecs del fichero de entrada.

Un par de codecs comprobados que suelen dar buen resultados son h264 y aac:

1
ffmpeg -i archivo_original.mp4 -acodec aac -vcodec h264 -ss 01:07:38 -t 00:01:14 archivo_recortado.mp4

Crop en video

1
$ ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4

donde:

  • w: ancho final
  • h: alto final
  • x: coordenada x del punto superior izquierdo del recuadro
  • y: coordenada y del punto superior izquierdo del recuadro

Extraer frame de video

1
$ ffmpeg -i input.mp4 -ss 00:01:00 -frames:v 1 frame.png

donde el argumento -ss marca el instante del frame en hh:mm:ss

Montaje de vídeo StopMotion a partir de imágenes

A 10fps por ejemplo :

1
$ ffmpeg -f image2 -r 10 -i %04d.jpg -vf scale=1440:1080 -r:v 10 -c:v libx264 -qp 0 -preset veryslow -an "video.mkv"

Compresión batch de vídeos

Instalar el cliente de linea de comando de Handbrake.

Dependiendo de la extensión habrá que cambiar el ls inicial. Los vídeos de salida son MP4, por lo que si la extensión inicial no es esa, habrá que cambiarla en los ficheros finales.

1
2
$ mkdir comp
$ ls *.mp4 | awk '{print "HandBrakeCLI -Z Normal -i "$0" -o comp/"$0}' | sh

Resampleado de video con HandBrake

(Fuente)

On the Video tab use Avg Bitrate and use 2500 to 3000 depending if a big action movie(3000) or if less fast action/movement in the movie(2500). Make sure to click on 2-Pass Encoding and Turbo first pass.

Convertir APE a WAV

Los ficheros .ape con que se distribuyen algunos CD's se puede convertir a WAV para poder quemarlo a un CD (con un fichero .cue que normalmente acompaña al .ape se puede quemar directamente con el Burn del Mac por ejemplo) instalando el paquete ffmpeg y ejecutando el siguiente comando:

1
$ ffmpeg -i fichero.ape fichero.wav

Hay que acordarse de sustituir dentro del fichero .cue la referencia al fichero original .ape por el nuevo .wav.

Convertir FLAC a WAV

Los ficheros .flac con que se distribuyen algunos CD's se puede convertir a WAV para poder quemarlo a un CD (con un fichero .cue que normalmente acompaña al .flac se puede quemar directamente con el Burn del Mac por ejemplo) instalando el paquete flac y ejecutando el siguiente comando:

1
$ flac -d fichero.flac

Hay que acordarse de sustituir dentro del fichero .cue la referencia al fichero original .flac por el nuevo .wav.

Tratamiento de ficheros en lote

Renombrado de archivos en lote

Por ejemplo una serie de archivos jpg:

1
2
3
4
5
6
a=1
for i in *.jpg; do
  new=$(printf "%04d.jpg" ${a})
  mv ${i} ${new}
  let a=a+1
done

Renombrado de ficheros de mayúsculas a minúsculas

(Fuente)

1
2
3
4
5
#!/bin/sh
for f in *; do
g=`expr "xxx$f" : 'xxx\(.*\)' | tr '[A-Z]' '[a-z]'`
mv "$f" "$g"
done

Quitar los primeros 5 caracteres de los ficheros de un directorio

1
2
3
for f in *.gba; do
mv "$f" "${f:5:${#f}}"
done

Compresión de ficheros en lote

1
2
3
4
5
for file in *.col; do
  filename=$(basename "${file}")
  fileid=${filename%%.*}
  7z a "${fileid}.7z" "${filename}"
done

Comprimir uno a uno los ficheros de un directorio

Por ejemplo ficheros de extensión .gba:

1
2
3
4
for f in *.gba; do
file=$(basename "$f" .gba)
zip "${file}.zip" "${file}.gba"
done

Sustitución de cadena en ficheros en lote

1
2
3
4
5
for file in *.cfg; do
  filename=$(basename "${file}")
  fileid=${filename%%.*}
  sed -i 's/ShowFps 1/ShowFps 0/' "${file}"
done

Búqueda de ficheros que contienen una cadena

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for file in `find .`
do
fgrep "[cadena a buscar]" $file > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo $file
fi
done
IFS=$SAVEIFS

En realidad el script anterior hace lo mismo que el simple comando siguiente:

1
$ fgrep -rl "[cadena a buscar]" .

PDFs

Instalar pdftk, programa en linea de comando para procesar ficheros PDF. Está para casi todas las plataformas.

1
2
3
4
$ sudo aptitude search pdftk
i pdftk - A useful tool for manipulating PDF documents

$ sudo aptitude install pdftk

Concatenar

Concatenar todos los archivos facilmente que tengas en una carpeta:

1
$ pdftk carpeta_con_todos_ficheros/*.pdf cat output fichero_concatenado.pdf

Fusión de varios ficheros en uno (equivalente a la anterior):

1
$ pdftk *.pdf cat output onelargepdfile.pdf

División

División en múltiples ficheros (uno por página):

1
$ pdftk largepdfile.pdf burst

Tiene muchas mas funcionalidades consultables con –help, pero si quieres, puedes echarle un vistazo a un articulo de Linux-Magazine “PDF a tope”.

Wireshark

Configurar Wireshark para poder capturar con usuarios no-root

Ejecutar lo siguiente:

1
2
$ sudo dpkg-reconfigure wireshark-common
$ sudo usermod -a -G wireshark <usuario>

Reiniciar la sesión.

Arch Linux

Enlaces

  • Chaotic-AUR: Compilación automática de paquetes AUR.

Paquetes interesantes

  • pamac-aur (AUR): Interfaz gráfica para pacman/yay.

Comandos yay

  • yay -Syu: Actualizar el sistema, incluyendo paquetes de AUR. Equivalente en Debian a apt upgrade.
  • yay -S <paquete>: Instalar un paquete desde AUR. Equivalente en Debian a apt install.
  • yay -Rns <paquete>: Desinstalar un paquete de AUR, sus dependencias y archivos de configuración. Equivalente en Debian a apt purge.

Modificación manual de paquetes AUR

Este es el procedimiento oficial cuando un paquete falla, quieres aplicar un parche personalizado o necesitas cambiar una opción de compilación antes de instalar.

1. Clonar el repositorio del paquete

En lugar de usar un helper (como yay), descargamos el código fuente directamente desde los servidores de AUR usando Git.

1
2
git clone https://aur.archlinux.org/nombre-del-paquete.git
cd nombre-del-paquete

2. Modificar el PKGBUILD o archivos fuente

Aquí es donde editas lo que necesites.

  • Para errores de rutas: Edita las funciones build() o package() dentro del archivo PKGBUILD.
  • Para cambiar versiones: Modifica la variable pkgver.

Tip

Si modificas archivos que están listados en el array source() (como un parche .patch o un script .sh), las sumas de verificación (checksums) fallarán. Para arreglarlo automáticamente, ejecuta:

1
updpkgsums

3. Compilar e Instalar

Una vez que el PKGBUILD está a tu gusto, usamos el comando makepkg.

1
makepkg -si

Desglose de flags:

  • -s (sync): Instala automáticamente las dependencias necesarias usando pacman.
  • -i (install): Instala el paquete generado (.pkg.tar.zst) en tu sistema una vez terminada la compilación.

Resumen de comandos

Acción Comando
Bajar fuentes git clone [https://aur.archlinux.org/paquete.git](https://aur.archlinux.org/paquete.git)
Actualizar sumas updpkgsums
Limpiar y compilar makepkg -f (el -f fuerza a sobrescribir si ya compilaste antes)
Compilar e instalar makepkg -si
Limpiar basura makepkg -c (borra los directorios temporales src/ y pkg/ tras terminar)

¿Cómo manejar las actualizaciones futuras?

Si modificaste un paquete manualmente, la próxima vez que uses yay -Syu, el helper verá que hay una versión nueva en AUR e intentará sobrescribir tu versión modificada. Tienes dos opciones:

  1. Si el error ya se arregló en AUR: Deja que yay lo actualice normalmente.
  2. Si quieres mantener tu modificación: Puedes añadir el paquete a la línea IgnorePkg en /etc/pacman.conf para que pacman no lo toque sin tu permiso.

Ubuntu

Enlaces

Paquetes a instalar en Xubuntu

  • font-viewer: Visor/instalador de tipos de letra.
  • python3-pip: PIP instalado desde los repositorios (facilita la instalación de virtualenvwrapper).
  • python-is-python3: Abre Python3 ejecutando python.
  • android-file-transfer: Para transferir ficheros por MTP (hacia Android o las Oculus Quest).
  • qpdfview: Visor PDF.
  • thunar-archive-plugin: Crear archivadores y descomprimir desde Thunar.
  • gvfs gvfs-common gvfs-backends gvfs-fuse thunar-volman: Soporte MTP para Android.

Limpieza de paquetes snap

Localizar los paquetes desactivados con:

1
$ snap list --all|fgrep desactivado

Y luego borrarlos con:

1
$ snap remove --revision XXX NOMBRE

Por ejemplo:

1
2
3
4
5
6
7
edumoreno@eduardo-HP-Folio-13:~$ snap list --all|fgrep desactivado
canonical-livepatch   9.7.3                       105    latest/stable    canonical*  desactivado
chromium              94.0.4606.81                1781   latest/stable    canonical*  desactivado
edumoreno@eduardo-HP-Folio-13:~$ snap remove --revision 105 canonical-livepatch
canonical-livepatch (revisión 105) eliminado
edumoreno@eduardo-HP-Folio-13:~$ snap remove --revision 1781 chromium
chromium (revisión 1781) eliminado

Configuración de idiomas del sistema (locales)

1
$ sudo dpkg-reconfigure locales

Configuración de SWAP en disco SSD

Siguiendo esta página, añado lo siguiente al fichero /etc/sysctl.conf para bajar el 60% que usa Ubuntu por defecto a 10%:

1
vm.swappiness=10

Problema con aplicaciones root en Wayland

Hay que ejecutar el comando:

1
xhost si:localuser:root

Se puede automatizar en el arranque añadiendo el comando en las Aplicaciones al incio (fuente).