Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Recuperación de archivos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Pasando el Rato
Mensaje Mie Dic 05, 2007 4:12 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Recuperación de archivos Responder citando

Creo que por error borré un archivo en Linux... (equipo Solaris) ¿algún comando para ver la papelera de reciclaje? ( Question ) si es que existe algo así... ¿¿ideas?? ¿¿cómo recuperar con algún comando??
Mensaje Mie Dic 05, 2007 4:32 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 474
Ubicación: Frente al monitor
Responder citando

Laughing si no has hecho backup... estás muerto.

Con rm archivo no hay solución.
Mensaje Mie Dic 05, 2007 4:40 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4035
Ubicación: Valladolid, España
Responder citando

Si lo hiciste desde el gestor de ficheros de Gnome o KDE, sí hay una papelera (icono de). Pulsando sobre ella deberían aparecer los ficheros recientemente borrados.

En cambio, si lo has hecho con 'rm' o con algún programa que llamase a la función del sistema correspondiente, no, no es posible recuperarlo.

Bueno... en teoría... se podría hacer... deberías apagar el ordenador tirando del cable del enchufe nada más haber hecho el borrado. Luego sacas el disco duro y se lo llevas a otro ordenador, o arrancas el ordenador con otro sistema que no sea el del propio disco duro. Con herramientas que miran los sectores de los discos, si te acuerdas de parte del contenido del fichero, podrías localizar alguno de esos sectores.

En las empresas especializadas en recuperación de datos, podrían incluso recuperarte el fichero entero, pero depende del tiempo (segundos) que pasase entre el momento en que lo borraste y apagaste el ordenador. Si ha pasado uno o dos minutos, casi seguro que no es recuperable.
Mensaje Jue Dic 06, 2007 5:38 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Antes que nada sugiero se ponga en Emoticons, una carita llorando o una carita así toda desesperada.

Segundo, pues ahora si ya me cargo la "$!"%!#%

Por error borré un archivo, Sad y ya no hay forma de recuperarlo, así que será un laaaaaaaaaargo laaaaaaaaargo mes, para buscar esa información en algún otro equipo de los 54 que hay aquí... en fin.
Mensaje Vie Dic 07, 2007 10:38 am
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Saludos, Perleros. Quiero saber su opinión. Tengo un programa X.ksh, el cual se ejecuta cada día, para el cual contiene lo siguiente:

bash:
. $HOME/.profile

export COLECTORHOME=/export/home/colljvip/LatJitterLan_thread
export AYER=`date '+%y:%m:%d' | awk -F":" '{printf"20%2d%2d%2d\n",$1,$2,($3-1)}' | sed 's/ /0/g'`;

export prefix=pruebas_latencia

cd ${COLECTORHOME}/historico/data

echo ${AYER}0
gzip ${prefix}${AYER}0*


Mi problema radica en la forma en la que toma la fecha, ya que con el código actual no respeta el día 31 (no da por hecho que ese día exista), por lo que yo opté por usar un programa en Perl, el cual me da la fecha, y quedó así:

bash:
export COLECTORHOME=/export/home/colljvip/LatJitterLan_thread
AYER=`perl fecha.pl`

export prefix=pruebas_latencia

cd ${COLECTORHOME}/historico/temporal
echo ${AYER}0
gzip ${prefix}${AYER}0*


La cosa es que si yo ejecuto el programa manualmente, funciona, pero si lo dejo corriendo en el cron, para que lo haga, es cuando falla. ¿Alguna sugerencia para cambiar esa fecha y no utilizar un programa en Perl? ¿o creen que el problema sea por que me falto definir la ruta del archivo *.pl? (No creo, puesto que todos los programas están dentro de la misma carpeta) ¿o que opinan?

Saludos
Mensaje Vie Dic 07, 2007 12:24 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4035
Ubicación: Valladolid, España
Responder citando

