ITCooky Recetas

Vamos a cocinar it cositas

¡Como usar Linux en Windows a través del Windows Subsystem for Linux – con ejemplos!

дата mayo 23, 2020

¡Existe la oportunidad de usar Linux (casi a 100%) a través de las funciones integradas de Windows 10! ¿Para qué? Para automatización mediante comandos de consola. Windows se llama Windows (ventana) por una razón, porque tienes que hacer todo con las manos y los ojos, aunque inicialmente en la historia de las computadoras todo funcionaba de forma automática con información en la consola usando comandos y expresiones regulares. El tamaño de información están creciendo, la alfabetización de los usuarios también, la complejidad y la practicidad de las tareas también, y por lo tanto, Microsoft ha lanzado Linux en Windows, porque su lenguaje de scripting PowerShell no ha despegado, no es multiplatformico, está cerrado, no se usa ampliamente, ¡así que no hay ejemplos de trabajo para cada ocasión! Y en Linux, todo esto está ahí, ¡porque se ha usado y desarrollado durante décadas!

Pondré Windows 10 en una máquina virtual, ese iso www.microsoft.com/en-us/evalcenter/evaluate-windows-10-enterprise ¡Funciona 90 días gratis! Increíblemente recién descargada, se queda durante una hora para actualizar algo

Bueno, si lees eso ya estais acostumbrados a Windows, ¡pero a mi me sorprende eso, cada vez que lanzo Windows, rara vez!

Cuando se inicie, busque «Turn Windows Features», antes tambien tuviera que activar el modo de developer, pero ahora no se necesita

Pon un cheque en Windows Subsystem for Linux

Instalar a través de la tienda de Microsoft Ubuntu 18.04 LTS

Después de la instalación, ejecute Ubuntu 18.04 LTS a través del menú del programa yyyyy inpieza actualizando algo ya ¡seguro eso lo contagio Windows!

Ok, comenzó!

El disco de Windows está montado en Linux, puedes ir a él
cd /mnt/c
ls -l


aquí puedes crear una carpeta
mkdir ubuntu
desde Windows se verá como una carpeta normal, puedes escribir allí

Comienzo
Quiero mover una carpeta de una máquina Linux a una máquina Windows. ¿Cómo? Copiar la a una unidad flash USB y llevar la en pies – pues no, es una computadora, ¡todo se puede hacer en una computadora sin patas!

He instalado en una máquina Linux
sudo apt install openssh-server

En Windows Ubuntu voy a la carpeta donde quiero descargar
cd /mnt/c/ubuntu
Y descargo la carpeta necesaria de la máquina Linux
scp -r alexandr@192.168.1.13:/home/alexandr/Documents/nespi ./
Ingreso la contraseña de la máquina Linux y todo descargado!

También puedes poner un file a máquina Linux desde Windows
scp ./somefile.txt alexandr@192.168.1.13:/home/alexandr/Documents/nespi
Ahora, por ejemplo, necesito averiguar el tamaño del archivo cuyo nombre es 001.jpg en esta carpeta
puedo hacer
ls -l
y mira a través de los ojos

pero para que usar los ojos, si puedo ordenar para que me den inmediatamente una cifra del tamaño de este archivo
asi
ls -l | grep 001.jpg | awk '{print $5}'

Y esa es la matavilla de consola, puedes formular solicitudes específicas a la computadora y recibir respuestas específicas, y todo esto en forma de comandos, ¡sin pulsa el boton de mause aqui, encuentre la palavra etc, todo puede ser automatizado!

La linea es simple. El primer comando ls -l termina con el signo | , lo que significa que todo lo que emitió va al siguiente comando. grep toma de esto solo la línea donde hay 001.jpg y la lanza al siguiente comando. awk toma quinta columnas de esta fila, donde esta exactamente el tamaño del archivo.

Si no desea ver un número en la pantalla, escriba el tamaño de todos los archivos jpg en un archivo, y que el nombre aparezca primero
ls -l | grep .jpg | awk '{print $9" "$5" bytes"}' > list.txt

esto es lo que obtenemos en el archivo list.txt

