comando_stat_access_modify_change

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
comando_stat_access_modify_change [2022/08/07 23:19] busindrecomando_stat_access_modify_change [2022/08/11 23:44] (current) busindre
Line 57: Line 57:
 # NOTA: Se puede utilizar indistintamente -a, --time=atime, --time=access, --time=use # NOTA: Se puede utilizar indistintamente -a, --time=atime, --time=access, --time=use
  
-# Copiar las marcas de tiempo de otro fichero.+# Copiar las marcas de tiempo de otro fichero tomado como referencia.
 # NOTA: Los timestamps de "creación" y "cambio" no pueden ser modificados a fecha de este artículo en sistemas GNU/Linux. Mirar el hack del siguiente apartado. # NOTA: Los timestamps de "creación" y "cambio" no pueden ser modificados a fecha de este artículo en sistemas GNU/Linux. Mirar el hack del siguiente apartado.
-# NOTA: Esta acción realiza un cambio en el timestamp de change del fichero origen. +touch fichero -r fichero_referencia.txt # Se puede utilizar -a y -m si solo interesa copiar "atime" o "mtime".
-touch fichero -r otro_fichero.txt # Se puede utilizar -a y -m si solo interesa copiar "atime" o "mtime".+
  
 # Si el archivo llamado "fichero" existe, actualiza los timestamp que tenga, en caso contrario no crea el fichero. # Si el archivo llamado "fichero" existe, actualiza los timestamp que tenga, en caso contrario no crea el fichero.
Line 76: Line 75:
 NOTA: El timestamp de "Change" (Cambio) es modificado a la vez que se cambia la fecha de último acceso o de la última modificación. NOTA: El timestamp de "Change" (Cambio) es modificado a la vez que se cambia la fecha de último acceso o de la última modificación.
  
-**Hack para falsear de manera aproximada la fecha de creación/change de un fichero**+**Hack para falsear de manera aproximada la fecha de creación/Change de un fichero**
  
 +No es factible cambiar los timestamps de "Change" y "Birth" en sistemas Linux sin cambiar la fecha del sistema. El cambiar la fecha del sistema hace que se dependa de la velocidad de procesamiento ya que el comando stat nos muestra detalle de nanosegundo. Es decir, en ese nanosegundo deben realizarse todas las acciones para que no haya diferencias. Un nanosegundo es la duración de un ciclo de reloj de un microprocesador de 1 GHz.
 +
 +En este ejemplo se clonarán los tres timestamps de un "fichero_referente" a otro denominado "fichero_hack", incluyendo la fecha Change.
 +
 +Sin campo Birth.
 <code bash> <code bash>
-# Fechas del fichero anaconda-ks.cfg+# Fechas del fichero_hack y fichero referente
-stat anaconda-ks.cfg  + 
-  File: 'anaconda-ks.cfg' +  File: 'fichero_hack
-  Size: 963        Blocks: 8          IO Block: 4096   regular file +Access: 2019-08-07 23:27:47.204914004 +0200 
-Device: fd00h/64768d Inode: 16777679    Links: 1 +Modify: 2019-08-07 23:27:47.204914004 +0200 
-Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root) +Change: 2019-08-07 23:28:08.819620381 +0200
-Access: 2020-08-30 08:23:20.596083465 +0200 +
-Modify: 2020-08-30 08:23:20.596083465 +0200 +
-Change: 2020-08-30 08:23:20.597166885 +0200+
  Birth: -  Birth: -
  
-# Indicamos al sistema que debe irse a la fecha de creación del fichero anaconda-ks y copiamos el fichero en ese mismo momento+  File: 'fichero_referente' 
-date --set="2020-08-30 08:23:20.597166885"; cp anaconda-ks.cfg anaconda-ks.cfg_hack +Access: 2019-08-07 17:43:13.535171587 +0200 
-# Se clonan los titmestamps de acceso y modificación (lo cual obliga a cambiar de nuevo el timestamp de cambio). +Modify: 2018-07-31 17:00:12.000000000 +0200 
-touch anaconda-ks.cfg -r anaconda-ks.cfg_hack +Change: 2020-08-30 08:23:20.682000046 +0200 
-# Por último volvemos el sistema a la hora actual, en este caso por medio de chronyc, pero eso uede variar del sistema en uso. + Birth: -
-chronyc -a makestep+
  
