LinuxParty

Inicio activadoInicio activadoInicio activadoInicio activadoInicio activado

Este código fuente de Woof, contiene las modificaciones del artículo:

Woof: Compartir archivos/ficheros fácilmente en su LAN o red local, sin Samba, entre Linux, Mac, Windows, Android e iPhone

#!/usr/bin/env python3
################################################################
# Para trabajar con varios archivos, meterlo en un bucle...
#
# for i in {1..10} ; do echo $i ; woof -U ; done
# 
# o utilizar el script "multiples-woof.sh", abajo descrito.
###############################################################
# -*- encoding: utf-8 -*-
#
#  woof -- an ad-hoc single file webserver
#  Copyright (C) 2004-2009 Simon Budig  <Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.>
# 
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
# 
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
# 
#  A copy of the GNU General Public License is available at
#  https://www.fsf.org/licenses/gpl.txt, you can also write to the
#  Free Software  Foundation, Inc., 59 Temple Place - Suite 330,
#  Boston, MA 02111-1307, USA.

# Darwin support with the help from Mat Caughron, <Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.>
# Solaris support by Colin Marquardt, <Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.>
# FreeBSD support with the help from Andy Gimblett, <Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.>
# Cygwin support by Stefan Reichör <Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.>
# tarfile usage suggested by Morgan Lefieux <Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.>
# File upload support loosely based on code from Stephen English <Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.>

import sys, os, errno, socket, getopt, subprocess, tempfile
import cgi, urllib.request, urllib.parse, http.server
import readline
import configparser
import shutil, tarfile, zipfile
import struct

maxdownloads = 1
TM = object
cpid = -1
compressed = 'gz'
upload = False


class EvilZipStreamWrapper(TM):
   def __init__ (self, victim):
      self.victim_fd = victim
      self.position = 0
      self.tells = []
      self.in_file_data = 0

   def tell (self):
      self.tells.append (self.position)
      return self.position

   def seek (self, offset, whence = 0):
      if offset != 0:
         if offset == self.tells[0] + 14:
            # the zipfile module tries to fix up the file header.
            # write Data descriptor header instead,
            # the next write from zipfile
            # is CRC, compressed_size and file_size (as required)
            self.write (b"PK\007\010")
         elif offset == self.tells[1]:
            # the zipfile module goes to the end of the file. The next
            # data written definitely is infrastructure (in_file_data = 0)
            self.tells = []
            self.in_file_data = 0
         else:
            raise IOError ("unexpected seek for EvilZipStreamWrapper")

   def write (self, data):
      # only test for headers if we know that we're not writing
      # (potentially compressed) data.
      if self.in_file_data == 0:
         if data[:4] == zipfile.stringFileHeader:
            # fix the file header for extra Data descriptor
            hdr = list (struct.unpack (zipfile.structFileHeader, data[:30]))
            hdr[3] |= (1 << 3)
            data = struct.pack (zipfile.structFileHeader, *hdr) + data[30:]
            self.in_file_data = 1
         elif data[:4] == zipfile.stringCentralDir:
            # fix the directory entry to match file header.
            hdr = list (struct.unpack (zipfile.structCentralDir, data[:46]))
            hdr[5] |= (1 << 3)
            data = struct.pack (zipfile.structCentralDir, *hdr) + data[46:]

      self.position += len (data)
      self.victim_fd.write (data)

   def __getattr__ (self, name):
      return getattr (self.victim_fd, name)


# Utility function to guess the IP (as a string) where the server can be
# reached from the outside. Quite nasty problem actually.

def find_ip ():
   # we get a UDP-socket for the TEST-networks reserved by IANA.
   # It is highly unlikely, that there is special routing used
   # for these networks, hence the socket later should give us
   # the ip address of the default route.
   # We're doing multiple tests, to guard against the computer being
   # part of a test installation.

   candidates = []
   for test_ip in ["192.0.2.0", "198.51.100.0", "203.0.113.0"]:
      s = socket.socket (socket.AF_INET, socket.SOCK_DGRAM)
      s.connect ((test_ip, 80))
      ip_addr = s.getsockname ()[0]
      s.close ()
      if ip_addr in candidates:
         return ip_addr
      candidates.append (ip_addr)

   return candidates[0]


# our own HTTP server class, fixing up a change in python 2.7
# since we do our fork() in the request handler
# the server must not shutdown() the socket.