raspberrypi_nespi_itcooky001.jpg 485839 bytes
raspberrypi_nespi_itcooky002.jpg 238575 bytes
raspberrypi_nespi_itcooky003.jpg 233167 bytes
raspberrypi_nespi_itcooky004.jpg 35420 bytes
raspberrypi_nespi_itcooky005.jpg 137017 bytes
raspberrypi_nespi_itcooky006.jpg 133464 bytes
raspberrypi_nespi_itcooky007.jpg 83661 bytes

Si, por ejemplo, queremos kilobytes en lugar de bytes, puede agregar este parámetro a ls
ls -l --block-size=K| grep .jpg | awk '{print $9" "$5}' > list.txt

Y puedes hacer aun mas, a través de awk, agregar una operación de tapete y soltarla de las decenas, sin redondear
ls -l | grep .jpg | awk '{printf ("%s %d %s\n", $9, $5/1000, "Kbytes")}' > list.txt

raspberrypi_nespi_itcooky001.jpg 485 Kbytes
raspberrypi_nespi_itcooky002.jpg 238 Kbytes
raspberrypi_nespi_itcooky003.jpg 233 Kbytes
raspberrypi_nespi_itcooky004.jpg 35 Kbytes
raspberrypi_nespi_itcooky005.jpg 137 Kbytes
raspberrypi_nespi_itcooky006.jpg 133 Kbytes
raspberrypi_nespi_itcooky007.jpg 83 Kbytes

¡Mira a quí en awk en ves de print esta printf pero si es un operador de C! Primero, describe dónde se ubicará «», y luego dónde obtener estos tres valores. %s es insertar una línea, %d es tomar solo un número entero, si escribe %.0f también dejará solo un número entero pero redondeará lo que está después del punto decimal. \n esto manda a la siguiente línea!

Procesamos todas fotos en la consola de Linux para Windows
Hay una carpeta con un montón de fotos y quiero que todas estén en la misma página HTML para que haga clic y mire una vez en el navegador. Simple, útil, pero ¿cómo hacerlo? ¡La consola es fácil!

Primero miro si hay un comando bash shell
bash –version

Muestra la versión, ¡significa que la hay!
Si escribimos un archivo, necesitamos algún tipo de editor … yo uso vi, tambien hay MC es tanto un navegador de archivos como un editor.

Instalamos MC
sudo apt update
sudo apt install mc

Lanzar
mc
Seleccionamos el archivo, en la parte inferior del menú hay qué hacer con él, salimos F10

Crea un archivo fotogen.sh con texto

#!/bin/bash
echo "<html><body>" > foto.html
ls -l *.jpg | awk '{print "<img src="$9" width=100%>"}' >> foto.html
echo "</body></html>" >> foto.html

Lanza
sh ./ftogen.sh
Y obtenemos una página con fotos siempre encogidas o estiradas para ajustarse a la página. Si no necesita estirar, debe eliminar width = 100% . Eso es tan rápido y fácil, que no tiene que copiar una línea cien veces y cambiar una cifra, como lo hacia yo antes de sabar comandos de consola

Y ahora quiero que aparezcan las vistas previas, y las imágenes grandes se abren con un clic. Puede hacer pequeñas imágenes automáticamente en el programa IrfanView es un buen programa de Windows, ¡pero puede hacerlo en la consola!

Instala imagemagick
sudo apt-get install imagemagick

¡Un programma muy especial! Tuve que entender durante mucho tiempo cómo trabajar con él, ¡ya que hay muchos ejemplos en Internet! El programa tiene 29 años es imposible trabajar con él usando la lógica de consola convencional. Hay un comando básico para trabajar con la conversión de imágenes, pero no sabe cómo escribir un nuevo archivo en una nueva carpeta. Hay otro comando mogrify y es exactamente lo mismo que convertir, solo sabe cómo escribir en una nueva carpeta, pero no trabaja en pipe.

mogrify -path mini -resize 300 -quality 80 *.jpg

pone en la mini carpeta, que está en el lugar donde estamos (generalmente para eso hay que poner ./ pero aquí no), todos los jpg cambian el tamaño y la calidad
Aquí está el código listo para generar una página de fotos en miniatura
Crea un archivo fotogen2.sh con texto

