Linux Fu: la mezcla de Linux

Se sabe que las computadoras son precisas y, por lo general, repetibles. Por eso es tan difícil sacarles algo que parezca aleatorio. Sin embargo, las cosas aleatorias son buenas para juegos, cifrado y multimedia. ¿Quién quiere el mismo orden de lista de reproducción o presentación de diapositivas cada vez?

Es muy difícil obtener números realmente aleatorios, pero en muchos casos, no importa tanto. Aún mejor, si programa o usa un lenguaje de secuencias de comandos, hay muchas cosas que puede usar para lograr alguna oportunidad suficiente para muchos propósitos.

La raíz del azar

Hay dos cuasi-archivos en el directorio de su dispositivo que quizás no haya notado antes. La /dev/random y /dev/urandom Los archivos generarán tantos bytes aleatorios como desee leer. ¿Por qué hay dos? El kernel captura datos ruidosos de varias ubicaciones. Por ejemplo, podría leer hardware criptográfico o medir intervalos de tiempo entre accesos al disco. Estos números no son fácilmente predecibles y pueden ser una buena fuente de números difíciles de adivinar. Sin embargo, para un cierto número de piezas aleatorias, necesita una cierta cantidad de ruido aleatorio. La /dev/random El archivo del dispositivo se llena con estos bits aleatorios de medios, y si necesita más mediciones aleatorias para completar la solicitud, se bloqueará hasta que las reciba. La /dev/urandom un archivo, por otro lado, proporcionará un número "ilimitado" de bytes; opera periódicamente mediante la siembra de un generador de números pseudoaleatorios con aleatoriedad ambiental.

Si está programando en cualquier lenguaje normal, es fácil simplemente abrir cualquiera de estos archivos y leer la cantidad de bytes que desee. En la escritura de shell normal, también es fácil. Por ejemplo:

head -c 3 /dev/random | od -t x1 -A none

Este comando le dará tres bytes hexadecimales. Si lo prefiere, puede cambiar el x1 para obtener números decimales o cualquier otra cosa que desee.

Mejor caparazón

Por supuesto, Shell sabe que desea hacer esto. Bash mantiene $RANDOM actualizado y puede leerlo si lo prefiere:

for i in {1..5}
do echo $RANDOM
done

Esto le dará cinco números aleatorios cada vez.

Mejor

Esto es fácil, pero aún podemos hacerlo mejor. Por último, suponga que tiene un montón de dichos en un archivo, uno a la vez. Incluso con un número aleatorio, deberá omitir las líneas y preocuparse por cuántas líneas hay en el archivo en total. Hay una forma mejor: la shuf orden.

Este comando parece simple al principio, pero en realidad es bastante poderoso. El comando simple lee un archivo o una entrada estándar y lo permite basándose en un número aleatorio. Hay opciones para alimentarlo con su propia fuente de números aleatorios si le importa.

A veces, no desea todos los elementos del archivo. Por ejemplo, al elegir una cita de un archivo, es posible que desee la siguiente canción aleatoria. La -n La opción limita la salida a la primera línea o líneas. Si desea mezclar números, puede usar el -i opción. Por ejemplo:

shuf -n 1 -i1-10

Este comando le dará un número aleatorio entre 1 y 10. ¡Muy fácil!

Volviendo a seleccionar una cotización aleatoria de un archivo, esto es tan fácil como:

shuf -n1 input_file.txt

Combinado con una lista de archivos, esto también puede seleccionar archivos aleatorios:

ls *.mp3 | shuf -n 1

Cuándo elegir a quién

Nota la shuf El comando es parte de GNU Core Utilities, por lo que algunas máquinas no lo tendrán. En BSD, el jot comando algo similar. Para un script más portátil, probablemente sería aconsejable comprobarlo. shuf existe, tal vez buscar jot, y si no encuentra ninguno, intente ver si $RANDOM cambios. Puede procesar el número sin procesar por awk. Si te falta eso, puedes comprobar /dev/urandom y /dev/random, que también requeriría algún procesamiento.

