¿Qué debo saber para utilizar GNU Screen correctamente? [cerrado]

106

Acabo de presentarle a un amigo GNU Screen y está teniendo dificultades para acostumbrarse. Eso me hace pensar en las cosas esenciales que necesita saber sobre la excelente utilidad Screen , las mismas cosas que pensarías que vale la pena enseñarle a alguien, un principiante, desde cero. ¿Cuáles son algunas analogías y consejos útiles para recordar vínculos, etc.?

Sería genial.

Henry B
fuente
1
También hay algunas buenas respuestas a esto aquí: stackoverflow.com/questions/70661/what-is-gnu-screen
Chris
Alguien ha publicado una pregunta similar a esta en Server Fault .
Vagnerr
Si alguien recién está comenzando y está teniendo dificultades con Screen, es posible que desee ver el tmux alternativo .
Christopher Bottoms

Respuestas:

93

Lo he estado usando Screendurante más de 10 años y probablemente use menos de la mitad de las funciones. Por lo tanto, definitivamente no es necesario aprender todas sus funciones de inmediato (y no recomendaría intentarlo). Mis comandos del día a día son:

^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback

Creo que eso es todo. A veces utilizo las funciones de pantalla dividida, pero ciertamente no a diario. El otro consejo es que si la pantalla parece haberse bloqueado porque presionó alguna combinación de teclas al azar por accidente, haga ambas cosas ^Qe ^A ^Qintente desbloquearla.

Greg Hewgill
fuente
1
^ Se debe agregar una k a la lista para cerrar una ventana.
Léo Léopold Hertz 준영
7
No uso ^ A k debido a la posibilidad de matar accidentalmente a más de lo que pretendía. En su lugar, simplemente salgo del shell en una ventana usando ^ D (o exit). La ventana de la pantalla se cierra automáticamente después de salir del último shell en una ventana.
Greg Hewgill
9
"^ Un modo de copia esc, que utilizo para retroceder" Usted es un dios entre los hombres, señor.
Rob Howard
4
^ A [hace exactamente lo mismo.
atx
Gracias por el truco ^ A ^ D ... Estaba atascado y no podía volver a mi sesión. En caso de que esto ayude a alguien, escribí un artículo hace un tiempo que explica lo básico de las pantallas como aquí, pero tiene algunos trucos más geekpad.ca/blog/post/…
Patrick Forget
36

No pude acostumbrarme a la pantalla hasta que encontré una manera de establecer una 'barra de estado' en la parte inferior de la pantalla que muestra en qué 'pestaña' o 'pantalla virtual' estás y en qué otras hay. He aquí mi arreglo:

[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"

backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[   %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"

sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" " '{print $2}'`
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" " '{print $2}'`
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$
Roel
fuente
3
Echa un vistazo a byobu (perfiles de pantalla), también: launchpad.net/byobu
Drew Stephens
Esto es asombroso, gracias. Estaba luchando por averiguar qué estaba sucediendo realmente cuando intentaba dividir mi terminal. No me di cuenta de que necesitaba ejecutar la pantalla primero para que cualquiera de estos comandos funcionara, tonto, lo sé.
Ogaday
30

Ctrl+ A? - ¡muestra la pantalla de ayuda!

James Muscat
fuente
Estoy completamente de acuerdo con esto. Esto es mucho más útil que otras respuestas, ya que puede deducir los otros comandos por él, pero no puede hacerlo al revés. Además, es mucho más fácil recordar la cosa.
Léo Léopold Hertz 준영
26

Si tu amigo tiene la costumbre de presionar ^Apara llegar al principio de la línea en Bash, se encontrará con algunas sorpresas, ya que ^Aes la combinación de teclas de comando de pantalla. Por lo general, termino con una pantalla congelada, posiblemente debido a una tecla aleatoria que presioné después ^A:-)

En esos casos intento

^A sy ^A qbloquear / desbloquear el desplazamiento del terminal

para arreglar eso. Para ir al comienzo de una línea dentro de la pantalla, la secuencia de teclas es ^A a.

agnul
fuente
1
Es fácil cambiar el carácter de escape de ^ A a otro. He puesto los detalles en mi respuesta.
Andrew Johnson
3
+ 1 + 1 + 1 ^ A s ... gracias ... pantalla bloqueada :)
Yuji 'Tomita' Tomita
1
@agnul +1 para ti para ^ A a Soy usuario de ^ A en una sesión normal de bash y no puedo usarlo dentro de una sesión de pantalla. Gracias por el gran consejo! :)
icasimpan
Gracias 100 veces por decirme cómo hacer que ctrl A funcione dentro de la pantalla. He estado buscando esto toda mi vida.
user674669
¿La 'A' y la 'a' distinguen entre mayúsculas y minúsculas aquí?
Aditya MP
12

