Uso de screen via ssh

¿Pero qué es screen?

Pues según la descripción del propio programa viene a ser un emulador de terminales virtuales. A priori no os dice mucho, ¿verdad?

Puede que si os dijera que permite varias consolas en una sóla (estilo pestañas) veais un punto a favor. Y si os dijera que podremos desconectar sesiones, que sigan trabajando en segundo plano y conectarlas después a la misma consola, u otra en el mismo PC, u otra en otro PC de tu red local o a través de Internet…

¿Aún no lo veis claro? No os preocupéis y seguid leyendo, os lo explicaré poco a poco y dejaré el plato fuerte respecto a su uso para casi el final. Os aseguro que acabaréis viendolo de gran utilidad.

Ejecutar screen

Para abrir nuestro programita tan sólo tenemos que escribir su nombre en consola:

$ screen

Nos mostrará un texto con la licencia. Para continuar tan sólo tenemos que pulsar la tecla “Espacio” o “Enter“. Si por otro lado os resulta molesto, podemos hacer que no aparezca nunca más. Cread con vuestro editor de texto favorito un fichero en vuestra carpeta personal que se llame “.screenrc” y copiad esta línea dentro:

startup_message off

Guardadlo y cerrar el editor. Probad ahora si queréis a abrir otro terminal y volved a ejecutar screen. Ahora os mostrará directamente un “terminal nuevo”, sin la licencia previa.

Antes de continuar…

Para agilizar las explicaciones y que a la vez queden más claro: Vamos a usar varios atajos de teclado (shortcuts) un tanto extraños, propios de screen. Todos comenzarán por Ctrl+a y una tecla u otra combinación. Esto no quiere decir que se tenga que pulsar todo junto, sino que primero pulsaréis Ctrl+a y después la otra tecla o combinación.

Por ejemplo: “Ctrl+a” + “c“. Esto quiere decir que primero se pulsaría “Ctrl+a“, soltamos las teclas y pulsamos ‘c‘.

Para que la notación sea más clara usaré la que viene en el man de screen, es decir, C-a=Ctrl+a, por lo que el ejemplo anterior se reduciría a: “C-a c“, que para que no quede lugar a dudas repito que sería equivalente a pulsar primero “Ctrl+a” y después la tecla “c

Scroll de screen / Copiar y pegar

Estamos en una consola de screen. Haced un listado de /etc por ejemplo:

$ ls /etc

Obviamente no se pueden mostrar todos los ficheros en pantalla, hay demasiados. Vale, podremos hacer scroll. Sin embargo veis que no funciona. No os preocupéis, sí que hay scroll en screen pero es distinto, puede que incluso hasta mejor.

