viernes, 28 de enero de 2011

Terminal: buscar un comando ejecutado antes

Hay muchas veces en las que queremos ejecutar un comando que hemos puesto previamente, pero por vaguería, por ser muy largo o porque no nos acordamos exactamente de como era, no queremos volver a escribir.

Lo tipico que hacía era mostrar el contenido del ~/.bash_history:
cat .bash_history

o buscar en ese fichero algo del comando que nos suene (ej: checkout):
$ cat .bash_history | grep checkout
git checkout new_domain
$

Pero se puede hacer de manera más fácil. Dentro del terminal pulsamos ^r (Ctrl + r), nos aparecerá lo siguiente:
(reverse-i-search)`':

Ahora solo tenemos que escribir lo que buscamos. Nos aparecerá el último comando ejecutado que contenga esos caracteres. Si queremos alguno anterior a ese solo tenemos que volver a dar a ^r.
Por ejemplo, buscando check:
(reverse-i-search)`check': git checkout integration

Si queremos ejecutar el comando pulsamos enter, y si queremos movernos por él con las teclas de dirección.

P.D: Ya no se ni como pongo los formatos.

jueves, 27 de enero de 2011

GIT: Crear un proyecto y subirlo a un servidor

El proceso inicial es bastante raro, aviso.
Se supone que hemos estado trabajando con nuestro repositorio local, pero ahora queremos subirlo a nuestro repositorio central para compartirlo con mas gente.

Para ello vamos a crear la carpeta en el servidor, vamos a configurarla y después uniremos el trabajo realizado en local con la carpeta en el servidor.

Se supone que ya tenemos nuestra carpeta creada localmente (git init, git add, git commit, etc), pero para que no haya lios vamos a mostrar el proceso entero.
En local creamos la carpeta ejemplo, e inicializamos el proyecto ahí:
LOCAL
mkdir ejemplo
cd ejemplo
git init

Si intentamos sincronizar el proyecto vacío nos devolverá error (No refs in common and none specified; doing nothing.), así que añadimos nuestros archivos del proyecto y realizamos un commit (pondré algo a modo de ejemplo, pero podéis poner el vuestro proyecto directamente).
LOCAL
echo ejemplo > ejemplo.txt
git add .
git commit

Ahora vamos a crear la carpeta en el servidor, donde vamos a guardar el proyecto.

El directorio raíz de todos los proyectos lo vamos a situar en /var/git (se puede cambiar).
No hay ningún problema en ponerlo en otro sitio.

Por estándar el nombre de la carpeta del proyecto es el mismo que el del proyecto local, pero terminado en .git, si nuestro proyecto se llama ejemplo, pues usaremos “ejemplo.git”.

Nos situamos en /var/git, creamos la carpeta ejemplo.git y entramos en ella:
SERVIDOR
mkdir ejemplo.git
cd ejemplo.git

Una vez creada la carpeta se inicializará el respositorio con este comando (desde la carpeta):
SERVIDOR
git init --bare --shared=group

Asignarle el bit s a la carpeta creada
SERVIDOR
cd ..
chmod -R g+s ‘ejemplo.git’

Tener cuidado de asignar la carpeta al grupo que queramos (en este caso utilizamos el grupo git):
SERVIDOR
chgrp -R git ejemplo.git

Ya hemos terminado el trabajo en el servidor, ahora solo quería sincronizar el proyecto desde donde tengamos nuestro repositorio local, si estamos en nuestra maquina en la carpeta ejemplo hacemos:
LOCAL
git push --all ssh://’user’@’server’/var/git/ejemplo.git

Una vez hecho esto ya esta en el servidor.

Para que queden bien todas las referencias dentro del proyecto lo mas sencillo es borrarlo del repositorio local, y clonarlo desde el servidor, así no habrá problemas:
LOCAL
rm -rf ejemplo
git clone ssh://’user’@’server’/var/git/ejemplo.git

Debemos asegurarnos que ‘user’ pertenece al mismo grupo al que pertenece la carpeta que queremos bajar(en este caso git).

Podemos editar el fichero /etc/group y añadirnos:
git:x:1005:user1,user2,user3,...

miércoles, 26 de enero de 2011

Screen manejador de ventanas en linux

Screen es un manejador de ventanas que multiplexa un terminal en varios procesos.

Con esto podemos tener un único terminal abierto en el que podemos tener varias sesiones.
También podemos dejar abiertas esas sesiones y cerrar el terminal original para despues recuperarlas más tarde. Y los procesos que se ejecutan en ellas no se quedan en background, sino que están en ejecución.

El control no es demasiado intuitivo, pero puede que quizás te valga la pena.

Para ejecutarlo solo tenemos que invocar el comando screen.

Parecerá que no hace nada pero ya tenemos una sesion screen abierta.
Para ver los comandos debemos hacer ^A (Ctrl + A) y después ?, veremos la siguiente ventana.


Tenemos algunos comandos útiles, y todos se invocan pulsando primero ^A y después las letras que salen en el menú.

^A A: renombramos el titulo de la sesion de screen actual.
^A c: multiplexa una nueva sesión dentro de screen.
^A ": muestra la lista de sesiones disponibles
^A ^A: cambia entre las ultimas sesiones de screen vistas.
^A ^D: "liberas" la sesion actual. Vuelves a tu terminal normal, pero la sesion de screen sigue activa, y puedes volver a abrirla.

Una vez "liberada" la sesión podemos volver a abrirla de la siguiente manera.
con screen -ls vemos las sesiones de screen abiertas, y con screen -x abrimos la última sesion abierta.
Para cerrar screen definitivamente sólo tenemos que salir de todas las sesiones abiertas dentro de screen con exit.

Configuración basica de ssh en linux

No es que vaya a salvar la vida a nadie esta ayuda, pero puede ser útil cuando trabajamos mucho con sesiones ssh, o cuando no nos apetece tener que aprendernos las direcciones ip, o simplemente queremos escribir menos.

Si accedemos de la siguiente manera:
  • ssh usuarioP@192.168.1.14
Podemos configurar el fichero ~/.ssh/config para no tener que escribir todo el tiempo el usuario con el que vamos a entrar y la dirección:
Host ejemplo
Hostname 192.168.1.14
User usuarioP

A partir de entonces nos bastará con:
  • ssh ejemplo

martes, 25 de enero de 2011

Varias sesiones por un mismo socket

Esto nos sirve para cuando tenemos que abrir varias sesiones hacia una maquina (por ssh).

En vez de tener que logearnos una vez por cada sesión sólo (con acento ¬¬) nos logearemos una vez para todas las sesiones, y estas sesiones compartiran el socket entre ellas.

Para conseguir esto tenemos que escribir lo siguiente en el fichero ~/.ssh/config :
Host *
ControlMaster auto
ControlPath ~/.ssh/socks/%r@%h:%p
Y ya esta listo.