Вы хотите ограничить себя ASCII или латинским алфавитом? А как насчет диакритических знаков, таких как акценты (é, â ...)?
Стефан Шазелас
Спасибо за продолжение. Обновлен оригинальный пост для уточнения.
ardevd
Это действительно должно быть в Bash? Подойдет ли такой язык, как Perl или awk?
Тердон
1
Тогда почему бы просто не вызвать Perl или Python из bash? Особенно perlлегко использовать его как однострочник.
Тердон
2
Вы пытаетесь учиться или просто хотите получить результат? Во втором случае есть множество программ, выполняющих эту работу, таких как john the ripper ( john) и т.п., которые предоставят вам множество возможностей.
YoMismo
Ответы:
13
Вот решение bash, которое принимает желаемую длину в качестве параметра (вы бы сделали permute 5в вашем случае):
#include <stdio.h>//global variables and magic numbers are the basis of good programming
const char* charset ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
char buffer[50];
void permute(int level){
const char* charset_ptr = charset;if(level ==-1){
puts(buffer);}else{while(buffer[level]=*charset_ptr++){
permute(level -1);}}}
int main(int argc, char **argv){
int length;
sscanf(argv[1],"%d",&length);//Must provide length (integer < sizeof(buffer)==50) as first arg;//It will crash and burn otherwise
buffer[length]='\0';
permute(length -1);return0;}
Запустить его:
make CFLAGS=-O3 permute && time ./permute 5>/dev/null #about 20s on my PC
Языки высокого уровня отстой в грубой силе (что в основном то, что вы делаете).
@ Stéphane Chazelas Большое спасибо за это редактирование. Я писал грязные, игнорируя «правильные» цитаты, так как в этом случае они не нужны, но я очень благодарен за ярлыки!
PSkocik
Я попробовал ваше bashрешение. Это очень приятно; Мне это очень нравится. Это работало хорошо в течение примерно 24 часов, прежде чем я заметил, что моя система полностью заблокирована. Пробовал что-то похожее с `python; с похожим результатом, хотя это было значительно быстрее.
Осторожно, это 6 x 62 5 байтов, поэтому 5 496 796 992.
Вы можете сделать тот же цикл bash, но, bashбудучи самой медленной оболочкой на западе, это займет несколько часов:
export LC_ALL=C # seems to improve performance by about 10%
shopt -s xpg_echo # 2% gain (against my expectations)set{a..z}{A..Z}{0..9}for a dofor b dofor c dofor d dofor e do
echo "$a$b$c$d$e"done;done;done;done;done
(в моей системе это скорость 700 кБ / с вместо 20 МБ / с с perlэквивалентом).
Я также чувствую, что это добавит к ответу, если вы добавите способ вывода его в файл; возможно, так как он генерируется, чтобы не разрушать вашу оперативную память, или после того, как все это кэшируется в оперативной
памяти
2
@ Hellreaver, они все записывают в файл (в стандартный вывод, в любой файл, к которому открыт доступ; при запуске в терминале, в файл устройства, например /dev/pts/something, и вы можете изменить это с помощью оператора перенаправления оболочки), не в память, а в первую сборку весь вывод в памяти перед выводом (в файл, открытый на стандартный вывод).
Стефан Шазелас
4
Вот способ сделать это чисто в bash без необходимости разбивать 5 ГБ памяти:
perl
легко использовать его как однострочник.john
) и т.п., которые предоставят вам множество возможностей.Ответы:
Вот решение bash, которое принимает желаемую длину в качестве параметра (вы бы сделали
permute 5
в вашем случае):Это мучительно медленно, хотя. Смею ли я рекомендовать C? https://youtu.be/H4YRPdRXKFs?t=18s
Запустить его:
Языки высокого уровня отстой в грубой силе (что в основном то, что вы делаете).
источник
bash
решение. Это очень приятно; Мне это очень нравится. Это работало хорошо в течение примерно 24 часов, прежде чем я заметил, что моя система полностью заблокирована. Пробовал что-то похожее с `python; с похожим результатом, хотя это было значительно быстрее.В
bash
, вы можете попробовать:но это заняло бы вечность и израсходовало всю вашу память. Лучше всего использовать другой инструмент, например
perl
:Осторожно, это 6 x 62 5 байтов, поэтому 5 496 796 992.
Вы можете сделать тот же цикл
bash
, но,bash
будучи самой медленной оболочкой на западе, это займет несколько часов:(в моей системе это скорость 700 кБ / с вместо 20 МБ / с с
perl
эквивалентом).источник
/dev/pts/something
, и вы можете изменить это с помощью оператора перенаправления оболочки), не в память, а в первую сборку весь вывод в памяти перед выводом (в файл, открытый на стандартный вывод).Вот способ сделать это чисто в bash без необходимости разбивать 5 ГБ памяти:
источник
Эта версия bash по-прежнему не такая быстрая, как Perl, но примерно в четыре раза быстрее, чем пять вложенных циклов:
источник
Вы можете использовать
crunch
(который доступен по крайней мере в дистрибутивах Kali).источник
Ну ... элегантно ?, да (просто быстрый образец):
Это полное выражение, скорее всего, заблокирует ваш компьютер:
Один из неблокирующих параметров - использовать несколько циклов:
Назовите это как:
Где первый аргумент - это количество символов, а второй - список (разделенных пробелами) используемых символов.
Это создаст переменную (
loop
) со скриптом для запуска, и последний eval выполнит этот скрипт. Например для:Значение
loop
будет:источник
Gnu Parallel может создавать комбинации, см. Https://www.gnu.org/software/parallel/ Примерно так:
источник