Efectivamente, el programa falla porque cron no sabe dónde está el programa fecha.pl.

Un demonio cron se suele ejcutar en un determinado subdirectorio del sistema. Y su variable PATH puede ser tan corta como "/usr/bin:/bin" (sacado de la página de manual).

Por eso, lo que se suele hacer es:
  1. Definir una nueva variable PATH dentro del fichero crontab para que cron (y los procesos que dependen de él) sepa dónde están los comandos a ejecutar, o
  2. Indicar, de forma absoluta, dónde están los comandos a ejecutar. Y de esta forma, hay dos variantes:
    1. Al principio del programa hacemos un cd al directorio donde queremos que se trabaje. Si allí están los scripts, luego podemos referirnos a ellos de forma relativa:
      bash:
      AYER=`perl ./fecha.pl`

    2. Indicar de forma absoluta toda referencia a ficheros o programas:
      bash:
      AYER=`perl /home/kiloko/programas/unix/cron/fecha.pl`
Mensaje Vie Dic 07, 2007 12:35 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

¡Rayos!, sabía que era eso... ok, hoy lo checo y mañana confirmo que se ejecutó correctamente... Very Happy

Gracias.
Mensaje Lun Dic 10, 2007 10:25 am
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Una pregunta algo tonta, pero tengo mi *.sh el cual se contacta a una base de datos y tiene que introducir un archivo ,dar un enter y salir con el comando exit, pero me he trabado al momento de terminar de insertar el archivo. como hago para introducir un enter, y despues un exit??
este seria el codigo.

Código:
echo abrir base de datos
sqlplus load/cion2007@dnopt @$FECHAAYER.dat  exit
echo termino



Por cierto encontré este curso de linux muy completo y en español

HTML:
http://www.gnuservers.com.ar/cursos/inicial/principiantes/principiantes.html

Espero les ayude a resolver muchas dudas como la que tengo en este momento..
Wink
Mensaje Lun Dic 10, 2007 12:15 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4035
Ubicación: Valladolid, España
Responder citando

Ya lo encontré, como siempre gracias a Google:
http://www.forosdelweb.com/f41/scripts-linux-sqlplus-530032/
Mensaje Lun Dic 10, 2007 12:38 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Shocked
mmmm deja lo mastico, por que al parecer eso es para cuando tienes las lineas, pero bueno comentando ya resolví el problema y es que en mi archivo, *.dat al final del mismo yo ingresaba coomit, de esta forma. para que automaticamente ingresaran las lineas que queria, pues solo era cosa de que al final tambien le pusiera el exit, y todos felices y contentos
asi quedo el archivo *.dat

Código:
Insert into FINAL_PLV (fecha, idcid, disponibilidad, latencia, perdida_paq, jitter_avg, disponibilidad_remoto, throughput, clase) values(to_date('20071209233802','YYYYMMDDHH24MISS'),82935,1,20.3,0,1,1,0,1);
commit;
exit


y asi quedo el *.Sh
Código:

echo abrir base de datos
sqlplus load/neopn2007@dnop @$FECHAAYER.dat
echo termino


Very Happy
Interesante la cosa, y sigo buscando como poner el enter, jejeje como dato curioso,,,

saludos.
Mensaje Mar Dic 11, 2007 12:40 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Embarassed
La verdad que pena pero ando algo norteado. Primero que nada ¿alguien me podría recomendar un curso de comandos Linux? Referentes a redireccionamiento de archivos y comandos. Lo que pasa es que he tenido problemas al momento de ejecutar archivos e instrucciones. Por ejemplo, yo tengo mi archivo hola.sh y en otros equipos basta con teclear hola.sh y funciona pero en este equipo tengo que poner ./hola.sh.

¿Cómo puedo hacer lo mismo? Sé que es algo relacionado con el PATH pero no sé bien qué onda? Si me recomiendan algún articulo se los agradeceré, Smile Very Happy
Mensaje Mar Dic 11, 2007 1:57 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4035
Ubicación: Valladolid, España
Responder citando

No es un problema de Linux, sino del shell que estás usando.

Tienes razón que es algo relacionado con la variable $PATH. Cuando tu mandas ejecutar algo, el shell busca el comando en el lugar del sistema de ficheros que se le indique. Por ejemplo:

/home/kiloko/bin/scripts/hola.sh

Si no le indicamos una ruta, el shell tendrá que buscarlo. Primero, mira a ver si es un comando interno suyo. Si no lo es, entonces se trata de un comando que debe estar en algún lugar del sistema de ficheros.

Para saber en qué directorio se puede encontrar ese comando, el shell usa la variable $PATH.

Si, por ejemplo, la variable $PATH contiene /bin:/usr/bin:/usr/local/bin entonces el shell mirará en cada uno de esos directorios intentando encontrarlo.

Si no lo encuentra, entonces informa de un posible error.

En tu primer caso, hola.sh sí que se encuentra en alguno de los caminos indicados por $PATH. En el segundo caso, como no lo encuentra, le estás indicando un camino (relativo) al lugar donde está (en este caso, el mismo directorio de trabajo).

Cuando uno tiene que hacer programas, puede ser muy aburrido tener que escribir el './' siempre delante de cada comando. Hay dos soluciones, pero pasan por la misma tarea: modificar la variable $PATH en el momento del arranque.

La modificación se puede realizar en alguno de los ficheros que el shell lee en el momento del arranque. En los Linux más modernos, se realiza en el fichero global /etc/profile. Ejemplo: en mi OpenSuse 10.3, un extracto de ese fichero es:
bash:
#
# Make path more comfortable
#
if test -z "$PROFILEREAD" ; then
    PATH=/usr/local/bin:/usr/bin:/bin
    if test "$HOME" != "/" ; then
        for dir in $HOME/bin/$CPU $HOME/bin ; do
            test -d $dir && PATH=$dir:$PATH
        done
    fi
    if test "$UID" = 0 ; then
        test -d /opt/kde3/sbin  && PATH=/opt/kde3/sbin:$PATH
        PATH=/sbin:/usr/sbin:/usr/local/sbin:$PATH
    fi
    for dir in  /usr/X11/bin \
                /usr/bin/X11 \
                /usr/X11R6/bin \
                /var/lib/dosemu \
                /usr/games \
                /opt/bin \
                /opt/kde3/bin \
                /opt/kde2/bin \
                /opt/kde/bin \
                /usr/openwin/bin \
                /opt/cross/bin
    do
        test -d $dir && PATH=$PATH:$dir
    done
    unset dir
    export PATH
fi
Notar las siguientes cosas:
* Se usa una variable global llamada $PROFILEREAD para saber si este fichero ya lo hemos ejecutado o no (resulta que durante diez años, los shell ejecutaban varias veces este mismo fichero, por... una historia... que es mejor olvidar...)
* Vale, si es la primera vez que lo ejecutamos, inicializa la variable a un valor estándar.
* Si la variable $HOME está puesta (lo que suele querer decir que este fichero está siendo ejecutado por un shell arrancado a su vez por un proceso login por parte de un usuario -real-), entonces hace un bucle mirando a ver si ese usuario tiene un par directorios llamados bin/$CPU y bin/. Si los tiene, los agrega a $PATH.
* El resto de las líneas van añadiendo directorios más o menos estándares, en caso de que existan en el sistema.
* Finalmente, exporta la variable, para que sea conocida en los procesos que se ejecutarán más tarde.

Aquí has visto que, con que el usuario ya tenga un subdirectorio llamado bin/, el $PATH cambia para agregarle, así que la consecuencia es que solo tendríamos que meter nuestros programas dentro de ese directorio y ya está. Y esta es la solución más aconsejable.