class ForkingHTTPServer (http.server.HTTPServer):
   def process_request (self, request, client_address):
      self.finish_request (request, client_address)
      self.close_request (request)


# Main class implementing an HTTP-Requesthandler, that serves just a single
# file and redirects all other requests to this file (this passes the actual
# filename to the client).
# Currently it is impossible to serve different files with different
# instances of this class.

class FileServHTTPRequestHandler (http.server.BaseHTTPRequestHandler):
   server_version = "Simons FileServer"
   protocol_version = "HTTP/1.0"

   filename = "."

   def log_request (self, code='-', size='-'):
      if code == 200:
         http.server.BaseHTTPRequestHandler.log_request (self, code, size)


   def do_POST (self):
      global maxdownloads, upload

      if not upload:
         self.send_error (501, "Unsupported method (POST)")
         return
      
      # taken from
      # https://mail.python.org/pipermail/python-list/2006-September/402441.html

      ctype, pdict = cgi.parse_header (self.headers['Content-Type'])
      form = cgi.FieldStorage (fp = self.rfile,
                               headers = self.headers,
                               environ = {'REQUEST_METHOD' : 'POST'},
                               keep_blank_values = 1,
                               strict_parsing = 1)
      if "upfile" not in form:
         self.send_error (403, "No upload provided")
         return
         
      upfile = form["upfile"]

      if not upfile.file or not upfile.filename:
         self.send_error (403, "No upload provided")
         return
      
      upfilename = upfile.filename

      if "\\" in upfilename:
         upfilename = upfilename.split ("\\")[-1]

      upfilename = os.path.basename (upfile.filename)

      destfile = None
      for suffix in ["", ".1", ".2", ".3", ".4", ".5", ".6", ".7", ".8", ".9"]:
         destfilename = os.path.join (".", upfilename + suffix)
         try:
            destfile = os.open (destfilename, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o644)
            break
         except OSError as e:
            if e.errno == errno.EEXIST:
               continue
            raise

      if not destfile:
         upfilename += "."
         destfile, destfilename = tempfile.mkstemp (prefix = upfilename, dir = ".")

      print ("accepting uploaded file: %s -> %s" % (upfilename, destfilename), file=sys.stderr)

      shutil.copyfileobj (upfile.file, os.fdopen (destfile, "wb"))
      
      if upfile.done == -1:
         self.send_error (408, "upload interrupted")

      txt = b"""\
              <html>
                <head><title>Woof Upload</title></head>
                <body>
                  <h1>Woof Upload complete</title></h1>
                  <p>Thanks a lot!</p>
                  <h1>
                  <p> <br> </p>
                  <p> <br> </p>
                  <p> <br> </p>
                  <p> <br> </p>
                  <p> <br> </p>
                  <p> <br> </p>
                  <center>
                  <p style="font-size:250%" ><a href="/"> INICIO </h1></a></p>
                  </center>
                </body>
              </html>
            """
      self.send_response (200)
      self.send_header ("Content-Type", "text/html")
      self.send_header ("Content-Length", str (len (txt)))
      self.end_headers ()
      self.wfile.write (txt)

      maxdownloads -= 1

      return
      

   def do_GET (self):
      global maxdownloads, cpid, compressed, upload