#!/bin/bash
mkdir web ./web/mini
cp ./*.jpg ./web
mogrify -path web/mini -resize 300 -quality 80 ./web/*.jpg
echo "<html><body>" > ./web/foto.html
ls -l *.jpg | awk '{print "<a href=./"$9"><img src=./mini/"$9"></a>"}' >> ./web/foto.html
echo "</body></html>" >> ./web/foto.html

El script que tenemos está en la carpeta donde hay imágenes que queremos procesar, todas tienen la extensión .jpg
lanzamiento

sh ./fоtogen2.sh
Primero hacemos dos carpetas. Copia a los primeros originales. Tomamos los originales del primero y colocamos el mini en el segundo. Primero generamos la página. Resulta que todo está en la carpeta web y las imágenes y las vistas previas deben abrirse para ver foto.html, la carpeta web se puede llevar con usted o colocar en un servidor web o compartir archivos

Supervisar el estado del cartucho en impresoras o impresoras
Una tarea típica, supongamos que tiene cien impresoras, y desea información sobre los cartuchos colgados en la pared del monitor, ¡y de alguna manera visualizados!

Tengo una impresora y no la más exitosa, o más bien la más fallida (no considero OKI). Compré Kyocera FS 1125 MFP porque creía que eta network, y resulto que no puede escanear a través de la red, no hay interfaz web. Creí que es compatible con Linux: solo puede imprimir a través de la red si no hay letras rusas en el nombre del archivo. Kyocera es un jugador corporativo importante, creo que esto lo echó a perder: se adhirió a alguna corporación para siempre y no quiere que sus productos sean competitivos. ¡No compren!

Necesita instalar snmp en WSL
sudo apt install snmp

Es necesario verificar que snmp esté habilitado en la impresora. Para hacer esto, vaya a la impresora a través de USB con un programa especial. No puede descargarlo por separado en el sitio web de Kyocera, pero hay un CD ISO allí, tal vez esté allí …

Igual lo puedo verificar de otro modo – si ese comando da resultado
snmpwalk -v 2c -c public 192.168.1.2

Realmente funciona! ¡Obtengo un montón de parámetros que la impresora emite a través de snmp! Su significado es difícil de encontrar. Pero se puede acertar, sé que ahora la impresora tiene un 11%, ¡que el cartucho es para 1000 páginas!

snmpwalk -v 2c -c public 192.168.1.2 1.3.6.1.2.1.43.11.1.1.9.1.1
Aquí muestra cuántas páginas quedan hasta el final – 110 es como 11%

snmpwalk -v 2c -c public 192.168.1.2 1.3.6.1.2.1.43.11.1.1.8.1.1
recurso de cartucho 1000

snmpwalk -v 2c -c public 192.168.1.2 1.3.6.1.2.1.43.11.1.1.6.1.1
nombre del cartucho

snmpwalk -v 2c -c public 192.168.1.2 1.3.6.1.2.1.25.3.2.1.1.3.1
nombre del modelo de impresora

Creo un archivo printers.data con una descripción de impresoras donde habrá un nombre de red, ip, nombre real (lo principal es que no tengaespacios)

NetPrinter1 192.168.1.2 Low_Dep
NetPrinter2 192.168.1.2 Market_Dep
NetPrinter3 192.168.1.100 Food_Dep
NetPrinter4 192.168.1.2 KillersHR_Dep

Tengo una impresora, por lo que las IP se repiten y hay una IP incorrecta

Aquí está el código que sondea las impresoras

#!/bin/bash

#get date
my_date=`date +%Y.%m.%d-%H:%M`

#collect new data from printers
filename="./printers.data"
rm ./snmp.data
 while IFS= read -r line
 	do
           print_ip=`echo ${line} | awk '{print $2}'`    
           print_net=`echo ${line} | awk '{print $1}'`
           print_dep=`echo ${line} | awk '{print $3}'` 
	   print_left=`snmpwalk -r 2 -t 2 -L n -c public -v 2c ${print_ip} 1.3.6.1.2.1.43.11.1.1.9.1.1 | awk '{print $4}'`
	    if [ -z "$print_left" ]
	    then
		    print_left="ERRROR"
	    fi

           print_resurce=`snmpwalk -r 2 -t 2 -L n -c public -v 2c ${print_ip} 1.3.6.1.2.1.43.11.1.1.8.1.1 | awk '{print $4}'`
	    if [ -z "$print_resurce" ]
            then
		    print_resurce="ERRROR"
      	   fi
           print_cartridge=`snmpwalk -r 2 -t 2 -L n -c public -v 2c ${print_ip} 1.3.6.1.2.1.43.11.1.1.6.1.1 | awk '{print $4}'`          
	   if [ -z "$print_cartridge" ]
             then
		     print_cartridge="ERRROR"
	    fi


	   echo "$print_net $print_ip $print_dep $print_left $print_resurce $print_cartridge" >> ./snmp.data


 done < "$filename"

Si la impresora no responde, escriba ERROR. SNMP espera mucho tiempo incluso para la opción -r. El número de intentos -t timeout no reduce en gran medida la espera.
Estos son los datos recopilados, incluí especialmente aquí los datos del archivo de la impresora, para que luego sea más fácil mostrar la información

NetPrinter1 192.168.1.2 Low_Dep 110 1000 "TK-1120S"
NetPrinter2 192.168.1.2 Market_Dep 110 1000 "TK-1120S"
NetPrinter3 192.168.1.100 Food_Dep ERRROR ERRROR ERRROR
NetPrinter4 192.168.1.2 KillersHR_Dep 110 1000 "TK-1120S"

Ahora agrego a este script la parte donde se generará la página
todo aca

#!/bin/bash

#get date
my_date=`date +%Y.%m.%d-%H:%M`

#collect new data from printers
filename="/mnt/c/ubuntu/print/printers.data"
rm /mnt/c/ubuntu/print/snmp.data
 while IFS= read -r line
 	do
           print_ip=`echo ${line} | awk '{print $2}'`    
           print_net=`echo ${line} | awk '{print $1}'`
           print_dep=`echo ${line} | awk '{print $3}'` 
	   print_left=`snmpwalk -r 2 -t 2 -L n -c public -v 2c ${print_ip} 1.3.6.1.2.1.43.11.1.1.9.1.1 | awk '{print $4}'`
	    if [ -z "$print_left" ]
	    then
		    print_left="ERRROR"
	    fi

           print_resurce=`snmpwalk -r 2 -t 2 -L n -c public -v 2c ${print_ip} 1.3.6.1.2.1.43.11.1.1.8.1.1 | awk '{print $4}'`
	    if [ -z "$print_resurce" ]
            then
		    print_resurce="ERRROR"
      	   fi
           print_cartridge=`snmpwalk -r 2 -t 2 -L n -c public -v 2c ${print_ip} 1.3.6.1.2.1.43.11.1.1.6.1.1 | awk '{print $4}'`          
	   if [ -z "$print_cartridge" ]
             then
		     print_cartridge="ERRROR"
	    fi
	    print_porcent=`echo $((100*${print_left}/${print_resurce}))`
	    

	   echo "$print_net $print_ip $print_dep $print_porcent $print_left $print_resurce $print_cartridge" >> /mnt/c/ubuntu/print/snmp.data


 done < "$filename"

echo "<html>
<meta http-equiv=\"refresh\" content=\"65\">
<body>
<style>
body {
    background-color: #000000;
    }
    a:link, a:visited, .custom { 
        color: #ffffff;
}
h1 {
        color: #FF0000;
	font-size: 14px;
}
p {
    color: #ffffff;
    }
    </style>
    <p>Printers Data: update on $my_date</p>
    <table><tr><td width=120><p>Net name</p></td>
    <td width=120><p>Department</p></td>
    <td width=120><p>Cartridge</p></td>
    <td width=120 align=center><p>%</p></td></tr>" > /mnt/c/ubuntu/print/index.html
  
awk '{print "<tr><td width=120><a href=http://"$2" style=\"text-decoration: none\">"$1"</a></td><td width=120 bgcolor=#1d1e2a><p>"$3"</p></td><td width=120><p>"$7"</p></td><td align=center "} $4 >= 85 && $4 <= 100 { printf "bgcolor=#39901d"} $4 > 50 && $4 < 85 { printf "bgcolor=#37bb0c"} $4 <= 50 && $4 >30 { printf "bgcolor=#ADFF2F"} $4 <= 30 && $4 >15 { printf "bgcolor=#FFFF00"} $4 <= 15 && $4 >= 0 { printf "bgcolor=#ff0000"} {print " width=150>"$4"</td></tr>"}' /mnt/c/ubuntu/print/snmp.data >> /mnt/c/ubuntu/print/index.html    
echo "</table></html>" >> /mnt/c/ubuntu/print/index.html

ATENCIÓN: Aquí las rutas relativas ./ reemplazado con el absoluto /mnt/c/ubuntu/print/ para que funcione crontab

La primera parte se modifica ligeramente; se agrega el cálculo del porcentaje del recurso print_porcent restante. La página HTML se actualizará cada 65 segundos, esto se escribe en la segunda línea de HTML. Los campos con porcentajes del cartucho restante se teñirán en diferentes colores según este valor. El nombre de la red es un enlace. Entonces esta imagen resulta

Así que intenta meterlo en la corona local
crontab -e
añadir línea

* * * * * sh /mnt/c/ubuntu/print/printers.sh

Cron en WSL está dañado, debe iniciarse cada vez con las manos y desde la raíz para trabajar
sudo service cron start
sudo service atd start

Incluso puede ejecutar este script desde la línea de comandos de Windows e intentar insertarlo en su propio Task Schedular
C:\Windows\System32\bash.exe -c "/bin/sh/ mnt/c/ubuntu/print/prinetrs.sh"

¡Como enviar una advertencia por correo electrónico cuando el cartucho alcance un nivel bajo!
Para eso hay que instalar
sudo apt-get install ssmtp
Personalizar el archivo, necesitan derechos de root necesitan ejecutarse
sudo mc
y editar /etc/ssmtp/ssmtp.conf

Solo dejamos dicho texto en el archivo, con nuestros datos

root=username@gmail.com
mailhub=smtp.gmail.com:465
rewriteDomain=gmail.com
AuthUser=username@gmail.com
AuthPass=password
FromLineOverride=YES
UseTLS=YES

Ahora vaya a mi cuenta de gmail myaccount.google.com/security y en Seguridad active No confiable aplicaciones que tienen acceso a la cuenta

Ahora hacemos el archivo de carta mail.txt

To: recipient_name@gmail.com
From: username@gmail.com
Subject: Sent from a terminal!

Hi this is only test just ignored. By the way i have bougth butter and cheese, can you next time buy it by yourself, you know i dont have a job and enough mony to buy all food needed!

Y mandasmos esa carta
ssmtp recipient_name@gmail.com < mail.txt

Funcion

¡Ahora un script que se limitara a tomar el porcentaje del cartucho, comparará, generará una carta y la enviará! Llamaré al archivo printmail.sh

#!/bin/bash

#set warning cartridge level
cartridge_war=15
print_ip=192.168.1.2
to_email=recipient_name@gmail.com
from_email=username@gmail.com
#get date
my_date=`date +%Y.%m.%d-%H:%M`

#collect new data from printers
	   print_left=`snmpwalk -r 2 -t 2 -L n -c public -v 2c ${print_ip} 1.3.6.1.2.1.43.11.1.1.9.1.1 | awk '{print $4}'`
	    if [ -z "$print_left" ]
	    then
		    print_left="ERRROR"
	    fi

           print_resurce=`snmpwalk -r 2 -t 2 -L n -c public -v 2c ${print_ip} 1.3.6.1.2.1.43.11.1.1.8.1.1 | awk '{print $4}'`
	    if [ -z "$print_resurce" ]
            then
		    print_resurce="ERRROR"
      	   fi
	    print_porcent=`echo $((100*${print_left}/${print_resurce}))`

	    if [ $print_porcent -lt $cartridge_war ]
	    then
                 echo "To: $to_email\nFrom: $from_email\nSubject: Low toner\nLow carridge! Toner left $print_porcent%, and aprox $print_left pages to print.\nDate:$my_date" > /mnt/c/ubuntu/print/mail2.txt
                 ssmtp $to_email < /mnt/c/ubuntu/print/mail2.txt
	    fi

En la consola, todo funciona! Lo inserto en el Programador de tareas de Windows. Habrá que lanzar en Task Schedular
C:\Windows\System32\bash.exe -c "/bin/sh/ mnt/c/ubuntu/print/printmail.sh"

Voy al Task Schedular y al menú en estas ventanas como este


Y funciona! ¡Incluso cuando nadie haya iniciado sesión, puede dejar la computadora con Windows encendida y todo funcionará!


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *