Linux Fu: Trucos estúpidos de SSH

Si se conecta a computadoras remotas a través de Internet, es muy probable que use algún tipo de SSH o shell seguro. En Linux o Unix usará el ssh orden. Lo mismo ocurre con los entornos similares a Linux en Windows como Cygwin o WSL. Para Windows nativo, es posible que esté utilizando Putty. En su forma más simple, ssh es solo un programa final que se comunica con un servidor a través de una conexión encriptada. Creemos que es muy difícil escuchar a alguien que se comunica en una computadora remota. ssh.

Hay varios trucos para usar ssh - algunas son bastante simples y otras son cosas que quizás no considere que pertenecen al dominio de un programa final. Probablemente lo sepas ssh puede copiar archivos de forma segura, y existen formas fáciles y difíciles de configurar un inicio de sesión sin contraseña.

Sin embargo, también puede montar un sistema de archivos remoto con ssh (de hecho, hay varias formas de hacer esto). Puedes usar ssh para navegar de forma segura por el sitio en su navegador favorito, o incluso utilizarlo para canalizar tráfico específico a través de un puerto o incluso utilizarlo como una VPN improvisada. De hecho, hay tanto de qué lidiar que esto no será lo último de lo que hablar sobre Linux Fu. ssh. Pero basta de arreglos, vayamos a los trucos.

Pocas buenas opciones

Asumiremos que conoce los conceptos básicos: scp y sftp para copias de archivos y ssh-copy-id para establecer un inicio de sesión sin contraseña. (Si no es así, tiene diez minutos para hacer una búsqueda en línea). Pero una de las cosas ssh maneja muy bien la red. Sin embargo, recuerde que el servidor debe tener algunas opciones dispuestas para hacer algunas de las cosas más interesantes, por lo que si no domina el ssh servidor, es posible que algunos de estos trucos no funcionen para usted.

Hay muchas opciones para recordar en el ssh línea de comandos, pero afortunadamente no es necesario. Ni siquiera tiene que recordar su nombre de usuario o nombre de usuario. En el ~/.ssh/config file puede crear un alias. Por ejemplo, suponga que desea conectarse a su servidor doméstico:

Host homeserver
  HostName mih0me.dyndns.org
  Port 1234
  User TheAl
  IdentityFile ~/.ssh/home_id
  ForwardX11 yes
  Compression yes
  TCPKeepAlive yes

Puede tener tantos alias como desee. Simplemente repita la línea de Hosting y luego sígala con opciones. También puede agregar más de un alias a una sola declaración de alojamiento. Las últimas opciones se aplicarán a algunos de los alias. Ahora conecta solo problemas ssh homeserver y tienes todas las opciones correctas.

Por supuesto, si usa Putty, sus opciones estarán principalmente en el perfil de hosting y en el ssh panel de la pantalla de opciones. Es posible que no tenga tantas opciones, pero puede probar algunas.

Sea persistente

Un buen conjunto de opciones para incluir es un conjunto del archivo de control maestro. Por ejemplo:

ControlMaster auto
ControlPath ~/.ssh/master-%[email protected]%h:%p

Esto permite que varias sesiones en el mismo host compartan un socket TCP. Debido a que se necesita algo de tiempo para configurar un socket seguro, esto puede acelerar las cosas si continúa varias sesiones entre dos hosts. Puede configurarlo para todos los hosts a través del Host * línea en el archivo de configuración. Puede usar esto para cualquier opción global.

Por otro lado, si coloca muchos datos en varias comunicaciones, actívelo ControlMaster puede que no sea una gran idea. Puedes añadir -S none dominar el escenario global.

Otra cosa a tener en cuenta es que su primera ssh una sesión puede parecer pendiente si intenta abandonarla antes de que se cierren todos los demás enlaces. Algunas personas administran deliberadamente un escondite ssh una sesión de inicio de sesión en un host al que a menudo se conectan para evitar ese problema. Sin embargo, una mejor forma es configurar ControlPersist a sí. Esto hará que la sesión original se ejecute indefinidamente en segundo plano. Si desea un período de gracia, puede establecer ControlPersist a un número como 180. Esto haría que la sesión en segundo plano finalizara si no hay conexiones durante tres minutos.

Otra desventaja de este enfoque es que tiende a obtener archivos maestros huérfanos. En rc.local Tengo la siguiente linea:

/bin/rm /home/*/.ssh/master-* || true >/dev/null

Con Putty, puede hacer clic en el botón "Compartir conexiones SSH si es posible" en el panel de opciones de SSH.

Configuración

Hay bastantes opciones de configuración que puede utilizar en el archivo de configuración. Por ejemplo, BatchMode Déjame decirte ssh la conexión está hecha para uso autónomo, así que no se moleste en pedirle al usuario contraseñas o cualquier otra cosa. Eso no significa que, por supuesto, te dejará entrar. Solo significa que fallará si no tiene la configuración para iniciar sesión sin una contraseña.

Hay algunos otros elementos interesantes. Por ejemplo, puede operar un comando local o remoto en una conexión. También puede enviar una variable de entorno al host remoto o incluso configurar una. Por ejemplo, suponga que desea mantener siempre los mismos LS_COLORS en su escritorio y en el servidor, pero a menudo los cambia y no desea usar los mismos perfiles. Puede agregar esto al directorio de configuración del host:

SendEnv LS_COLORS

El servidor debe estar configurado para aceptar esto, por supuesto. Putty puede manejar una variable de entorno de configuración desde la pestaña Datos en su diseño.

En la red, puede especificar TCPKeepAlive sí, si desea que el servidor y el cliente prueben su conexión durante el tiempo de inactividad. Esta es una espada de doble filo. Si la conexión está apagada, no se desconectará. Pero si la red se cae en el momento adecuado durante un corto período de tiempo, puede desconectarse donde no lo haría si se quedara con la predeterminada. Incluso hay una forma de abrir un túnel de capa 3 o capa 2 entre las máquinas, un tema para el futuro Linux Fu.

Según tu orden

No olvides eso ssh puede cumplir con un pedido y enviarle su salida. Como ejemplo práctico, ocasionalmente rehago mi firmware desde una impresora 3D. La impresora está conectada a una Raspberry Pi, pero hago el firmware en mi máquina principal. Durante mucho tiempo copié mi archivo al Pi (usando scp) y luego inicié sesión en el Pi para iniciar un script que escribí flash. El script deshabilita el programa del servidor Reptier, enciende el chip Atmel en la placa de la impresora y luego reinicia el servidor.

Aquí está el script que funciona en mi computadora principal. Nota la ssh comandos. El servidor está apagado. Uno scp comando copia el nuevo firmware. Luego otro ssh hace el flash y renueva el servidor. Hay muchas otras formas de hacer esto, por supuesto. Pero no olvides eso ssh puede lanzar un comando remoto y luego regresar.

#!/bin/bash
if [ -z "$1" ]
then
  echo Usage: flash hexfile [remote_name]
  echo If omitted, remote_name will have date attached
  exit 1
fi
ONAME="$2"
EXTRA=$(date "+%Y%m%d.%H%M")
if [ -z "$2" ]
then
  ONAME="$1-$EXTRA.hex"
fi
IP=192.168.1.110
  echo Stop Server
  ssh -l pi $IP "sudo systemctl stop RepetierServer"
  echo Copy...
  scp "$1" "[email protected]$IP:a8fw/$ONAME"
  echo Flashing...
ssh [email protected]$IP "cd a8fw; ./flash $ONAME"
echo Restart
ssh "[email protected]$IP" "sudo systemctl start RepetierServer"
echo Done
exit 0

Si desea un ejemplo más pirateado, considere usar la misma idea para ejecutar Wireshark localmente y analizar la captura remota de paquetes:

ssh [email protected] 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -

Puedes hacer el mismo truco con tshark, si tu prefieres.

Examen rápido

Que saber que tan rápido el tuyo ssh conexión es? Asegúrate de tener pv instalado y pruebe esto:

yes | pv | ssh remote_host "cat >/dev/null"

¡Muy genial!

Si tiene buenas velocidades, o incluso si no las tiene, puede intentar montar un sistema de archivos remoto con sshfs. Este es un sistema de archivos FUSE, es decir, un sistema de archivos que vive como un programa de usuario normal, no como parte del kernel. Sin nada en el otro lado que no sea el ssh servidor y herramientas estándar, puede hacer que cualquier host que pueda conectar se vea como un sistema de archivos local.

Pero espera ...

Puedes hacer mucho más sshy me ocuparé de ello antes. Pero por ahora, es de esperar que haya encontrado al menos uno ssh un truco que puedes usar que fue, si no nuevo, al menos un recordatorio para ti.

  • William F. Dudley Jr. dice:

    Utilizo ssh para tunelizar sesiones vnc a través de Internet. Hace que vnc sea "seguro" y me permite iniciar una sesión de escritorio de forma remota.

    • denis dice:

      esto y SSH -X fueron las dos mejores características de SSH que encontré para hacer un administrador de oficina (ti y negocio) en casa.

      • ScriptGiddy dice:

        +1. ambos salvaron vidas, impresionaron a colegas y me permitieron atravesar muchos firewalls ... eh ... quiero decir, hacer mi trabajo 🙂

      • Tom Brusehaver dice:

        ssh -Y suele ser más confiable dependiendo de su situación.

    • Daniel dice:

      Yo también hago eso mucho. Pero por alguna razón, vncviewer no funciona cuando le permito usar una conexión principal existente.

      Otro "truco" que hago es usar los proxies sock integrados en ssh para conectarme a servidores web en la intranet de mis empresas locales. Hay un complemento de Firefox que le permite activar la configuración del proxy con un solo clic.

      • Daniel dice:

        Ah, y además, las conexiones maestras son muy útiles si bitbake falla porque su servidor ssh-git está empezando a apresurarse para limitar los intentos de enlace.
        No hay forma de crear una conexión primaria a un servidor sin crear una sesión de shell.

        • Marek dice:

          -f Pide a ssh que vaya a segundo plano inmediatamente antes del comando. Esto es útil si ssh solicita contraseñas o contraseñas, pero el usuario las quiere en segundo plano. Esto implica -n. La forma recomendada de empezar
          Los programas X11 en un sitio remoto tienen algo como ssh -f host xterm.
          -N No ejecute un comando remoto. Esto es útil solo para reenviar puertos.

  • anszom dice:

    También vale la pena mencionar: encadenamiento ssh. Si necesita ssh en un host de puerta para insertar otra máquina, puede tener la tentación de ejecutar:

    ssh externo ssh interno

    Esto tiene la desventaja de ejecutar el segundo cliente ssh en la máquina remota, donde sus claves privadas, hosts conocidos y otras cosas interesantes pueden no estar disponibles (también el flujo se descifra en la máquina intermedia, lo que puede ser un caso problemático confiable). En su lugar, puede tunelizar la conexión, de la siguiente manera (en .ssh / config):

    Host interno
    ProxyCommand ssh externo nc interno 22

    (equivalente de una línea: ssh internal -o ProxyCommand = 'ssh external nc internal 22 ′)

    Ejecutar "ssh internal" en su máquina cliente ejecutará "ssh external nc internal 22" internamente, en lugar de abrir una conexión TCP. Esto requiere un cliente en línea en la máquina remota. PuTTY tiene una forma de hacer esto usando el reenvío de puertos integrado en ssh.

    La cadena puede extenderse tanto como lo permita el sentido común.

    • shaun dice:

      ssh -J externo interno

      OpenSSH 7.3 se lanzó el 01-08-2016.

      Nuevas características

      * ssh (1): agregue una opción ProxyJump y una marca de línea de comando -J correspondiente para permitir una redirección simplificada a través de uno o más bastiones SSH o "hosts de salto".

      Gracias.

    • djmdjmdjm dice:

      Es más fácil usar la opción ProxyJump para encadenar hosts, hay menos configuración y no necesita depender de nc presente en el sistema intermedio.

      • djmdjmdjm dice:

        (también disponible como "ssh -J jumphost destination")

        • Bert dice:

          Sí, ProxyJump es genial. Incluso puedes hacer

          ssh -J siguiente, siguiente capa, destino del evento

          donde "cerca", "siguiente capa", "participante" y "destino" son los cuatro hosts SSH.

      • Doug dice:

        Si no tiene ProxyJump disponible en su versión de ssh, también puede usar 'ssh -W% h:% p external' como comando de proxy.

        • djmdjmdjm dice:

          Eso es exactamente lo que hace ProxyJump detrás de escena.

  • Robar dice:

    Ese truco del "sí" es una excelente manera de medir la velocidad de la red. Por lo general, medirá la capacidad de uno de los dos hosts para cifrar / descifrar datos.

    • RW versión 0.0.1 dice:

      Buen punto. Seguí las instrucciones para instalar el firmware modificado en un hardware Linux mínimo, lo rastreó en lugar de ejecutarlo, y simplemente se conecta al mundo exterior, es el agujero USB que tengo físicamente bajo control, y pienso "¿Por qué diablos lo hacemos hacer esto con ssh ???? ”porque me tomó como media hora escribir medio megabyte, y sabía que la cripta lo estaba ralentizando.

    • Daniel Grießhaber dice:

      En este caso, ¿tiene que ser una referencia a todo lo que sea un cuello de botella en la transmisión de datos a través de ssh, no un ancho de banda de red (que puede ser exactamente lo que desea)? Solo asegúrese de que la compresión esté deshabilitada (sin bandera -C) o use cat / dev / urandom en su lugar

      • normanr dice:

        También sería mejor usar / dev / zero (en lugar de / dev / urandom) porque eso usa incluso menos CPU. El uso de `dd` (en lugar de` cat`) es otra prueba que invita a la reflexión, ya que le permite cambiar el tamaño del búfer. Si son demasiado pequeños, también limitarán la velocidad medida.

  • Ostraco dice:

    Uno de los libros del paquete HB es SSH: la guía definitiva.

    https://www.humblebundle.com/books/oreilly-classics-oreilly-books

  • RoGeorge dice:

    : o)

    • Jonathan Bennett dice:

      El sitio se mudó a otro host no hace mucho tiempo, y algunos de los complementos antiguos y trucos elegantes no se movieron. Probablemente eso es lo que está pasando aquí.

      • Elliot Williams dice:

        ¡Peor! El mismo host nos “actualizó” y perdimos funciones.

  • salec dice:

    En la línea 12 del guión flash quisiste decir:
    NOMBRE = "$ 1- $ EXTRA.heks"

    • Al Williams dice:

      Si. No estoy seguro de lo que pasó allí.

  • Cuerpo digital dice:

    Aún necesita el soporte de FUSE compilado en el kernel para que sshfs funcione. La mayoría de las distribuciones binarias ya lo tendrán verificado, pero si está acostumbrado a ejecutar su propio kernel, bueno, debe verificarlo dos veces.

    • Ostraco dice:

      Las Mac pueden tener un problema.

      https://www.theregister.co.uk/2019/12/16/fuse_macos_closed_source/

  • Protagonista de Hiro dice:

    Aquí hay algo que encontré útil. Si desea que alguien acceda a un servicio a través de un túnel ssh, puede hacerlo con un usuario que no pueda iniciar sesión.

    Supongamos que tiene un servicio en el puerto 6666 de su dispositivo fubar, al que solo se puede acceder localmente [i.e. there’s no internet-facing open port other than ssh]

    Puede acceder a esto haciendo ssh -L 6666: 127.0.0.1: 6666 me @ fubar
    Luego, localhost: 6666 le dará el puerto 6666 en fubar.

    Si desea dar acceso a alguien al servicio en el puerto 6666 sin darles acceso de inicio de sesión, cree una cuenta fuera de línea como esta:

    sudo useradd -mb / home -s / usr / sbin / nologin myservice

    Ves algo como esto en / etc / passwd:

    miservicio: x: 1002: 1002 :: / home / miservicio: / usr / sbin / nologin

    Agregue la clave pública del usuario al que desea acceder a mi servicio a /home/myservice/.ssh/authorized_keys

    Ahora podrán acceder a ssh -L 6666: 127.0.0.1: 6666 myservice @ fubar sin tener acceso al shell.

    Si desea dar acceso a otra persona, simplemente agregue su clave pública a /home/myservice/.ssh/authorized_keys.

    • Jon dice:

      ¿Qué sucede si ejecutan "ssh -L 6666: 127.0.0.1: 6666 myservice @ fubar / bin / bash"?

      • normanr dice:

        Establecer el shell del usuario en `/ usr / sbin / nologin` en realidad evitará que inicien sesión por completo (con una contraseña o clave). Una mejor manera sería agregar "restringir, reenvío de puertos" (o si desea limitar dónde se permite el reenvío "restringir, permitir-abrir =" 127.0.0.1:6666 ") al comienzo de la línea en claves_autorizadas (y eliminar la contraseña de usuario con `passwd -d myservice`).

  • Stuart Longland dice:

    Otra forma de salvar vidas es simplemente configurar una "pantalla" para pintar una barra de estado en la parte inferior de su sesión SSH.

    En .screenrc (o /etc/screenrc) Tengo lo siguiente:

    caption always "%{yb} %D %Y-%02m-%02d %0c %H %{k}|%{g} %l %{k}|%{w} %-w%{+u}%n %t%{-u}%+w"
    defutf8 on
    bind ^a stuff ^a

    La primera línea es la clave para mantener vivos los objetos, pone un banner debajo con la fecha / hora actual, el nombre del host y qué tipo de ventanas de pantalla están abiertas (y cuál está activa).

    La segunda línea activa el modo UTF-8 (esencial con los programas de consola modernos, IS08859 es para dinosaurios).

    La tercera línea es útil si tiene sesiones de pantalla anidadas, o usa programas como minicom que necesitan que signifique algo, puede escribirlo presionándolo dos veces.

  • Juan Klos dice:

    Es una verdadera lástima que todas estas publicaciones de La-Tecnologia sean solo para el kernel de Linux y no se apliquen a ningún otro sistema operativo en absoluto.

    • Cierto dice:

      No se aplica a ningún otro sistema operativo, no:
      Solaris,
      HP-X,
      AIKSO,
      OpenVMS,
      FreeBSD,
      NetBSD,
      OpenBSD,
      HaikuOS,
      Gnu Hurd,
      SCO UNIX, un poco muerto ahora, reemplazado por OpenServer (que estaba basado en FreeBSD),

      Sí, solo Linux y ningún otro sistema operativo, lástima.

      • Cierto dice:

        Y no Plan 9.

      • Daniel Grießhaber dice:

        Psst, no alimentes al troll. El artículo titulado "Linux foo ..." incluso menciona alternativas de Windows

        También en su lista de sistemas operativos UNIXoid, olvidó el sistema de escritorio Unix más utilizado ... macOS

        • Cierto dice:

          ¿Antiguo ?, la mayoría tiene una nueva edición cada pocos años. Y hay mucho dinero para saber cómo criar a Lázaro. Es un poco como los desarrolladores de COBOL de DBA de la vieja escuela o barbas grises, un mercado más pequeño, mucho más dinero.

      • Cierto dice:

        Y nada de lo anterior funcionaría en DragonFly BSD, solo para el sistema operativo Linux.

        De todos modos, nadie usa DragonFly BSD con su sistema de archivos que admite instantáneas, control de suma y duplicación de datos; nadie lo necesitaría.

      • RW versión 0.0.1 dice:

        ssh al menos funciona en W10 ahora

      • Stuart Longland dice:

        Sí, no ... no crea que SCO OpenServer se basó en FreeBSD.

        Usé ambos, y no recuerdo haber tenido que volver a vincular el kernel de FreeBSD para cambiar las direcciones IP, mientras que SCO OpenServer 5 requería exactamente eso (seguido de un reinicio).

        SCO era un sistema operativo primitivo. Nada como FreeBSD.

        • Cierto dice:

          También usé SCO, ¡pero el abridor más nuevo y más grande 10 (Xinuos) se basa en freebsd!

      • Thrasher dice:

        Un alce debería habértelo dicho. ¡Oh, espera, lo hizo! ¡"Linux-fu"!

  • tt dice:

    La última versión de w10 y server19 ahora tiene sshd compilable y se puede instalar con una función adicional o ps. Una bruja de estos trucos funciona, no lo sé.

  • Feinfinger dice:

    https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#SSH_Over_Tor

    • fimdomeio.com dice:

      Esto es inesperadamente útil. Puede fácilmente cualquier máquina detrás de NAT con él. Además, alguien conoce una buena guía para la configuración de autenticación de servicios ocultos. Las últimas versiones lo han hecho un poco más complejo.

  • Anónimo dice:

    Un buen truco es usar mosh.

    • Marek dice:

      Desafortunadamente, mosh funciona con UDP, por lo que el reenvío X no funciona; necesita una segunda sesión ssh para eso. De lo contrario adjunto a una pantalla es muy bueno.

  • sdfdsfsdfds dice:

    Como muchos de los libros en el paquete humilde, es tan antiguo que es inútil, desde 2009. Muchas de las cosas mencionadas en este artículo en sí no estarían en ese libro, ya que las características han aparecido en los últimos diez (tos) años.

    O'reilly realmente resbaló; muchos de sus libros principales, por los que son más famosos, están ahora irremediablemente obsoletos. El DNS y el libro de encuadernación ni siquiera cubren las DNSSEC, y ¿quién diablos usa el vínculo ya?

    El humilde paquete aún puede valer la pena, ya que algunos de los libros son más recientes, pero aún así ... no se entusiasme demasiado y compruebe las fechas de las ediciones incluidas.

  • Ben Lönnqvist (@theSilentNoodle) dice:

    puedes hacer ssh de forma nativa en Windows hoy en día

    • Erik T. (@Evilspoons) dice:

      Sí, para ser más específico, en Windows 10:
      Inicio -> Configuración -> Programas
      Haga clic en 'Funciones opcionales' en Programas y funciones
      Haga clic en 'Agregar función'
      Desplácese hacia abajo hasta OpenSSH Server. El cliente OpenSSH probablemente ya esté instalado para la mayoría de las personas, asumiendo que tiene un número de compilación bastante alto.

    • Ken N dice:

      Si. Me enteré por casualidad en una sesión de Windows cmd y simplemente escribí> ssh [email protected] sin pensar ... y funcionó,

      Esperando más trucos de SSH. Buena cosa !.

  • Alessio dice:

    Gracias por compilar esta guía, me resultó útil aprovechar parte de mi trabajo en la línea de comandos.

Alejandro Vargas
Alejandro Vargas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.