Puede reasignar la tecla de escape de Ctrl+ Apara que sea otra tecla de su elección, por lo que si la usa para otra cosa, por ejemplo, para ir al principio de la línea en bash, solo necesita agregar una línea a su ~ /. archivo screenrc. Para hacerlo ^ b o ^ B, use:

escape ^bB

Desde la línea de comando, use sesiones de nombres para mantener múltiples sesiones bajo control. Utilizo una sesión por tarea, cada una con varias pestañas:

  screen -ls # Muestra sus sesiones de pantalla actuales
  screen -S <nombre> # Crea una nueva sesión de pantalla llamada nombre
  screen -r <nombre> # Se conecta a las sesiones de pantalla nombradas

Cuando usa la pantalla, solo necesita algunos comandos:

  ^ A c Crear un nuevo shell
  ^ A [0-9] Switch shell
  ^ A k Mata al caparazón actual
  ^ A d Desconectar de la pantalla
  ^ A? Mostrar la ayuda

Puede encontrar una excelente referencia rápida aquí . Vale la pena marcarlo como favorito.

Andrew Johnson
fuente
Utilizo sesiones de pantalla anidadas. Comienzo el externo con screen -e^oopara poder usar Ctrl + O para eso y luego comienzo los internos con screen -mpara que comiencen nuevas sesiones.
staticsan
1
Puede cambiar la tecla de escape sobre la marcha. En una sesión de pantalla en ejecución, escriba ^A :seguido \Bbde Intro para establecer la tecla de escape en ^ B. En general, le ^A :permite evaluar el comando que .screenrccomprende.
malana
8

Algunos consejos para aquellos que están familiarizados con la pantalla, pero que tienden a no recordar lo que leen en la página de manual:

  • Cambiar el nombre de una ventana de pantalla es muy fácil: ctrl+ A shift+ A.
  • ¿Te perdiste el último mensaje de la pantalla? ctrl+ a ctrl+ se lo mvolverá a mostrar.
  • Si desea ejecutar algo (como seguir un archivo) y la pantalla le indica cuándo hay un cambio, use ctrl+ A shift+ men la ventana de destino. Advertencia: le permitirá saber si algo cambia.
  • ¿Quiere seleccionar la ventana 15 directamente? Pruebe estos en su .screenrcarchivo:
bind  ! select 11
bind  @ select 12
bind \# select 13
bind  $ select 14
bind  % select 15
bind \^ select 16
bind  & select 17
bind  * select 18
bind  ( select 19
bind  ) select 10

Eso asigna ctrl+ a shift+ 0 through 9para Windows 10 a 19.

estático
fuente
7

Ctrl+ Aes el comando base

Ctrl+ A N= ir a la pantalla *** N *** ext

Ctrl+ A P= ir a la pantalla anterior *** P ***

Ctrl+ A C= *** C *** reate nueva pantalla

Ctrl+ A D= *** D *** echa tu pantalla

Niko Gunadi
fuente
6

http://www.debian-administration.org/articles/34

Escribí eso hace un par de años, pero sigue siendo una buena introducción que recibe muchos comentarios positivos.


fuente
El vínculo está (efectivamente) roto:$VAR1 = \'Can\'t connect to local MySQL server through socket \'/var/run/mysqld/mysqld.sock\' (111 "Connection refused") at ../lib/Singleton/DBI.pm line 95. ';
Peter Mortensen
6

"Debo" agregar esto: agregar

bind s

a su .screenrc, si usted, como yo, solía usar ventanas divididas, ya que C-a Sdivide la ventana real, pero la C-a scongela. Así que desactivé el atajo de congelación.

Zsolt Botykai
fuente
2
^-Qse descongela si golpeas^-S
Platón
Tienes razón @Platón. Todavía estoy trabajando en un entorno con usuarios, que no memorizarán casi ninguno de los atajos ... Necesitaba desactivarlo.
Zsolt Botykai
NP Acabo de encontrar este hilo primero y busqué 'congelar' y no encontré lo que estaba buscando
Platón
6

Ctrl+ aes una clave especial.

Ctrl+ a d- [d] etach, dejar programas (irssi?) en segundo plano, ir a casa.

Ctrl+ a c[c] crear una nueva ventana Ctrl+ a 0-9cambiar entre ventanas por número

screen -r - volver a la sesión separada