Pero claro... muchas veces estamos haciendo programas que NO están NI estarán guardados en el bin/ del usuario, así que muchas veces tenemos que ejecutar comandos que están en el mismo directorio donde les estamos creando. Y escribir './' es muy aburrido.

Bien, pues hay que modificar $PATH para que agregue el directorio actual -en donde estemos en ese momento- a la lista de "caminos a ejecutables".

(Lo siguiente es un rollo. Saltar los dos próximos párrafos)

Esto se suele hacer ya en alguno de los ficheros propios del usuario, por temas de seguridad que luego comentaré. Si se usa el Bash Shell, se suele hacer en alguno de los ficheros que se ejecutan en el arranque de login del usuario. Podría ser ~/.profile o ~/.bashrc. Según el manual, el primero se ejecuta en el momento del login del usuario, mientras que el segundo se ejecuta cuando se ejecuta un shell interactivo (sí, hay ocasiones que un usuario puede entrar en un sistema y no hacer una sesión interactiva).

En mi OpenSuse 10.3, ~/.profile, básicamente lo único que hace es comprobar que /etc/profile se haya ejecutado. Sino es así, lo ejecutamos de todas formas:
bash:
test -z "$PROFILEREAD" && . /etc/profile

mientras que ~/.bashrc contiene un texto que indica que este fichero será ejecutado desde el /etc/profile, por lo que todo que pongamos en ~/.bashrc será ejecutado tanto en sesiones interactivas, como en sesiones normales o incluso si solo se hace login.

Bueno, pues entonces editamos ~/.bashrc y agregamos una línea como esta:
bash:
export PATH="$PATH:."

que quiere decir que a la variable $PATH le añadimos el directorio actual ('.'), sea el que sea en ese momento y siempre que ejecutemos un comando.

Con este cambio, ya no tenemos que escribir './' para ejecutar los comandos del propio directorio.

Todo esto está bien... pero tiene un lado perverso. Si nuestra máquina está segura (y nadie va a entrar a tocar las narices), podemos seguir así. El problema es el siguiente: si en lugar de definir la variable $PATH como antes, si no así:
bash:
export PATH=".:$PATH"

(es decir: damos preferencia de búsqueda a los comandos que están en nuestro directorio ANTES que en ningún otro), entonces, si un día, alguien -hacker o no- consigue entrar en el sistema, podría colocar un ejecutable -un malware-, con un nombre muy conocido, en alguno de los directorios de algún usuario o del propio root -según los permisos que consiga escalar-. Ejemplo: instala un troyano, con el nombre 'ls' y lo deja en tu carpeta raíz.

Como ejecutar 'ls' es algo muy normal, lo vas a hacer y, como el $PATH fue modificado para tener en cuenta el propio directorio en donde estemos, lo que hará el shell será ejecutar el troyano.

Lo mejor, entonces, es definir $PATH como se ha indicado antes, con el '.' al final, porque entonces el shell ejecutará el 'ls' del sistema antes que el de tu directorio.

De todas formas, mientras que esto es una modificación muy normal para un usuario, no es nada aconsejable para los root. Y en el caso de usarlo un usuario, que no se le ocurra crear programas que tengan el mismo nombre que los comandos básicos del sistema. El lío puede ser tremendo (con la ulterior posible pérdida de información).

Son 0.20€.

Ultima edición por explorer el Mar Dic 11, 2007 6:06 pm, editado 1 vez
Mensaje Mar Dic 11, 2007 2:46 pm
Kiloko
Perlero Adicto
Perlero Adicto
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
Responder citando

Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked Shocked

Ok, yo solo esperaba una liga a un tutorial o algo, pero eso esta más que perfecto... mil gracias.. y por lo otro jajajajaja ahí anótalo a la cuenta. Razz

Un saludo.

Confirmando entonces solo abria que ingresa
Código:
PATH=$PATH:$HOME;.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Pasando el Rato Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group