#         txt = b"""\
#                 <html>
#                   <head><title>Woof Upload</title></head>
#                   <body>
#                     <h1>Woof Upload</title></h1>
#                     <form name="upload" method="POST" enctype="multipart/form-data">
#                       <p><input type="file" name="upfile" /></p>
#                       <p><input type="submit" value="Upload!" /></p>
#                     </form>
#                   </body>
#                 </html>
#               """

      # Form for uploading a file
      if upload:
         txt = b"""\
                 <html>
                   <head><title>Woof Upload</title>
                   </head>
                   <body>
                    <table border="1" cellpadding="1" cellspacing="1" style="height:100%; width:100%">
             	     <tr>
			<td>
                     <h1><span style="font-size:45px">Woof Upload</span></h1>
                         </td>
                     </tr>
                     <tr>
                        <td>
                     <form class="formatoReporte" name="upload" method="POST" enctype="multipart/form-data">
                       <p><input style="font-size:250%" type="file" name="upfile" /></p>
                       <p><input style="font-size:250%" type="submit" value="Enviar!" /></p>
                     </form>
                        </td>
                     </tr>
                     </table>
                   </body>
                 </html>
               """
         self.send_response (200)
         self.send_header ("Content-Type", "text/html")
         self.send_header ("Content-Length", str (len (txt)))
         self.end_headers ()
         self.wfile.write (txt)
         return

      # Redirect any request to the filename of the file to serve.
      # This hands over the filename to the client.

      self.path = urllib.parse.quote (urllib.parse.unquote (self.path))
      location = "/" + urllib.parse.quote (os.path.basename (self.filename))
      if os.path.isdir (self.filename):
         if compressed == 'gz':
            location += ".tar.gz"
         elif compressed == 'bz2':
            location += ".tar.bz2"
         elif compressed == 'zip':
            location += ".zip"
         else:
            location += ".tar"

      if self.path != location:
         txt = """\
                <html>
                   <head><title>302 Found</title></head>
                   <body>302 Found <a href="/%s">here</a>.</body>
                </html>\n""" % location
         txt = txt.encode ('ascii')
         self.send_response (302)
         self.send_header ("Location", location)
         self.send_header ("Content-Type", "text/html")
         self.send_header ("Content-Length", str (len (txt)))
         self.end_headers ()
         self.wfile.write (txt)
         return

      maxdownloads -= 1

      # let a separate process handle the actual download, so that
      # multiple downloads can happen simultaneously.

      cpid = os.fork ()

      if cpid == 0:
         # Child process
         child = None
         type = None
         
         if os.path.isfile (self.filename):
            type = "file"
         elif os.path.isdir (self.filename):
            type = "dir"

         if not type:
            print ("can only serve files or directories. Aborting.", file=sys.stderr)
            sys.exit (1)

         self.send_response (200)
         self.send_header ("Content-Type", "application/octet-stream")
         self.send_header ("Content-Disposition", "attachment;filename=%s" % urllib.parse.quote (os.path.basename (self.filename)))
         if os.path.isfile (self.filename):
            self.send_header ("Content-Length",
                              os.path.getsize (self.filename))
         self.end_headers ()

         try:
            if type == "file":
               datafile = open (self.filename, "rb")
               shutil.copyfileobj (datafile, self.wfile)
               datafile.close ()
            elif type == "dir":
               if compressed == 'zip':
                  ezfile = EvilZipStreamWrapper (self.wfile)
                  zfile = zipfile.ZipFile (ezfile, 'w', zipfile.ZIP_DEFLATED)
                  stripoff = os.path.dirname (self.filename) + os.sep

                  for root, dirs, files in os.walk (self.filename):
                     for f in files:
                        filename = os.path.join (root, f)
                        if filename[:len (stripoff)] != stripoff:
                           raise RuntimeException ("invalid filename assumptions, please report!")
                        zfile.write (filename, filename[len (stripoff):])
                  zfile.close ()
               else:
                  tfile = tarfile.open (mode=('w|' + compressed),
                                        fileobj=self.wfile)
                  tfile.add (self.filename,
                             arcname=os.path.basename (self.filename))
                  tfile.close ()
         except Exception as e:
            print (e)
            print ("Connection broke. Aborting", file=sys.stderr)


def serve_files (filename, maxdown = 1, ip_addr = '', port = 8080):
   global maxdownloads

   maxdownloads = maxdown

   # We have to somehow push the filename of the file to serve to the
   # class handling the requests. This is an evil way to do this...

   FileServHTTPRequestHandler.filename = filename

   try:
      httpd = ForkingHTTPServer ((ip_addr, port), FileServHTTPRequestHandler)
   except socket.error:
      print ("cannot bind to IP address '%s' port %d" % (ip_addr, port), file=sys.stderr)
      sys.exit (1)

   if not ip_addr:
      ip_addr = find_ip ()
   if ip_addr:
      if filename:
         location = "https://%s:%s/%s" % (ip_addr, httpd.server_port,
                                         urllib.parse.quote (os.path.basename (filename)))
         if os.path.isdir (filename):
            if compressed == 'gz':
               location += ".tar.gz"
            elif compressed == 'bz2':
               location += ".tar.bz2"
            elif compressed == 'zip':
               location += ".zip"
            else:
               location += ".tar"
      else:
         location = "https://%s:%s/" % (ip_addr, httpd.server_port)

      print ("Now serving on %s" % location)

   while cpid != 0 and maxdownloads > 0:
      httpd.handle_request ()