Tenemos que verlo como un cambio de modo. Por un lado activamos el modo de scroll (C-a [ o C-a C-Esc). Luego podremos desplazarnos con los cursores como si estuviéramos en un editor de texto normal. Si subimos, la pantalla hará scroll junto con el cursor. Cuando acabemos tan sólo tenemos que pulsar “Esc” o ‘[‘ y volveremos al modo normal.

Algunos os habréis percatado que cuando activáis este modo abajo pone algo así como “Copy mode“. Esto se debe a que este modo en el que entramos es en el fondo para copiar texto, aunque nos permite hacer el scroll. Estando en ese modo cuando pulsamos “Enter” comenzará a seleccionar texto, nos desplazamos y estemos al final de lo que queremos copiar, volvemos a pulsar “Enter“.

Finalmente podremos pegar la copia del texto que hemos hecho pulsando la combinación “C-a ]“.

Resumiendo:

  • C-a [ / C-a C-Esc= Entrar en modo copia/scroll
  • cursor = desplazamiento del cursor (si estamos en modo copia/scroll)
  • Enter = Comenzar selección texto / Finalizar selección texto, copiar y salir modo copia/scroll
  • ESC / [ = Salir del modo copia/scroll sin copiar nada
  • C-a ] = Pegar el texto copiado

.

Multiconsola en screen

Screen crea consolas virtuales. Como introduje antes, es como si tuviéramos en una sóla consola varias pestañas. Pensaréis que teniendo las pestañas reales… ¿para qué queremos esto? En ocasiones (unos usuarios más que otros) tienen que trabajar sólo con el intérprete de comandos, sin entorno gráfico y aunque tenemos varias consolas con Ctrl+Alt+Fx, puede ser más práctico usar las consolas virtuales de screen, y más aún cuando pensamos en el punto siguiente al actual.

Una vez que estemos en screen, podemos crear otra consola, con la pulsación de “C-a c“, o bien escribiendo “screen” detro de una consola del propio screen. Podemos hacer un listado de las consolas que tenemos abiertas con “C-a w“. Abrid cuatro consolas y haced un listado de ellas. Os saldrá algo parecido a esto:

0-$ bash 1$ bash 2*$ bash 3$ bash

Si os dais cuenta hay dos de ellas distintas al resto. Una tiene un ‘*’ y otra un ‘-’ entre el número y el ‘$’. La consola que tiene el ‘*’ es la consola actual, la que estamos viendo. La que tiene el ‘-’ es la que se activó antes que la actual.

Podremos cambiar entre ambas con la combinación “C-a a” o navegar con siguiente consola (C-a n) y la anterior (C-a p).

Para cambiar a una específica podemos hacerlo con “C-a num” donde num es el número de la consola en cuestión que se ha listado anteriormente.

Otra forma de hacerlo es con ” C-a ‘ “, que nos preguntará a cual queremos cambiar; introducimos el número y pulsamos “Enter“.

Y otra quizá mejor es mediante C-a “, se nos presentará un menú con las consolas abiertas, seleccionamos con las flechas abajo/arriba y confirmamos con “Enter“.

Pero no os aclaráis mucho con los nombres, ¿verdad? Bueno, también se le pueden poner nombres a las consolas para que a la hora de verlos con el listado (C-a w) o el menú (C-a “) nos aparezcan los nombres en lugar del intérprete bash. Nos colocamos en la consola a la que queremos bautizar y pulsamos “C-a A” (daros cuenta que en la segunda ‘a’ debe ser mayúscula, así que pulsad “Shift+a“), borramos el nombre “bash“, ponemos el que queramos y confirmamos con “Enter“. Si ahora listamos nos saldrá el nombre. Aquí tenéis un ejemplo:

Puede ser engorroso inicialmente, pero os prometo que si jugueteais un poco con esto, acabaréis entendiéndolo bien y puede resultar muy muy práctico

Resumimos:

  • C-a c / screen: crea una nueva consola virtual en screen
  • C-a w: lista las consolas abiertas
  • C-a C-a: cambia ente las dos últimas consolas seleccionadas
  • C-a n: cambia a la siguiente consola
  • C-a p: cambia a la consola previa
  • C-a num: cambia a la consola determinada por num
  • C-a ‘: cambia a la consola que le indiquemos posteriomente con el número que la identifica
  • C-a “: menú que nos permite cambiar a la consola que queramos
  • C-a A: nos permite ponerle un nombre a la consola actual

.

Desligar/ligar sesiones en screen

Si el punto anterior ya es de por sí productivo e interesante, este puede serlo incluso más.

Os comentaba al principio que particularmente aquellos que siguieran el manual de SSH y el “conocías” de rtorrent estarían especialmente interesados. De hecho, aunque ya tenía planeado publicar esta entrada hoy, justo ayer un lector dio con la clave. preguntaba que cómo podía hacer para ver las descargas de rtorrent remotamente, desde otro ordenador, ya que rtorrent no funciona en segundo plano, como un daemon. Pues bien, aunque rtorrent no lo permite, podemos hacerlo gracias a screen.

Una de las principales características, junto con la multiconsola, de screen es que permite desconectar sesiones de la terminal donde se abrió y volver a abrir la sesión en ese mismo terminal, en otro del mismo PC u otro de cualquier otro ordenador.

¿Qué quiere decir esto? Pues bien, si tenemos 4 consolas abiertas (en screen) en una sesión, lo que podemos hacer es desligarla de la terminal y seguirá funcionando, como si fuera un daemon (segundo plano). Y lo mejor de todo es que después podremos volver a conectar esa sesión en cualquier consola (independientemente de si es el ordenador local o uno remoto) y lo veremos en su estado actual, no como estaba cuando se desconectó.

He hecho un par de dibujos conceptuales para que lo entendáis mejor. Imaginad que tenemos dos ordenadores, uno en casa y otro en nuestra oficina. Abrimos un terminal en el de casa, ejecutamos screen y tenemos tres consolas distintas. En una de ellas ejecutamos rtorrent.

Nos vamos a la oficina, abrimos una consola, conectamos por SSH a nuestro ordenador de casa. Queremos ver cómo van las descargas, así que desligamos la sesión del terminal que tenemos en casa y la ligamos al que tenemos delante, en el ordenador de la oficina.

Gráficamente este sería el estado inicial (intentad obviar mis dotes artísticas xD):

Y este otro una vez hemos dirigido la sesión de casa al terminal del trabajo:

Obviamente tanto el rtorrent, como el links como el bash de mi carpeta personal son de mi ordenador de casa, pero estarían siendo mostrados y controlados desde mi ordenador del trabajo.

Podemos tener tantas sesiones como queramos y cada una de ellas podrá tener tantas consolas como deseemos. También podemos desligar/ligar tantas sesiones como queramos a las terminales que queramos, local o remotamente vía SSH, no tiene limitaciones, excepto que una sesión no se puede mostrar en más de un terminal, tal y como mostraban los dibujos, es decir, si un amigo vuestro tiene acceso a vuestro ordenador y tú estás viendo rtorrent, tu amigo no podrá verlo a la vez que tú, sino primero uno y luego otro.

Explicado todo esto y confiando en que ya tengáis clara la idea, ahora costará menos mostraros cómo hacerlo, primero en vuestro propio ordenador. Para desconectar una sesión (lo que es lo mismo, mandarla a un segundo plano a modo de daemon) lo único que tenemos que hacer es colocarnos en dicha sesión y pulsar “C-a d“. Veréis este mensaje:

[detached]

Ahora estamos en la terminal normal que abrimos al principio, gnome-terminal, konsole, xterm, la que sea. Para recuperar la sesión y volver a ver su contenido escribimos en la consola: “screen -r“. Ahora hemos abierto a screen con las consolas virtuales que habíamos mandado a segundo plano.

En caso de tener más de una sesión desligada, al intentar recuperar una con “screen -r” nos dirá lo siguiente:

There are several suitable screens on:
20535.pts-8.belgarath (Detached)
20169.pts-1.belgarath (Detached)

Nos está diciendo precisamente que tenemos varias sesiones y no sabe cual es la que queremos. Se lo indicamos con el número que la identifica, siendo el número más bajo, la sesión más antigua:

screen -r 20169

Ahora bien, si estamos en la oficina, la casa de un amigo, la universidad o donde sea y queremos ligar una sesión de nuestra casa tendríamos que:

  • Conectar por SSH
  • Desligar la sesión que queramos
  • Ligarla

En caso de que sólo tuvíeramos una sesión abierta en casa primero conectaríamos por SSH y después podríamos desligar la sesión de casa y ligarla en el ordenador remoto con un sólo comando:

$ screen -dr

La ‘d‘ desliga la sesión y la ‘r‘ la liga a la terminal que estamos usando. Si hubiera varias sesiones tendríamos que ver qué sesiones hay y hacer lo mismo que antes pero indicando el número de la sesión deseada:

$ screen -dr 20169

El argumento ‘d‘ es normal usarlo remotamente para desligarlo del ordenador donde puede estar previamente ligado. Si estamos en el ordenador local no se usa tanto a no ser que queramos llevar una sesión de un terminal a otro dentro del mismo sistema.

Resumimos:

  • C-a d: desliga la sesión actual
  • screen -r: liga la sesión (si es única) a la terminal actual (local o remota). Si hay varias sesiones, mostrará sus identificadores numéricos
  • screen -r número: liga la sesión identificada por “número“.
  • screen -dr: desliga la sesión (si es única) del terminal asociado y la liga al terminal actual (local o remota). Si hay varias sesiones, mostrará sus identificadores numéricos
  • screen -dr número: desliga la sesión especificada por “número” del terminal asociado y la liga al terminal actual

.

Cerrar consola virtual / screen

Por último, el método para salir de una consola virtual generada dentro de screen es el mismo que para salir de una consola estándar, tecleamos “exit“, o bien puedes usar el atajo “C-a k“. Si estás cerrando la última consola virtual, también te saldrás de screen.

Si queremos cerrar todas las consolas virtuales de una sesión y salir de screen, basta con usar el atajo “C-a \” (para los que no les salga: Ctrl+a y luego Alt Gr+º).

Resumimos:

  • C-a k / exit: cierra la consola actual de screen. Si es la última se sale del programa
  • C-a \: Cierra todas las consolas y se sale de screen

.

Más atajos e información

Aunque creo que ha quedado bastante completo el manualillo de screen, aún quedan bastantes más shortcuts y algunas funciones más. Quien tenga más interés por el tema, pueden hacer un man a screen:

$ man screen

O bien, dentro del propio screen, usar el atajo “C-a ?” y os saldrá un completo listado de todos los shortcuts del programa.

 

 

FUENTE: http://tuxpepino.wordpress.com/2007/05/24/%C2%BFconocias-screen/