staging.inyokaproject.org

Dateien umbenennen und wieder zurück

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

tony88

Anmeldungsdatum:
28. März 2009

Beiträge: 85

Hallo,

hier sind 12 Dateien: datei1a.part01.rar .... datei1a.part12.rar .

Es soll nicht offensichtlich sein wie die Dateiennamen lauten und das und wie diese zusammengehören. Daher sollen diese 12 Dateien in variierende 24 bis 48 lange Dateinamen bestehend aus Groß- und Kleinbuchstaben mit Zahlen umbenannt werden. Desweiteren wird eine Möglichkeit gebraucht den Vorgang wieder rückgängig zu machen.

Zufalls Buchstaben mit Groß- und Kleinbuchstaben und Zahlen zwischen 24 und 48 Zeichen lassen sich mit: cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c $(shuf -i 24-48 -n 1) erzeugen.

Wie lässt sich das auf die .rar Dateien anwenden?

Wie kann der Umbenennungsvorgang in einer Datei gespeichert werden?

Wie kann aus der Umbenennungsvorgang.datei gelesen werden und wieder zu den .rar-Dateien zurück umbenannt werden?

Habt ihr ein paar Ideen und ansätze?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Leg doch einfach Hardlinks auf die Dateien mit generierten Namen in einem neuen Verzeichnis an und beschränke den Zugriff auf das Originalverzeichnis.

ChickenLipsRfun2eat Team-Icon

Supporter
Avatar von ChickenLipsRfun2eat

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12070

tony88 schrieb:

Es soll nicht offensichtlich sein wie die Dateiennamen lauten…

Für wen? Wie greifen diejenigen auf die Daten zu, die nur die Zeichenfolgen sehen sollen? Was ist das Ziel?

sh4711

Anmeldungsdatum:
13. Februar 2011

Beiträge: 655

tony88 schrieb:

... Habt ihr ein paar Ideen und ansätze?

  1. Du könntest die Dateinamen z.B. mit dem Python Programm hellman/xortool und einer xor-Operation "verschlüsseln" siehe: Idee/Ansatz oder 2.Idee/Ansatz

  2. Du könntest die Dateinamen z.B. mit openssl verschlüsseln siehe: Idee/Ansatz

Das aus zu formulieren übersteigt aktuell meine Fähigkeiten bzw. meine freie Zeit. Ich hoffe das hilft dir trotzdem weiter.

sh4711

Anmeldungsdatum:
13. Februar 2011

Beiträge: 655

tony88 schrieb:

... Es soll nicht offensichtlich sein wie die Dateiennamen lauten und das und wie diese zusammengehören.

OK. Wenn das das Ziel ist ... und das ...

Daher sollen diese 12 Dateien in variierende 24 bis 48 lange Dateinamen bestehend aus Groß- und Kleinbuchstaben mit Zahlen umbenannt werden.

nur "nice to have" dann probiere enc.sh und dec.sh.

!!! Wichtig !!!

  1. mache immer ein Backup deiner Daten

  2. teste die Skripte ausgiebig ... das habe ich nicht im Detail gemacht!!!!

  3. wenn du die oberen Punkte nicht beherzigst kannst du am Ende im schlimmsten Fall einen nicht behebbaren Datensalat spricht Datenverlust haben.

Foplgendes Script enc.sh ist zum verschlüsseln der Dateinamen. Hier wurde mit *.txt Dateien getestet. Das muss geändert werden auf z.B. *.rar. Und das Passwort/der Schlüssel (mypass) kann auch geändert werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
#enc.sh

for filename in $(ls *.txt) 
do

#echo $filename
encfilename=$(echo $filename | openssl aes-256-cbc -pbkdf2 -pass pass:mypass | xxd -p -c 256)

#echo $encfilename
mv -v $filename $encfilename".zzz"

done

Foplgendes Script dec.sh ist zum entschlüsseln der Dateinamen. Das Passwort/der Schlüssel muss mit obigem identisch sein.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash
#dec.sh

for filename in $(ls *.zzz) 
do

#echo $filename
filename=${filename/.zzz}
#echo $filename
decfilename=$(echo $filename | xxd -r -p -c 256 | openssl aes-256-cbc -d -pbkdf2 -pass pass:mypass)
#echo $decfilename
mv -v $filename".zzz" $decfilename

done

Die im letzten Post genannten Ansätze openssl oder xortool haben den Nachteil, das sie unter Umständen Zeichen produzieren die nicht für Dateinamen gültig sind. Daher wird nach dem Verschlüsseln der Dateiname, mit Hilfe von xxd in hex umgewandelt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

sh4711 schrieb:

Foplgendes Script enc.sh ist zum verschlüsseln der Dateinamen. Hier wurde mit *.txt Dateien getestet. Das muss geändert werden auf z.B. *.rar. Und das Passwort/der Schlüssel (mypass) kann auch geändert werden.

Zeile 4 ist ein absolutes No-Go und auch überflüssig (siehe die verlinkten Artikel auf meiner Benutzerseite). Es wäre vermutlich auch schlauer, wenn man die Dateinamen als Argumente übergibt. Das Globbing kann ja auch die aufrufende Shell machen - ist auf jeden Fall flexibler. Außerdem wird nicht sauber gequotet, so dass Dateinamen mit unerwarteten Zeichen (Leerzeichen z.B.) Probleme bereiten werden.

Habe jetzt leider keine Zeit einen eigenen Vorschlag zu posten.

sh4711

Anmeldungsdatum:
13. Februar 2011

Beiträge: 655

rklm schrieb:

... Zeile 4 ist ein absolutes No-Go und auch überflüssig (siehe die verlinkten Artikel auf meiner Benutzerseite). Es wäre vermutlich auch schlauer, wenn man die Dateinamen als Argumente übergibt. Das Globbing kann ja auch die aufrufende Shell machen - ist auf jeden Fall flexibler. Außerdem wird nicht sauber gequotet, so dass Dateinamen mit unerwarteten Zeichen (Leerzeichen z.B.) Probleme bereiten werden. ...

Vielen Dank für deine Rückmeldung.
Ich schau mir das nochmal an.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

tony88 schrieb:

Habt ihr ein paar Ideen und ansätze?

Ganz grob über md5 Hashes:

hash_filenames.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/env python3
from pathlib import Path
from hashlib import md5
import sys

with open("renamed_files.tsv", "a+") as renamed_files:
    for arg in sys.argv[1:]:
        p = Path(arg)
        if not p.exists():
            print("Warning, {p} does not exist!", file=sys.stderr)
            continue
        new_filename = md5(p.name.encode()).hexdigest()
        p.rename(new_filename)
        print(f"{new_filename}\t{p.name}", file=renamed_files)

Und zurück:

unhash_filenames.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/usr/bin/env python3
from pathlib import Path
import sys

with open('renamed_files.tsv') as renamed_files:
    for line in renamed_files:
        current, original = line.rstrip('\n').split('\t')
        try:
            Path(current).rename(original)
        except Exception as err:
            print(f"skipping {current}: {err}", file=sys.stderr)
$ touch datei1a.part{01..12}.rar
$ python3 hash_filenames.py *.rar
$ ls -1
001cd0f8680777c62f779877eaa577a7
098fa2411784c12ec0139e7aa8238ee7
324feb1c9fbd3d707837e28fe9ea2f05
34bdc561f5c8c785586d2e04a6d04e52
55104136618bfa6b860ee0a343c0dc2d
59f2272cf5ba7c4afa7a35934127bea5
6527bab8a25caca3ab48b3ddf6a7d651
701331af1ac4ab4447ef8f2d89d87c76
8e126712a332205f51ec60aea0c0b10e
a7c15d5f747f63f0bd50f722b904db86
b5d64270e78720832e31f10d51376a68
f0b21f2fcc05eb79f9cca3376897e2a0
hash_filenames.py
renamed_files.tsv
unhash_filenames.py
$ cat renamed_files.tsv 
8e126712a332205f51ec60aea0c0b10e	datei1a.part01.rar
59f2272cf5ba7c4afa7a35934127bea5	datei1a.part02.rar
b5d64270e78720832e31f10d51376a68	datei1a.part03.rar
324feb1c9fbd3d707837e28fe9ea2f05	datei1a.part04.rar
55104136618bfa6b860ee0a343c0dc2d	datei1a.part05.rar
098fa2411784c12ec0139e7aa8238ee7	datei1a.part06.rar
001cd0f8680777c62f779877eaa577a7	datei1a.part07.rar
f0b21f2fcc05eb79f9cca3376897e2a0	datei1a.part08.rar
6527bab8a25caca3ab48b3ddf6a7d651	datei1a.part09.rar
701331af1ac4ab4447ef8f2d89d87c76	datei1a.part10.rar
34bdc561f5c8c785586d2e04a6d04e52	datei1a.part11.rar
a7c15d5f747f63f0bd50f722b904db86	datei1a.part12.rar
$ python3 unhash_filenames.py
$ ls -1
datei1a.part01.rar
datei1a.part02.rar
datei1a.part03.rar
datei1a.part04.rar
datei1a.part05.rar
datei1a.part06.rar
datei1a.part07.rar
datei1a.part08.rar
datei1a.part09.rar
datei1a.part10.rar
datei1a.part11.rar
datei1a.part12.rar
hash_filenames.py
renamed_files.tsv
unhash_filenames.py 

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Hier noch ein Gerüst, ohne eine tatsächliche Verschlüsselung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh

[ -z "$DEBUG" ] || set -x

crypt() {
  # dummy algo
  echo "<$1>"
}

for f; do
  d=$(dirname "$f")
  b="${f##*/}"
  x=".${b##*.}"

  if [ ".$b" = "$x" ]; then
    unset x
  fi

  echo mv -v "$f" "$d/$(crypt "${b%.*}")$x"
done

In der Funktion crypt kann man z.B. das vorgeschlagene unterbringen:

1
2
3
crypt() {
  echo "$1" | openssl aes-256-cbc -pbkdf2 -pass pass:mypass | xxd -p -c 256
}
Antworten |