if grep -q "�" out.txt
then
echo "working"
else
cat out.txt
fi
Basicamente, se o arquivo "out.txt" contiver "�" em qualquer lugar do arquivo, eu gostaria que ele ecoasse "working" E se o arquivo "out.txt" NÃO contiver "�" em qualquer lugar do arquivo, eu gostaria para cat out.txt
EDIT: Então aqui está o que estou fazendo. Estou tentando forçar bruta uma descriptografia openssl.
openssl enc retorna 0 em caso de sucesso, caso contrário, diferente de zero. Nota: você obterá falsos positivos porque o AES/CBC só pode determinar se "a descriptografia funciona" com base no preenchimento correto. Portanto, o arquivo é descriptografado, mas não será a senha correta, portanto, haverá rabiscos nele. Um caractere comum no jargão é "�". Então eu quero que o loop do continue se a saída contiver "�".
Aqui está meu link do git https://github.com/Raphaeangelo/OpenSSLCracker Aqui está o script
while read line
do
openssl aes-256-cbc -d -a -in $1 -pass pass:$line -out out.txt 2>out.txt >/dev/null && printf "==================================================\n"
if grep -q "�" out.txt
then
:
else
cat out.txt &&
printf "\n==================================================" &&
printfn"\npassword is $line\n" &&
read -p "press return key to continue..." < /dev/tty;
fi
done < ./password.txt
ainda está me mostrando a saída com o caractere � nele
grep
é a ferramenta errada para o trabalho.Você vê o �
U+FFFD REPLACEMENT CHARACTER
não porque está literalmente no conteúdo do arquivo, mas porque você olhou para um arquivo binário com uma ferramenta que deveria lidar apenas com entrada baseada em texto. A maneira padrão de lidar com entradas inválidas (ou seja, dados binários aleatórios) é substituir tudo o que não é válido na localidade atual (provavelmente UTF-8) por U+FFFD antes de chegar à tela.Isso significa que é muito provável que um literal
\xEF\xBF\xBD
(a sequência de bytes UTF-8 para o caractere U+FFFD) nunca ocorra no arquivo.grep
está completamente certo em lhe dizer, não há nenhum.Uma maneira de detectar se um arquivo contém algum binário desconhecido é com o
file(1)
comando:Para qualquer tipo de arquivo desconhecido, ele simplesmente dirá
data
. Tentarpara verificar se o arquivo realmente contém algum binário arbitrário e, portanto, provavelmente lixo.
Se você quiser ter certeza de que
out.txt
é apenas um arquivo de texto codificado em UTF-8, você pode usar alternativamenteiconv
:TL;DR:
resposta longa
Ambas as respostas presentes são extremamente enganosas e basicamente erradas.
Para testar, pegue esses dois arquivos (de um desenvolvedor muito conceituado: Markus Kuhn ):
Demonstração
O primeiro
UTF-8-demo.txt
é um arquivo projetado para mostrar quão bem o UTF-8 é capaz de apresentar muitos idiomas, matemática, braille e muitos outros tipos úteis de caracteres. Dê uma olhada com um editor de texto (que entenda utf-8) e você verá muitos exemplos e nenhum arquivo�
.O teste que uma resposta propõe: limitar o intervalo de caracteres a
\x00-\x7F
rejeitará quase tudo dentro deste arquivo.Isso é muito errado e não removerá nenhum
�
, pois não há nenhum nesse arquivo .Usar o teste recomendado nessa resposta removerá
72.5 %
o arquivo:Isso é (para fins mais práticos) o arquivo inteiro. Um arquivo muito bem desenhado para mostrar caracteres perfeitamente válidos.
Teste
O segundo arquivo é projetado para testar vários casos de fronteira para confirmar que os leitores utf-8 estão fazendo um bom trabalho. Ele contém muitos caracteres que farão com que um '�' seja exibido. Mas a outra recomendação de resposta (a selecionada) para usar
file
falha grosseiramente com este arquivo. Apenas removendo um byte zero (\0
) (que tecnicamente é ASCII válido) e um\x7f
byte (DEL - delete) (que também é claramente um caractere ASCII) tornará todo o arquivo válido para ofile
comando:Não só
file
falha em detectar muitos caracteres incorretos, mas também falha em detectar e relatar que é um arquivo codificado em UTF-8.E sim,
file
é capaz de detectar e relatar texto codificado em UTF-8:Além disso,
file
não relata como ASCII a maioria dos caracteres de controle no intervalo de 1 a 31. Ele (file
) relata alguns intervalos comodata
:Outros como
ASCII text
:Como o intervalo de caracteres imprimíveis (com novas linhas):
Mas alguns intervalos podem causar resultados estranhos:
O programa
file
não é uma ferramenta para detectar texto, mas para detectar números mágicos em programas ou arquivos executáveis.Os intervalos
file
detectados e o tipo correspondente relatado que encontrei foram:Valores de um byte, principalmente ascii:
Intervalos codificados UTF-8:
Uma solução possível encontra-se abaixo.
Resposta anterior.
O valor Unicode para o caractere que você está postando é:
Sim, esse é um caractere Unicode 'REPLACEMENT CHARACTER' (U+FFFD) . Esse é um caractere usado para substituir qualquer caractere Unicode inválido encontrado no texto. É um "auxílio visual", não um personagem real. Para localizar e listar cada linha completa que contém caracteres UNICODE inválidos , use:
mas se você quiser apenas detectar se algum caractere é inválido, use:
Se o resultado for
1
que o arquivo está limpo, caso contrário será zero0
.Se o que você estava perguntando era: como encontrar o
�
personagem, então, use isto:Ou se o seu sistema processar corretamente o texto UTF-8, simplesmente:
Esta resposta muito inicial foi para o post original que era:
Tentar
com a
if .. then
seguinte declaração:Explicação?:
-P
,--perl-regexp
: PATTERN é uma expressão regular Perl-o
,--only-matching
: mostra apenas a parte de uma linha correspondente a PATTERN[^\x00-\x7F]
é um regex para corresponder a um único caractere não ASCII.[[:ascii:]]
- corresponde a um único caractere ASCII[^[:ascii:]]
- corresponde a um único caractere não ASCIIdentro
bash