Archivo de la categoría: Linux

Como saber si un usuario tiene acceso por SSH

[linux]

Tan fácil como mirar el fichero /etc/passwd

Aquí vemos el listado de usuario con la terminal que tienen asignada. Si la terminal no existe, como por ejemplo /bit/false, el usuario será desconectado inmediatamente al hacer login.

Para solucionarlo, editamos el fichero y le damos un terminal válido, como por ejemplo /bin/bash

La solución original en StackOverflow.

Montar un entorno de desarrollo a partir de un Git remoto

[linux] [mac] [programación]

En resumen, lo que queremos hacer es un checkout de una o varias ramas del repositorio remoto. Para ello seguimos los siguientes pasos:

1. Crear una carpeta donde tendremos nuestro entorno y entrar en ella.

2. Inicializamos el repositorio:

git init

3. Añadimos la ruta al repositorio remoto:

git remote add origin https://[usuario]@[repositorio]

4. Obtenemos las ramas/tags remotos. En este punto nos pedirá la contraseña del repositorio remoto:

git fetch

5. Hacemos el checkout de la rama con la que queramos trabajar:

git checkout develop

Y listo! A trabajar!

Instalar MCrypt en Ubuntu

[linux] [programación]

En un artículo anterior ya hable de como instalar MCrypt en Max OSX. En ubuntu el proceso también es sencillo.

1. Instalamos MCrypt:

sudo apt-get install php5-mcrypt

2. Indicamos a PHP que puede usar el módulo. Editamos el fichero php.ini:

sudo gedit /etc/php5/cli/php.ini

3. Al final de la sección de Dynamic Extensions añadimos esta línea y guardamos el fichero:

extension=mcrypt.so

¡Y ya está! Fácil 😉

phpunit con CIUnit no hace nada

[linux] [programación]

Ejecución de phpunit sin salida por consola

Este es otro claro ejemplo de problema en informática al que dedicas un montón de tiempo y te vuelves loco para resolverlo, y al final resulta ser una chorrada. El problema es el siguiente: yo hago mis tests para CodeIgniter utilizando CIUnit y en mi anterior sistema todo funcionaba (MacOSX). Cambio de sistema a un Linux Ubuntu, y cuando lanzo los tests no ocurre nada. No hay mensajes, no hay errores, no hay nada de nada.

Así que tras muchos días de pruebas, en mi desesperación me pongo a añadir mensajes de debug por todo el código de la librería CIUnit y el core de CodeIgniter para encontrar en que momento se para la ejecución, hasta llegar a esta línea:

return @mysql_pconnect($this->hostname, $this->username, $this->password);

Esta línea en el fichero /system/database/drivers/mysql/mysql_driver.php es donde salimos de CodeIgniter para entrar en el core de PHP y es donde la ejecución está fallando. Y a algún “genio” se le ocurrió que sería una buena idea silenciar los errores…

Al quitar el silencio, PHP nos informa de que no puede conectarse a la base de datos porque no tiene el driver de mysql instalado, lo cual podemos solucionar fácilmente con:

sudo apt-get install php5-mysql

Aquí dejo un listado de comandos que me han sido útiles en la resolución del problema:

Comprobar si tienes un módulo instalado:

php -i | grep nombre_del_modulo

Por ejemplo:

php -i | grep mysql

Obtener el listado de módulos que podemos instalar:

apt-cache search php5-

Establecer Fish como shell por defecto en Ubuntu

[linux]

Por fin tengo equipo nuevo en el trabajo, un precioso portátil HP con su flamante Windows 8 … que ha durado como 5 minutos hasta que lo he sustituido por un Ubuntu 😛

Así que de nuevo tengo que ver como sustituir el aburrido bash por Fish:

1. Instalamos Fish. Lo cual es tremendamente sencillo ya que se instala a través del Centro de software de Ubuntu. Mejor si descargamos el paquete de la web que tendrá una versión más reciente.