def usage (defport, defmaxdown, errmsg = None):
   name = os.path.basename (sys.argv[0])
   print ("""
    Usage: %s [-i <ip_addr>] [-p <port>] [-c <count>] <file>
           %s [-i <ip_addr>] [-p <port>] [-c <count>] [-z|-j|-Z|-u] <dir>
           %s [-i <ip_addr>] [-p <port>] [-c <count>] -s
           %s [-i <ip_addr>] [-p <port>] [-c <count>] -U

           %s <url>
   
    Serves a single file <count> times via http on port <port> on IP
    address <ip_addr>.
    When a directory is specified, an tar archive gets served. By default
    it is gzip compressed. You can specify -z for gzip compression, 
    -j for bzip2 compression, -Z for ZIP compression or -u for no compression.
    You can configure your default compression method in the configuration 
    file described below.

    When -s is specified instead of a filename, %s distributes itself.

    When -U is specified, woof provides an upload form, allowing file uploads.
   
    defaults: count = %d, port = %d

    If started with an url as an argument, woof acts as a client,
    downloading the file and saving it in the current directory.

    You can specify different defaults in two locations: /etc/woofrc
    and ~/.woofrc can be INI-style config files containing the default
    port and the default count. The file in the home directory takes
    precedence. The compression methods are "off", "gz", "bz2" or "zip".

    Sample file:

        [main]
        port = 8008
        count = 2
        ip = 127.0.0.1
        compressed = gz
   """ % (name, name, name, name, name, name, defmaxdown, defport), file=sys.stderr)

   if errmsg:
      print (errmsg, file=sys.stderr)
      print (file=sys.stderr)
   sys.exit (1)



def woof_client (url):
   urlparts = urllib.parse.urlparse (url, "http")
   if urlparts[0] not in [ "http", "https" ] or urlparts[1] == '':
      return None

   fname = None

   f = urllib.request.urlopen (url)

   f_meta = f.info ()
   disp = f_meta["Content-Disposition"]

   if disp:
      disp = disp.split (";")

   if disp and disp[0].lower () == 'attachment':
      fname = [x[9:] for x in disp[1:] if x[:9].lower () == "filename="]
      if len (fname):
         fname = fname[0]
      else:
         fname = None

   if fname == None:
      url = f.geturl ()
      urlparts = urllib.parse.urlparse (url)
      fname = urlparts[2]

   if not fname:
      fname = "woof-out.bin"

   if fname:
      fname = urllib.parse.unquote (fname)
      fname = os.path.basename (fname)

   readline.set_startup_hook (lambda: readline.insert_text (fname))
   fname = input ("Enter target filename: ")
   readline.set_startup_hook (None)

   override = False

   destfile = None
   destfilename = os.path.join (".", fname)
   try:
      destfile = os.open (destfilename,
                          os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o644)
   except OSError as e:
      if e.errno == errno.EEXIST:
         override = input ("File exists. Overwrite (y/n)? ")
         override = override.lower () in [ "y", "yes" ]
      else:
         raise

   if destfile == None:
      if override == True:
         destfile = os.open (destfilename, os.O_WRONLY | os.O_CREAT, 0o644)
      else:
         for suffix in [".1", ".2", ".3", ".4", ".5", ".6", ".7", ".8", ".9"]:
            destfilename = os.path.join (".", fname + suffix)
            try:
               destfile = os.open (destfilename,
                                   os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o644)
               break
            except OSError as e:
               if e.errno == errno.EEXIST:
                  continue
               raise

         if not destfile:
            destfile, destfilename = tempfile.mkstemp (prefix = fname + ".",
                                                    dir = ".")
         print ("alternate filename is:", destfilename)

   print ("downloading file: %s -> %s" % (fname, destfilename))

   shutil.copyfileobj (f, os.fdopen (destfile, "wb"))

   return 1;