Eso cubre el 90% de los casos de uso. No intente mostrar todas las funciones a la vez.

tadeusz
fuente
Aunque, cuando me enteré por primera vez screen, estaba confundido acerca de lo que realmente significaba desconectar y volver a conectar una pantalla. Cita : "... puede tener tareas en ejecución durante mucho tiempo en consolas separadas (como ssh en una máquina rememote, sesiones IRC, ...) en una máquina determinada, desconectarse de la sesión, moverse de una ubicación física a otra, conectarse a la máquina a través de ssh y vuelva a conectarla a la sesión de pantalla para seguir funcionando ".
JW.
4

No es realmente esencial, no solo relacionado con la pantalla, sino que habilitar 256 colores en mi terminal, GNU Screen y Vim mejoraron mi experiencia de pantalla a lo grande (especialmente porque codifico en Vim aproximadamente 8 horas al día; hay algunos esquemas de colores geniales para la vista).

jkramer
fuente
¡Gracias! Eso me ha estado molestando por un tiempo.
Dan Goldstein
3

La primera modificación que hago a .screenrc es cambiar el comando de escape. Al igual que muchos de ustedes, no me gusta la secuencia Ctrl-A predeterminada debido a su interferencia con esa funcionalidad fundamental en casi todos los demás contextos. En mi archivo .screenrc, agrego:

escapar `e

Eso es retroceso-e.

Esto me permite usar la comilla inversa como tecla de escape (por ejemplo, para crear una nueva pantalla, presiono la tilde inversa-c, separar es tilde retroceso-d, tilde retroceso-? Es ayuda, tilde retroceso-retroceso es la pantalla anterior, etc.). La única forma en que interfiere (y tuve que romper con el hábito) es usando comillas invertidas en la línea de comando para capturar el resultado de la ejecución, o pegando cualquier cosa que contenga una tilde. Para el primero, modifiqué mi hábito usando la convención BASH $ (comando). Para lo último, generalmente solo abro otro xterm o me separo de la pantalla y luego pego el contenido que contiene la tilde. Finalmente, si deseo insertar una comilla invertida literal, simplemente presiono la comilla inversa-e.

Gary Chambers
fuente
brillante. Utilizo comillas invertidas todo el tiempo, aunque sé que debería usar $ (...), así que ahora creo que tendré que cambiar mis métodos. La comilla invertida está un poco apartada, pero es bueno tener una sola tecla sin necesidad de modificadores. Pero, ¿por qué "e" y cómo lo recuerdas?
iconoclasta
Acabo de probar 'escape' '' y funciona bien y parece más fácil de recordar. Si presiona la tilde hacia atrás y no obtiene lo que espera, simplemente hágalo nuevamente.
iconoclast
He hecho esto, pero ¿hay alguna manera de escribir una tilde mientras estoy en la pantalla? A veces, es necesario hacer esto, y odio tener que separarme para hacerlo ...
Guillochon
@Guillouchon: el comentario anterior explica exactamente eso.
tripleee
3

Se está realizando un trabajo interesante para obtener una buena configuración de pantalla GNU de forma predeterminada en la próxima versión de Ubuntu Server, que incluye usar la parte inferior de la pantalla para mostrar todas las ventanas, así como otros detalles útiles de la máquina (como el número de actualizaciones disponible y si la máquina necesita un reinicio). Probablemente pueda tomarlos .screenrcy personalizarlos según sus necesidades.

Los comandos más útiles que tengo en mi .screenrcson los siguientes:

shelltitle "$ |bash" # Make screen assign window titles automatically
hardstatus alwayslastline "%w" # Show all window titles at bottom line of term

De esta manera, siempre sé qué ventanas están abiertas y qué se está ejecutando en ellas en ese momento.

David Dean
fuente
3

Yo uso lo siguiente para ssh:

#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command

wd=`pwd`
cmd=$1
shift

# We can tell if we are running inside screen by looking
# for the STY environment variable.  If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.

if [ -z "$STY" ]; then
        $cmd $*
else
        # Screen needs to change directory so that
        # relative file names are resolved correctly.
        screen -X chdir $wd

        # Ask screen to run the command
        if [ $cmd == "ssh" ]; then
                screen -X screen -t ""${1##*@}"" $cmd $*
        else
                screen -X screen -t "$cmd $*" $cmd $*
        fi
fi

Luego configuré los siguientes alias de bash:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

Abre una nueva pantalla para los alias anteriores y, si usa ssh, cambia el nombre del título de la pantalla con el nombre de host ssh.

Peter Mortensen
fuente
2

Me gusta configurar una sesión de pantalla con nombres descriptivos para las ventanas. ^ a A le permitirá darle un nombre a la ventana actual y ^ a "le dará una lista de sus ventanas. Cuando termine, separe la pantalla con ^ ad y vuelva a adjuntarla con screen -R

innaM
fuente
1

Me gusta usar screen -d -RRpara crear / adjuntar automáticamente a una pantalla determinada. Creé funciones de bash para hacerlo más fácil ...

function mkscreen
{
    local add=n

    if [ "$1" == '-a' ]; then
        add=y
        shift;
    fi

    local name=$1;
    shift;
    local command="$*";

    if [ -z "$name" -o -z "$command" ]; then
        echo 'Usage: mkscreen [ -a ] name command

    -a          Add to .bashrc.' 1>&2;
        return 1;
    fi

    if [ $add == y ]; then
        echo "mkscreen $name $command" >> $HOME/.bashrc;
    fi

    alias $name="/usr/bin/screen -d -RR -S $name $command";

    return 0;
}

function rmscreen
{
    local delete=n

    if [ "$1" == '-d' ]; then
        delete=y
        shift;
    fi

    local name=$1;

    if [ -z "$name" ]; then
        echo 'Usage: rmscreen [ -d ] name

    -d          Delete from .bashrc.' 1>&2;
        return 1;
    fi

    if [ $delete == y ]; then
        sed -i -r "/^mkscreen $name .*/d" $HOME/.bashrc;
    fi

    unalias $name;

    return 0;
}

Crean un alias para /usr/bin/screen -d -RR -S $name $command. Por ejemplo, me gusta usar irssi en una sesión de pantalla, así que en mi .bashrc (debajo de esas funciones), tengo:

mkscreen irc /usr/bin/irssi

Entonces puedo escribir irc una terminal para entrar en irssi. Si la pantalla 'irc' aún no existe, se crea y se ejecuta / usr / bin / irssi desde ella (que se conecta automáticamente, por supuesto). Si ya se está ejecutando, simplemente lo vuelvo a adjuntar, separando a la fuerza cualquier otra instancia que ya esté adjunta. Es bastante agradable.

Otro ejemplo es la creación de alias de pantalla temporales para perldocs a medida que los encuentro:

mkscreen perlipc perldoc perlipc
perlipc # Start reading the perldoc, ^A d to detach.
...
# Later, when I'm done reading it, or at least finished
# with the alias, I remove it.
rmscreen perlipc 

La opción -a (debe ser el primer argumento) agrega el alias de la pantalla a .bashrc (por lo que es persistente) y -d lo elimina (estos pueden ser potencialmente destructivos, así que utilícelo bajo su propio riesgo). xD

Adjuntar:

Otro bash-ism que encuentro conveniente cuando trabajo mucho con la pantalla:

alias sls='/usr/bin/screen -ls'

De esa manera, puede enumerar sus pantallas con muchas menos pulsaciones de teclas. No sé si slschoca con alguna utilidad existente, pero no lo hizo en ese momento en mi sistema, así que lo hice.

bambam
fuente
0

^ AA vuelve a la pantalla de la que acaba de llegar.

tonto
fuente
2
^ A ^ A vuelve a cambiar, ^ AA permite cambiar el nombre del título de la ventana.
Andrey Starodubtsev
0

Ctrl+ Aes un gran personaje especial para la gente de Unix, pero si estás usando la pantalla para hablar con OpenVMS , entonces no poder ^ A te dejará calvo prematuramente.

En VMS , si está editando un comando DCL antes de la ejecución desde el búfer del historial, el modo Insertar está desactivado (tiene que ser por algunas razones en las que no entraré aquí) ... para activarlo para que no No sobreescriba su comando en lugar de espaciar las cosas, debe presionar `^ A.

usuario2146463
fuente
Lo uso screen -e ^Llpor razones similares; Simplemente no puedo desaprender a escribir ctrl-A para ir al principio de la línea en Emacs. Afortunadamente, ctrl-L es una pulsación de tecla que rara vez necesito, y también en mi humilde opinión se conecta muy bien con su significado general (redibujar / borrar la pantalla).
tripleee
@tripleee: My .screenrchas escape ^@^@, que usa el carácter nulo en lugar de control-A. En la mayoría de los sistemas, puede ingresar el carácter nulo como espacio de control, que es muy fácil de escribir. (Tengo una sesión de pantalla anidada que se ejecuta dentro de una ventana en mi sesión principal; para esa tengo escape ^]^]).
Keith Thompson