2. Abrimos el terminal, y tecleando fish ya nos lanza el nuevo shell. Pero mejor si esto es automático. Para ello tenemos que añadir el comando fish en uno de estos dos ficheros: .bashrc o .bash_profile, ambos en la carpeta home del usuario. La diferencia fundamental es que .bashrc se lanza si la shell es “interactiva” mientras que .bash_profile se lanza si es una shell de “login”. En esta página tenéis una explicación más detallada de las diferencias entre los ficheros.

3. (Opcional) Para muchas tareas (en mi caso todo lo que use Ruby), es necesario que el terminal se lance en modo “login”, ya que RVM define su path en .bash_profile.  Podemos lanzar la shell de login con el comando /bin/bash --login, pero entonces tendríamos que volver a lanzar fish. Lo ideal es indicar al terminal que se lance en modo “login”. Para ello, En el menú del terminal, vamos a Editar -> Perfiles… Seleccionamos uno (puede ser el Default o creamos uno nuevo) y le damos a Editar. En la pestaña Título y comando, seleccionamos la opción Ejecutar el comando como un intérprete de conexión.

‘curl: (6) Couldn’t resolve host’ en un servidor con Plesk

[linux]

En el servidor que uso en el trabajo tenemos dos tareas programadas en el Cron. Ejecutando crontab -l podíamos ver la configuración establecida:

SHELL=/opt/psa/bin/chrootsh
MAILTO=""
0 9 * * * /usr/bin/curl http://myweb.com/mytask

0 3 * * 0 /path/to/a/script/script.sh

Sin embargo ninguna de las dos tareas se estaba ejecutando. Tras investigar un poco, pruebo a utilizar el Shell que se especifica en el Cron descubriendo dos cosas:

1. La nueva raíz de directorio para este SHELL es distinta, y por tanto la ruta hasta el script.sh no existe.

2. Curl no es capaz de resolver la URL.

La solución al primer problema es sencilla, únicamente debemos corregir la ruta para que cumpla con la nueva raíz del shell. La segunda no es tan inmediata, y probablemente se deba a un fallo en la configuración de los DNS. En cualquier caso, y como solución rápida, elimino esa primera línea indicando el SHELL, ya que por lo que veo no está aportando nada excepto problemas. Tras realizar esa acción, curl empieza a funcionar correctamente.

Impedir que se apage la pantalla al ver un vídeo flash a pantalla completa en Ubuntu

[linux] [programación]

Hace unas semanas abandoné Windows XP definitivamente para pasarme a Linux Ubuntu y la verdad es que estoy encantado. Muchos de los inconvenientes que recuerdo de veces anteriores en las que he intentado usar Linux han desaparecido y el ordenador ha encontrado una segunda juventud, funcionando más rápido de lo que ha ido nunca.

Pero como no, algunas cosillas siguen siendo muy de Linux, como por ejemplo que cuando estoy viendo un vídeo flash a pantalla completa, Ubuntu considere que no estás haciendo nada e intente apagar la pantalla. Esto supongo que es problema de flash, porque con el VLC no pasa.

En esta página explican como solucionar el problema, desactivando y activando el economizador de energía cuando se detecta un alto uso del procesador, pero esta solución no me estaba funcionado, así que opté por la solución más sencilla, mover el ratón un píxel cada 5 minutos. Así que cuando voy a ver un vídeo largo, lanzo el script y evito que se apague la pantalla.

Aquí tenéis el código, que cada 5 minutos mueve el ratón un píxel a la derecha, y después un píxel a la izquierda.

#!/usr/bin/env bash

sleep_period=5m

while true; do
  xdotool mousemove_relative 1 0
  xdotool mousemove_relative -- -1 0

  sleep ${sleep_period}
done

El programa xdotool no viene por defecto con Ubuntu,  pero lo podéis encontrar en el “Centro de software de Ubuntu”. También recordad cambiar los permisos de ejecución con chmod +x

phpThumb no funciona con enlaces simbólicos

[linux] [programación]

Al menos eso era aparentemente mi problema, y mi punto de partida en búsqueda de una solución.

Básicamente el problema se podía resumir de la siguiente manera:

La imagen se ve correctamente:

http://www.midominio.com/imagenes/test.jpg

La imagen se ve correctamente y redimensionada:

http://www.midominio.com/phpThumb.php?url=imagenes/test.jpg&h=150

La imagen se ve correctamente. La carpeta “colecciones” es un enlace simbólico:

http://www.midominio.com/colecciones/imagenes/test.jpg

La imagen no se ve y phpThumb muestra un mensaje sobre el correcto uso del plugin:

http://www.midominio.com/phpThumb.php?url=colecciones/imagenes/test.jpg&h=150

Da la impresión que el problema aquí es ese enlace simbólico, pero no, este comportamiento se debe al siguiente valor de configuración de phpThumb:

$PHPTHUMB_CONFIG['allow_src_above_docroot'] = false;

En mi caso el enlace simbólico estaba apuntando a un directorio que estaba a un nivel superior que el contenido de la web, lo cual unido a este parámetro estaba bloqueando su acceso. La solución era tan simple como ponerlo a ‘true’.

La solución la encontré en una de las últimas respuestas de este hilo.

Cositas útiles para Linux

[linux]

Almacenar en un fichero el listado de ficheros en un directorio:

find ./ -type f -print | tee ../listado.txt

Buscar que fichero contiene determinada frase de forma recursiva en un directorio:

grep -H -r "la frase" ./directorio

Cambiar los permisos de todos los ficheros de forma recursiva:

find ./ -type f -exec chmod 755 {} ;

Comprimir un directorio:

tar cvzf directorio.tar.gz ./directorio

Contar todos los fichero en un directorio y sus subdirectorios:

ls -R ./directorio | wc -l

Copiar una carpeta manteniendo la fecha de modificación de los ficheros:

cp -a -p ./directorio/ /destino/

Descomprimir un fichero:

tar xzvf directorio.tar.gz

Eliminar una carpeta y todas sus subcarpetas:

rm -rf DIRNAME

Mover todos los ficheros de un determinado tipo de la carpeta actual a otra carpeta:

find ./ -iname "*.extension" -type f -exec /bin/mv {} /carpeta/destino ;

Mover todos los ficheros y directorios de una carpeta al nivel superior:

mv ./directorio/* .

Mover todos los ficheros y directorios a una subcarpeta:

mv !(subcarpeta) subcarpeta

Listar todos los discos disponibles:

lsblk o fdisk -l

Listar todos los ficheros zip ordenados por fecha:

ls -alt *.zip

Buscar las lineas de un fichero que contienen las lineas de otro fichero en Linux

[linux]

Me ha quedado un poco enrevesado el título del artículo, pero no veo forma más fácil de expresarlo en una linea. Creo que lo más fácil va a ser dar una explicación detallada.

Tengo dos ficheros. El primero contiene un listado de IDs, con un ID por línea:

458-12-345
466-44-3-223
578-4-58-1
599-478
854-52658
955-12-32

El segundo fichero tiene un listado de IDs seguidos de la información relevante:

111-2457-1 0.2545 0.5484 0.6914 0.4222
112-4844-487 0.7475 0.4749 0.1114 0.8413
115-44-48-5 0.4464 0.8894 0.1140 0.1044
...

Los IDs del primer fichero son los que necesito, y hay unos 1,000 mientras que en el segundo fichero tengo más de 200,000 líneas. La instrucción bash que estaba utilizando era la siguiente:

cat fichero1.txt | while read line; do cat fichero2.txt | egrep "^line "; done > fichero_resultado.txt

Esta instrucción realiza la tarea correctamente, pero es muy lenta. Hay que tener en cuenta que está realizando unas 1,000 búsquedas en un fichero de 200,000 líneas que pesa casi 400 MB. Además, por alguna razón que desconozco, esta instrucción que me funciona tanto en un Fedora como en Cygwin, no consigo que me funcione en Ubuntu. Lo he probado todo y no hay manera. Tal vez sea por alguna actualización o por estar corriendo en una máquina virtual, pero por alguna razón no va.

Así que preguntando en StackOverflow, me han dado una solución:

awk 'FNR==NR{i[$1]=1;next} i[$1]{print}' fichero1.txt fichero2.txt > fichero_resultado.txt

No he usado awk antes, así que ahora mismo no se que hace, pero funciona, y es mucho más rápido (tarda apenas unos segundos).