def main ():
   global cpid, upload, compressed

   maxdown = 1
   port = 8080
   ip_addr = ''

   config = configparser.ConfigParser ()
   config.read (['/etc/woofrc', os.path.expanduser ('~/.woofrc')])

   if config.has_option ('main', 'port'):
      port = config.getint ('main', 'port')

   if config.has_option ('main', 'count'):
      maxdown = config.getint ('main', 'count')

   if config.has_option ('main', 'ip'):
      ip_addr = config.get ('main', 'ip')

   if config.has_option ('main', 'compressed'):
      formats = { 'gz'    : 'gz',
                  'true'  : 'gz',
                  'bz'    : 'bz2',
                  'bz2'   : 'bz2',
                  'zip'   : 'zip',
                  'off'   : '',
                  'false' : '' }
      compressed = config.get ('main', 'compressed')
      compressed = formats.get (compressed, 'gz')

   defaultport = port
   defaultmaxdown = maxdown

   try:
      options, filenames = getopt.getopt (sys.argv[1:], "hUszjZui:c:p:")
   except getopt.GetoptError as desc:
      usage (defaultport, defaultmaxdown, desc)

   for option, val in options:
      if option == '-c':
         try:
            maxdown = int (val)
            if maxdown <= 0:
               raise ValueError
         except ValueError:
            usage (defaultport, defaultmaxdown, 
                   "invalid download count: %r. "
                   "Please specify an integer >= 0." % val)

      elif option == '-i':
         ip_addr = val

      elif option == '-p':
         try:
            port = int (val)
         except ValueError:
            usage (defaultport, defaultmaxdown,
                   "invalid port number: %r. Please specify an integer" % val)

      elif option == '-s':
         filenames.append (__file__)

      elif option == '-h':
         usage (defaultport, defaultmaxdown)

      elif option == '-U':
         upload = True

      elif option == '-z':
         compressed = 'gz'
      elif option == '-j':
         compressed = 'bz2'
      elif option == '-Z':
         compressed = 'zip'
      elif option == '-u':
         compressed = ''

      else:
         usage (defaultport, defaultmaxdown, "Unknown option: %r" % option)

   if upload:
      if len (filenames) > 0:
         usage (defaultport, defaultmaxdown,
                "Conflicting usage: simultaneous up- and download not supported.")
      filename = None

   else:
      if len (filenames) == 1:
         if woof_client (filenames[0]) != None:
            sys.exit (0)

         filename = os.path.abspath (filenames[0])
      else:
         usage (defaultport, defaultmaxdown,
                "Can only serve single files/directories.")

      if not os.path.exists (filename):
         usage (defaultport, defaultmaxdown,
                "%s: No such file or directory" % filenames[0])

      if not (os.path.isfile (filename) or os.path.isdir (filename)):
         usage (defaultport, defaultmaxdown,
                "%s: Neither file nor directory" % filenames[0])

   serve_files (filename, maxdown, ip_addr, port)

   # wait for child processes to terminate
   if cpid != 0:
      try:
         while 1:
            os.wait ()
      except OSError:
         pass



if __name__=='__main__':
   try:
      main ()
   except KeyboardInterrupt:
      print ()


Con el objetivo de poder meter "woof" en una iteración (un bucle) y poder sacar varios archivos del... por ejemplo móvil al portatil creamos este script, que lo puedes ejecutar desde consola o crear un acceso en el escritorio (recuerda hacerlo visible desde la consola, si quieres) para hacerte más fácil éste trabajo... si lo quieres mejorar tú... mejor.

#!/bin/bash
# Nombre del script: multiples-woof.sh
# Para enviar multiples archivos...
#
for i in {1..10} ; do echo $i ; woof -U ; done
exit
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

¿Cómo uso bash for loop para iterar valores de matriz de pensamiento en sistemas operativos UNIX / Linux? ¿Cómo puedo recorrer una matriz de cadenas en Bash?

El Bash proporciona variables de matriz unidimensionales. Cualquier variable puede usarse como matriz; el comando interno declare declarará explícitamente una matriz. No existe un límite máximo en el tamaño de una matriz, ni ningún requisito de que los miembros estén indexados o asignados de forma contigua. Las matrices se indexan mediante números enteros y se basan en cero. Esta página explica cómo declarar una matriz bash y luego usar Bash for Loop para iterar a través de los valores de la matriz.

Detalles del tutorial
Nivel de dificultad Fácil
Privilegios de root No
Requisitos Bash en Linux / Unix
Est. tiempo de leer 2 minutos

Para declarar una matriz en bash

Declaremos una matriz llamada matriz y asignemos tres valores cuando use bash:

matriz=( uno dos tres )
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

Para pasar una variable del entorno del sistema "Shell" a AWK para que la trabaje, deberás hacerlo empleando el comando "-v VarAWK=VarLinux", lo más claro que podemos hacer ésto es empleando un ejemplo.