Con estas herramientas, puede escribir scripts agradablemente impredecibles. (Por supuesto, algunos de nuestros guiones también son menos que increíblemente impredecibles. Pero no podemos culparlos. /dev/urandom así que eso.)

Si quieres profundizar /dev/random, vea la edición de Elliot del sistema de recolección de entropía de Linux.

  • bosque eterno dice:

    Curiosamente, a diferencia de la reproducción aleatoria, la mezcla de estilos de reproductores de mp3 no es accidental. Si lo fuera, obtendrías canciones más repetitivas de las que esperas.

    Esta es una pequeña versión realmente genial, pero generalmente me arrepiento de la mayoría de los scripts de bash que escribí.

    Estoy seguro de que tiene sentido si eres administrador, pero para uso doméstico, creo que Python es mucho más agradable que bash.

    Lo principal que me gusta de bash es que es muy útil cuando tienes una lista de comandos ilógica, pero cuando empiezas a hacer una programación más pesada, la sintaxis es un poco molesta.

    • anémona dice:

      El idioma utilizado depende de la vida útil del guión.
      Si ha pasado menos de un año, el lenguaje candente de hoy es bueno
      Si tiene menos de cinco años, bash no debe romperse en ese momento.
      Si tiene más de cinco años, sh y C89 (no se permiten bibliotecas externas). La fuente C debe poder leerse desde el script para su recompilación.

      Si necesita un sistema más antiguo, Linux but y awk, por ejemplo, son bastante lujosos.

      Además, escribir algo de stdin en el procesamiento de stdout es mejor que invocar docenas de programas simples. Simplemente simplificar el procesamiento y envolverlo con sh le dará flexibilidad. También obtienes srand (), rand () para cosas menos aleatorias y arc4random () para cosas más aleatorias en sistemas más nuevos.

      El único problema de script más molesto que un antiguo script roto por bit rot es una vieja rotura de script de Perl.

      • bosque eterno dice:

        Python debería funcionar en el futuro previsible con un mantenimiento mínimo, pero sí, no es perfecto.

        Estoy realmente sorprendido de la facilidad con la que la mayoría de los idiomas adquieren la compatibilidad. Todo esto Agile RefactorMiledless no fomenta nada estable.

        Realmente tiene que haber un lenguaje decente de alto nivel (más bien una bifurcación de uno existente) en el que todos simplemente acepten dejarlos en paz.

        Hay muchos formatos de archivo que todavía podemos leer desde los años 90, pero por alguna razón, los lenguajes de programación de programación orientada a objetos siempre parecen querer intercambiarlos constantemente.

        La programación de orientación de archivos sería bastante impresionante.

        • mmm dice:

          Ya existe: python 2. Ya no se admite y, por lo tanto, es obligatorio y, por lo tanto, se deja solo. Python2 no se lanzará pronto porque ya no se actualiza.

          • bosque eterno dice:

            Puedo imaginar fácilmente que muchas distribuciones caerán 2 en los próximos años, pero debería ser bastante seguro.

            Sin embargo, algo como Wren + una GUI de estilo incrustado muy básica podría ser una mejor opción. Lenguaje moderno decente que puede compilar usted mismo e incluirlo directamente en el proyecto si quiere estar seguro de que se mantendrá.

    • JM dice:

      "Curiosamente, a diferencia de la reproducción aleatoria, la mezcla de estilos de reproductores de mp3 no es realmente aleatoria. Si lo fuera, obtendrías canciones más repetitivas de las que esperas. "

      No lo recuerdo bien, pero fueron los primeros Winamp o Foobar cuando algún mp3 "aleatorio" repetía las mismas canciones una y otra vez.

      • magia efervescente dice:

        La reproducción aleatoria no le da repeticiones de canciones consecutivas. Es una permutación de las canciones de la lista de reproducción; cada uno se reproduce una vez, pero el orden es una permutación aleatoria. No tiene nada que ver con "realmente casual" o no.

  • Steven Clark dice:

    NO use / dev / random para sistemas integrados. No generan suficiente entropía para deshabilitar su tarea y no necesita "más números aleatorios". PRNG sembrado con HWRNG y entropía sistémica es más que impredecible. No me importa que GPG y Systemd lo hagan, la mayoría de los desarrolladores centrales no están de acuerdo con esas decisiones y discuten un cambio en este comportamiento porque las operaciones de cifrado en el inicio temprano continúan bloqueando las máquinas.

    • RB dice:

      +1 Puede confirmar que el comportamiento actual de un sistema conduce a suspensiones y dolor de cabeza.

    • asaltante dice:

      Pregunta: Me fascinó crear pequeños ejemplos de Linux, como el proyecto Linux Business Card. ¿Puede elegir una fuente aleatoria, urandom / random / etc.? con algo como BuildRoot?

      • Steven Clark dice:

        En general, siempre obtienes ambos y los programas obtienen todo lo que piden. Si tiene una CPU o TPM compatible con instrucciones HWRNG, establecer rng_core.default_quality en algo sensato como 700 o 1000 hará que el kernel acredite la entropía de ellos y no bloquee el urandom accidental o no iniciado.

        • asaltante dice:

          Está bien, no era consciente de eso. Leí sobre cómo Linux y los microcontroladores manejan correctamente el "azar". Hágalo internamente a SoC o mejore alguna fuente de entropía externa.

    • Iglesia dice:

      Sí, y puede producirse un bloqueo en los sistemas no integrados que cargan el sistema de archivos en la RAM, pero no hay suficiente rendimiento de E / S. La solución fácil es simular aleatoriamente a urando.

  • RubyPanther dice:

    "Cuándo elegir quién"

    A menos que tenga buenas razones, use urandom.

    Si cree que tiene una buena razón, lea https://www.2uo.de/myths-about-urandom/ y vuelva a preguntar.

    (La única buena razón aparecerá en el núcleo cerca de la hora de inicio)

    • norte dice:

      Aquí hay una buena razón para usar algo que no sea urandom:

      Escribe una prueba unitaria a largo plazo que requiere datos aleatorios y desea el mismo conjunto de números aleatorios cada vez para que su prueba dé el mismo resultado cada vez y sea adecuada para el desarrollo de IC. En este caso, debería poder sembrar el generador de números aleatorios con la misma semilla cada vez que no es compatible con urandom.

      Si cree que se trata de algún tipo de caso especial degenerado, es probable que sus pruebas no sean muy buenas.

      Lo siento, pero la mayoría de las personas tienden a hacer sus primeras pruebas después de que la máquina se ha encendido.

      • Steven Clark dice:

        Para explicarle a la gente que lee su comentario: aquí es cuando usa las funciones C stndlib srand () y rand (). Esto NO es cuando usa / dev / random

  • Zack Kummer dice:

    "¿Quién quiere el mismo orden de lista de reproducción o presentación de diapositivas cada vez?"

    Hago. Las listas de reproducción aleatorias siempre parecen causar cambios de humor ansiosos y no puedo imaginar lo difícil que sería escribir un discurso para una presentación de diapositivas al azar.

    • RW versión 0.0.1 dice:

      Es muy molesto cómo todos los jugadores quieren ser "útiles" para rastrear cada pieza de música en algunos de sus discos y encontrar un sonido de alarma mp3 en la carpeta de la aplicación y deslizarlo entre su música real. Resulta que quiero establecer otro usuario para cada género musical y bloquear la búsqueda en su propia carpeta de inicio / usuario.

    • norte dice:

      Sí, a las personas que trabajan en el comercio minorista les gusta mucho cuando la misma horrible canción se reproduce a través del sistema de altavoces todos los días a la misma hora.

      • Zack Kummer dice:

        Si es tan corto que tiene que reiniciarse todos los días, las canciones quedarían obsoletas independientemente del orden. Además, la música minorista pretende ser lo suficientemente mala como para molestar a los clientes durante la primera reproducción. Por eso no importa un pedido; es exactamente el mismo intestino podrido y nadie tiene otro estado de ánimo que la ansiedad de que no salgas de la tienda hasta que comience la siguiente canción. Afortunadamente, la mayoría de los comerciantes eliminaron su música; el silencio es mejor.

  • Cierto dice:

    $ RANDOM, hasta donde yo sé, solo existe en el shell bash.

    • Cierto dice:

      Y también pienso en ksh. Pero no está en muchas de las conchas más antiguas.

      • John dice:

        Y también zsh (revisado recientemente, tampoco estoy seguro).

    • norte dice:

      $ RANDOM es compatible con el shell predeterminado en macOS (/ bin / zsh) y AIX (/ bin / sh), así que utilícelo en sus scripts de shell.

    • Steven Clark dice:

      Una buena pregunta es: ¿está en POSIX? Que yo sepa, la respuesta es no. Y tampoco creo que sea una de las cosas cercanas a POSIX como señal de redireccionamiento.

      En particular, no está en las cenizas de Busybox, por lo que probablemente no esté disponible en initramfs o en el entorno embebido de recursos. Si realiza mucho trabajo de integración de sistemas, aprender a usar los ismos POSIX sobre los ismos bash o ksh es una habilidad útil para eso. Reducir el número de construcciones en el lenguaje también lo hace más ortodoxo, lo que puede hacer que los guiones requieran menos conocimiento para leer, aunque hace que las cosas sean un poco más desagradables de escribir.

  • RoGeorge dice:

    ¡Gracias!
    : o)

  • Paul dice:

    ¿Qué significa “FU” en este contexto?

    • RW versión 0.0.1 dice:

      Tu palabra fu es un anciano débil 🙂

    • Chris Maple dice:

      A menudo sentía curiosidad y su pregunta me llevó a buscar la respuesta.

      “Fu” proviene de un concepto taoísta de retroceder, especialmente volver a lo básico. Hay alguna implicación en el concepto taoísta de que es cíclico, lo que no parece aplicarse a las computadoras. El uso de la computadora de "Fu" también podría involucrar habilidad.

      Además de estos artículos de Linux Fu que se centran en los comandos de texto básicos de Linux, también puede considerar el script-fu de GIMP, un lenguaje de programación para complementos de GIMP.

      • john pak dice:

        Creo que "Fu" simplemente se abrevia como "kung fu", que es un término chino general para las artes marciales.

        https://en.wikipedia.org/wiki/Kung_fu_(term)

        Entonces, ¿linux Fu probablemente significaría el arte o las técnicas de usar linux?

        • Chris Maple dice:

          Suena bien para mí. Supongo que tendremos que hacer una investigación histórica y averiguar quién causó el uso de la computadora y preguntarle a esa persona.

          • RubyPanther dice:

            La etimología no descarta el significado, por lo que eso no ayudaría. Saber que es una palabra prestada que se usa para significar "habilidad" es saber ya el significado. Si la intención fuera diferente, no influiría en el significado actual en este contexto.

  • PAVUK dice:

    Para un pseudo aleatorio simple hay un tipo -R.

  • John dice:

    Soy tan nuevo y tan viejo. Empecé a escribir programas en una pantalla verde Commadore 64 y luego en la Papelera 80. Lo siento TRS80. Puedo comprar lo suficiente si lo leo. Probablemente hay Windows 7 isCapt. No entiendo cómo cargar a un cachorro bion Lenox. Intenté de varias formas ... nuttin. también publica la Provisión IPv6 sin acceso. Restablezco la configuración, wonsoc, dos veces. Veo la fecha en oymt y la retrasé una semana. Parecía pescar. Pero ahora ha pasado una semana y lo estoy rehaciendo. Se agradece cualquier ayuda. Ty.
    Zippydoo

  • Jakob Kristensen dice:

    Alguien aquí podría encontrar interesante el algoritmo HAVEGE:
    https://github.com/jirka-h/haveged

Maya Lorenzo
Maya Lorenzo

Deja una respuesta

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