Il comando hdiutil combinato con un un po 'di scripting bash può realizzare ciò che stai cercando. Avrai bisogno di un file di testo normale con ogni password su una riga separata, che termina con una riga vuota .
-
Copia e incolla questo in un file di testo:
#!/bin/bash
while read line
do
echo -n "$line" | hdiutil attach -quiet -stdinpass "$1"
if [ $? -eq 0 ]; then
echo "Password is $line"
break
fi
done < "$2"
-
salvalo e rendilo eseguibile eseguendo chmod +x /path/to/scriptfile
nel terminale.
- In Terminale, esegui
/path/to/scriptfile /path/to/image.dmg /path/to/passwords.txt
.
- Verrà eseguito fino a quando non verrà installata correttamente l'immagine del disco e verrà restituita la password che ha funzionato. Nei miei test ci sono voluti 1,3-1,6 secondi per password, quindi 3000 password potrebbero impiegare circa un'ora, a seconda del sistema (anche se potrebbe essere più veloce a seconda di dove si trova la password nel file).
Questo dovrebbe fare il trucco. Se sei curioso di sapere come e perché funziona, continua a leggere.
Spiegazione
While loop
while read line
do
[…]
done < "$2"
Questo loop su ogni riga del file password (che viene alimentato tramite la parte < "$2"
) ed esegue la roba tra do
e done
ogni volta che esegue il ciclo. $2
è una variabile speciale in Bash che rappresenta il secondo argomento passato allo script (ad esempio, se hai eseguito ./foo bar blah
, $2
sarebbe blah
). È racchiuso tra virgolette nel caso in cui ci siano spazi o altri caratteri nel nome che potrebbero causare problemi per Bash.
Montaggio dell'immagine
hdiutil attach -quiet -stdinpass "$1"'
Questo è il comando per montare effettivamente l'immagine del disco (che otteniamo dagli argomenti della riga di comando tramite la variabile $1
, proprio come il file password). Il flag -quiet
significa non stampare alcun output (solo per mantenere le cose in ordine), e -stdinpass
significa ottenere la password da la riga di comando , non la solita finestra di dialogo della password OS X.
echo -n "$line"
Il comando echo
ripete semplicemente l'input dato, che in questo caso è una singola riga dal file password, dalla variabile $line
(che viene nuovamente citata nel caso in cui le password contengano caratteri speciali). Il flag -n
è il pezzo finale di questo puzzle, impedisce a echo di ripetere il carattere newline , che verrebbe incluso nella password (e quindi impedire anche il corretto funzionamento della password).
Usiamo echo
con una "pipe" ( |
) per inviare hdiutil
alla password. Una pipe invia l'output del comando precedente ( echo
) al comando dopo la pipe ( hdiutil
). In questo modo invece di chiederci la password, hdiutil
prende semplicemente il testo che leggiamo dal file.
Verifica se la password ha avuto successo
if [ $? -eq 0 ]
Controlla se il precedente comando ha avuto successo, controllando il suo codice di uscita . $?
è un'altra variabile speciale che memorizza il codice di uscita dell'operazione precedente.
Se il codice di uscita è 0 (nessun errore), allora sappiamo che la password ha funzionato e l'istruzione if esegue queste righe:
echo "Password is $line"
break
Questo mostra un semplice messaggio che indica all'utente la password di successo, quindi il comando break
esce dal ciclo while
e termina il programma. Lo facciamo perché altrimenti lo script continuerà fino a quando non viene controllata ogni password nel file.
Combinare tutti questi pezzi insieme ti dà un modo conveniente di automatizzare un compito altrimenti lungo e doloroso.