Saluda="Hola"
awk -v saluda=$Saluda 'BEGIN {print saluda}'

Hola

Mediante este ejemplo, pasamos la varible de Linux "Saluda", con "S" Mayúscula a la variable "saluda", con "s" minúscula que será la varible de AWK y ejecutamos el comando AWK del programa con la sentencia "BEGIN" delante.

Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

System Tar and Restore es un script de copia de seguridad del sistema versátil para sistemas Linux. Viene con dos scripts bash, el script principal star.sh y un script de envoltura GUI star-gui.sh , que funcionan en tres modos: copia de seguridad, restauración y transferencia.

También te pueden interesar:

Script para hacer copia de seguridad de los Usuarios, Bases de Datos y /var/www/html

Hacer copias de seguridad de archivos en Linux con Rsync (Seguridad)

Busca más Copia de seguridad.

Características

  • Copia de seguridad total o parcial del sistema
  • Restaurar o transferir al mismo diseño de disco / partición o diferente.
  • Restaure o transfiera la copia de seguridad a una unidad externa como USB, tarjeta SD, etc.
  • Restaurar un sistema basado en BIOS a UEFI y viceversa.
  • Organizar un sistema en una máquina virtual (como virtualbox ), hacer una copia de seguridad y restaurarlo en un sistema normal.

Requerimientos:

  • gtkdialog 0.8.3 o posterior (para la interfaz gráfica de usuario ).
  • tar 1.27 o posterior (compatible con acls y xattrs). [ 1 ] y [ 2 ]
  • rsync (para el modo de transferencia).
  • wget (para descargar archivos de respaldo).
  • gptfdisk / gdisk (para GPT y Syslinux).
  • openssl / gpg (para cifrado).

Cómo instalar la herramienta System Tar y Restore en Linux

Para instalar el programa System Tar and Restore , primero debe instalar todos los paquetes de software necesarios que se enumeran a continuación.

$ sudo apt install git tar rsync wget gptfdisk openssl       [En Debian/Ubuntu]
# sudo yum install git tar rsync wget gptfdisk openssl       [En CentOS/RHEL]
# sudo dnf install git tar rsync wget gptfdisk openssl       [En Fedora]
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

Construido sobre el motor V8 de Chrome, Node.JS es un tiempo de ejecución de JavaScript de código abierto y controlado por eventos que está diseñado para crear aplicaciones escalables y API de backend. NodeJS es liviano y eficiente, gracias a su modelo de E / S sin bloqueo y a su arquitectura impulsada por eventos. Esto lo convierte en una opción perfecta para manejar aplicaciones en tiempo real con uso intensivo de datos. Es multiplataforma y de descarga y uso totalmente gratuito.

NPM es un acrónimo de Node Package Manager, que es el administrador de paquetes predeterminado para Node.JS y el repositorio más completo para los paquetes Node.JS.

En este artículo, nos enfocamos en cómo instalar NodeJS y NPM en Rocky Linux 8 .

Hay dos formas principales de instalar NodeJS en Rocky Linux 8:

  • Instalación desde el repositorio predeterminado de Rocky Linux AppStream.
  • Instalación desde distribuciones binarias de Node.JS compatibles con Nodesource.

Echemos un vistazo a cada uno de estos métodos.

Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

Veremos el uso del comando "next", que le dice a Awk que omita todos los patrones y expresiones restantes que ha proporcionado, pero en su lugar lea la siguiente línea de entrada.

El comando "next" le ayuda a evitar la ejecución de lo que yo llamaría pasos de pérdida de tiempo en la ejecución de un comando.

Para entender cómo funciona, consideremos un archivo llamado food_list.txt que tiene este aspecto:

Elementos de la lista de alimentos

No Item_Name        Precio Cantidad

1   Mangos      $3.45   5
2   manzanas    $2.45   25
3   piñas       $4.45   55
4   tomates     $3.45   25
5   Cebollas    $1.45   15
6   Plátanos    $3.45   30
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

Las funciones juegan un papel importante en cualquier lenguaje de programación. Como muchos lenguajes de programación reales, bash tiene funciones que se utilizan con una implementación limitada.

Comprensión de las funciones de script de Shell de Linux

¿Qué son las funciones?