-Comparemos los dos ficheros+Se clonan los timestamps de acceso y modificación en la fecha exacta de "cambio" del fichero
-stat anaconda-ks.cfg* +date --set="2020-08-30 08:23:20.682000046"; touch fichero_hack -r fichero_referente 
-  File: 'anaconda-ks.cfg' + 
-  Size: 963        Blocks: 8          IO Block: 4096   regular file +  File: 'fichero_hack
-Device: fd00h/64768d Inode: 16777679    Links: 1 +Access: 2019-08-07 17:43:13.535171587 +0200 
-Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root) +Modify: 2018-07-31 17:00:12.000000000 +0200 
-Access: 2020-08-30 08:23:20.597166885 +0200 +Change: 2020-08-30 08:23:20.682000046 +0200
-Modify: 2020-08-30 08:23:20.597166885 +0200 +
-Change: 2020-08-30 08:23:20.598250304 +0200+
  Birth: -  Birth: -
  
-  File: 'anaconda-ks.cfg_hack' +  File: 'fichero_referente
-  Size: 963        Blocks: 8          IO Block: 4096   regular file +Access: 2019-08-07 17:43:13.535171587 +0200 
-Device: fd00h/64768d Inode: 18947745    Links: 1 +Modify: 2018-07-31 17:00:12.000000000 +0200 
-Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root) +Change: 2020-08-30 08:23:20.682000046 +0200
-Access: 2020-08-30 08:23:20.597166885 +0200 +
-Modify: 2020-08-30 08:23:20.597166885 +0200 +
-Change: 2020-08-30 08:23:20.597166885 +0200+
  Birth: -  Birth: -
 </code> </code>
 +
 +
 +Con el campo "Birth" visualizable habría que hacer un paso más en comparación con el anterior, es decir, crear el fichero en una fecha concreta. 
 +<code bash>
 +# Se crea el fichero filehack mediante una copia de un fichero en la fecha de creación del fichero_referente.
 +# Si el campo Birth del fichero referencia es 2012-03-30 08:23:20.622000046:
 +date --set="2012-03-30 08:23:20.622000046"; cp file file_hack
 +
 +# Con eso actualmente file_hack ya tendrá dicha fecha de creación. Ahora simplemente se debe proceder como en el caso anterior para cambiar "Access", "Modify" y "Change".
 +</code>
 +
 +Si se quiere volver rápidamente al tiempo del sistema "actual", podemos guardar en una variable el tiempo justo antes de ejecutar los comandos y posteriormente establecer de nuevo la hora. En realidad la acción dura fracciones de segundo, por lo que prácticamente será inapreciable (Eso no deja de tener su posible reflejo en logs de journal, por ejemplo el cambio horario activa una limpieza de la cache de systemd-resolved).
 +<code bash>actual=$(date +"%Y-%m-%d %H:%M:%S.%9N") date --set="2012-03-30 08:23:20.622000046"; cp file file_hack; date --set="$actual"</code>
 +
 +Algunos logs generados por el cambio de hora del sistema.
 +<code>systemd-resolved[39295]: Clock change detected. Flushing caches.
 +systemd[1]: Starting Discard unused blocks on filesystems from /etc/fstab...
 +systemd[1]: Starting Rotate log files...
 +systemd[1]: Starting Daily man-db regeneration...
 +systemd[1]: Started Verify integrity of password and group files.
 +systemd[1]: shadow.service: Deactivated successfully.
 +systemd[1]: logrotate.service: Deactivated successfully.
 +systemd[1]: Finished Rotate log files.
 +systemd[1]: man-db.service: Deactivated successfully.
 +audit: BPF prog-id=0 op=UNLOAD
 +systemd[1]: Finished Daily man-db regeneration.
 +audit: BPF prog-id=0 op=UNLOAD
 +kernel: audit: type=1334 audit(1660253972.419:515): prog-id=0 op=UNLOAD
 +kernel: audit: type=1334 audit(1660253972.419:516): prog-id=0 op=UNLOAD
 +fstrim[39947]: /: 154 GiB (165362356224 bytes) recortados en /dev/sda1
 +systemd[1]: fstrim.service: Deactivated successfully.
 +systemd[1]: Finished Discard unused blocks on filesystems from /etc/fstab.</code>
 +
 +
 +NOTA: Recordar que depende de la capacidad de procesamiento pueden encontrarse diferencias en los nanosegundos. Si se opera varias veces el mismo comando y siempre se obtiene la misma diferencia de tiempo con el fichero referencia, se puede hacer una simple resta para ir unos nanosegundos más al pasado e intentar compensar.
 +
 +Al utilizar el comando date para cambiar la fecha, por debajo se hace una llamada al sistema del tipo "CLOCK_REALTIME". Esta systemcall no es compatible con el "time namespace" y por lo tanto, aunque se use un espacio de nombres de tiempo (unshare -T) con la intención de no impactar sobre todo el sistema operativo, no funcionará. Cuando se usa unshare con la opción -T, las únicas llamadas al sistema que tendrían efecto en el nuevo espacio de nombres serían CLOCK_MONOTONIC/BOOTTIME.
comando_stat_access_modify_change.1659907153.txt.gz · Last modified: 2022/08/07 23:19 by busindre