En programación, las funciones se denominan secciones de un programa que realiza una tarea específica. En este sentido, una función es un tipo de procedimiento o rutina. Cuando se llama a una función, el programa abandona la sección de código actual y comienza a ejecutar la primera línea dentro de la función. Siempre que haya un código repetitivo o cuando una tarea se repita, considere usar una función en su lugar.

Por ejemplo, considere el caso en el que necesitamos encontrar el factorial de un número en varias etapas de un programa en particular. En lugar de escribir todo el código (para calcular el factorial) todas y cada una de las veces, podemos escribir esa parte del código que calcula el factorial una vez dentro de un bloque y reutilizar el mismo en múltiples ocasiones.

¿Por qué escribimos funciones?

  1. Nos ayuda a reutilizar el código.
  2. Mejorar la legibilidad del programa.
  3. Uso eficiente de variables dentro del programa.
  4. Nos permite probar el programa parte a parte.
  5. Muestra el programa como un montón de subpasos.

Inicio activadoInicio activadoInicio activadoInicio activadoInicio desactivado

Hay muchas razones para usar Linux sobre cualquier otro sistema operativo que sea propietario, como son Windows o Mac, y es que Linux tiene la posibilidad allí donde a tí se te acabe la imaginación, por eso siempre es la mejor opción de escritorio en muchos casos, sobre todo en los más delicados.

El proceso de encriptación de una carpeta no es nueva, ya lo hemos explicado en algunos artículos como:

Crear una carpeta encriptada en Linux al estilo RealCrypt (ya encfs)

Una versión similar para Windows, puedes leer en el artículo:

La encriptación, la vamos a hacer para tener todo seguro, nuestros marcadores, nuestras contraseñas, nuestras visitas, los plugins, etc. Así pues vamos a explicar los pasos para llevarlo a cabo. Para nuestro ejemplo, vamos a usar Mozilla Firefox, por 2 razones, primera porque es un navegador gratuito y el navegador Open Source por excelencia entre los usuarios Linux y segundo, porque siempre vendrá instalado en todos las distribuciones, pero si quiere usar otro navegador, deberá hacer las modificaciones oportunas en el Script abajo desarrollado.

Inicio activadoInicio activadoInicio activadoInicio activadoInicio activado

El problema que se nos presenta es eliminar la primera fila en una salida cualquiera, dicha salida puede ser un espacio vacío, que puede estar en dicha salida o que puede estar dicho espacio vacío incluido en un fichero o una salida realizada con pipes... así este es el ejemplo..

Si queremos eliminar la primera fila de una salida cualquiera:

$ sed -e "1d"

Así por ejemplo en:

[javier@localhost ~]$ printf "Primera\nSegundo\nTercero\n"
Primera
Segundo
Tercero

Si queremos quitar "Primera", de la salida anterior... escribimos utilizando pipes y el comando "sed" para eliminar la salida "Primera":

[javier@localhost ~]$ printf "Primera\nSegundo\nTercero\n" | sed -e "1d" 
Segundo
Tercero

Si queremos eliminar la primera línea de un fichero:

$ sed -i -e "1d" $FILE
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado

Estos son algunos ejemplos de scripts de cuenta atrás para Linux que podrás usar...

Este ejemplo, no es una cuenta atrás, sino una cuenta hacia adelante.

date1=`date +%s`; while true; do 
   echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r";
done

Este es un script completo que sólo muestra en la parte superior derecha siempre, la hora...


#!/bin/bash
###################################################################################
# Se concede permiso para copiar, distribuir y/o modificar este programa siempre 
# y cuando se cite al autor y la fuente de linuxparty.es y según los términos 
# de la GNU General Public License, Versión 3 o cualquiera
# posterior publicada por la Free Software Foundation.
####################################################################################

# *************************
# reloj.sh
# https://www.linuxparty.es 
# *************************

if [ "$1" == "--ahora" -o "$1" == "-ahora" ] ; then
	date +%H:%M:%S
	exit 0
fi


Redes:



   

 

Suscribete / Newsletter

Suscribete a nuestras Newsletter y periódicamente recibirás un resumen de las noticias publicadas.

Donar a LinuxParty

Probablemente te niegues, pero.. ¿Podrías ayudarnos con una donación?


Tutorial de Linux

Top 15 artículos por Fecha

Viendo artículos de: Noviembre de 2025

Filtro por Categorías