AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 474709
Accepted
Stuart Sloan
Stuart Sloan
Asked: 2018-10-11 18:07:31 +0800 CST2018-10-11 18:07:31 +0800 CST 2018-10-11 18:07:31 +0800 CST

Como grep para unicode � em um script bash

  • 772
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

linux grep
  • 3 3 respostas
  • 25573 Views

3 respostas

  • Voted
  1. Best Answer
    Boldewyn
    2018-10-11T22:46:32+08:002018-10-11T22:46:32+08:00

    grepé a ferramenta errada para o trabalho.

    Você vê o � U+FFFD REPLACEMENT CHARACTERnã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. grepestá 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:

    $ head -c 100 /dev/urandom > rubbish.bin
    $ file rubbish.bin
    rubbish.bin: data
    

    Para qualquer tipo de arquivo desconhecido, ele simplesmente dirá data. Tentar

    $ file out.txt | grep '^out.txt: data$'
    

    para 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 alternativamente iconv:

    $ iconv -f utf-8 -t utf-16 out.txt >/dev/null
    
    • 30
  2. user232326
    2018-10-12T04:12:43+08:002018-10-12T04:12:43+08:00

    TL;DR:

    grep -axv '.*' out.txt 
    

    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 ):

    $ wget https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt
    $ wget https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
    

    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-\x7Frejeitará 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:

    $ grep -oP "[^\x00-\x7F]" UTF-8-demo.txt | tr -d '\n' | wc -c
    10192
    $ cat UTF-8-demo.txt | wc -c
    14058
    

    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 filefalha grosseiramente com este arquivo. Apenas removendo um byte zero ( \0) (que tecnicamente é ASCII válido) e um \x7fbyte (DEL - delete) (que também é claramente um caractere ASCII) tornará todo o arquivo válido para o filecomando:

    $ cat UTF-8-test.txt | tr -d '\0\177' > a.txt
    $ file a.txt 
    a.txt: Non-ISO extended-ASCII text, with LF, NEL line terminators
    

    Não só filefalha 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:

    $ echo "ééakjfhhjhfakjfhfhaéá" | file -
    /dev/stdin: UTF-8 Unicode text
    

    Além disso, filenão relata como ASCII a maioria dos caracteres de controle no intervalo de 1 a 31. Ele ( file) relata alguns intervalos como data:

    $ printf '%b' "$(printf '\\U%x' {1..6})" | file -
    /dev/stdin: data
    

    Outros como ASCII text:

    $ printf '%b' "$(printf '\\U%x' 7 {9..12})" | file -
    /dev/stdin: ASCII text
    

    Como o intervalo de caracteres imprimíveis (com novas linhas):

    $ printf '%b' "$(printf '\\U%x' {32..126} 10)" | file -
    /dev/stdin: ASCII text
    

    Mas alguns intervalos podem causar resultados estranhos:

    $ printf '%b' "$(printf '\\U%x' {14..26})" | file -
    /dev/stdin: Atari MSA archive data, 4113 sectors per track, starting track: 5141, ending track: 5655
    

    O programa filenão é uma ferramenta para detectar texto, mas para detectar números mágicos em programas ou arquivos executáveis.

    Os intervalos filedetectados e o tipo correspondente relatado que encontrei foram:

    • Valores de um byte, principalmente ascii:

      {1..6} {14..26} {28..31} 127   :data
      {128..132} {134..159}          :Non-ISO extended-ASCII text
      133                            :ASCII text, with LF, NEL line terminators
      27                             :ASCII text, with escape sequences
      13                             :ASCII text, with CR, LF line terminators
      8                              :ASCII text, with overstriking
      7 {9..12} {32..126}            :ASCII text
      {160..255}                     :ISO-8859 text
      
    • Intervalos codificados UTF-8:

      {1..6} {14..26} {28..31} 127   :data
      27                             :ASCII text, with escape sequences
      13                             :ASCII text, with CR, LF line terminators
      8                              :ASCII text, with overstriking
      7 {9..12} {32..126}            :ASCII text
      {128..132} {134..159}          :UTF-8 Unicode text
      133                            :UTF-8 Unicode text, with LF, NEL line terminators
      {160..255}                     :UTF-8 Unicode text
      {256..5120}                    :UTF-8 Unicode text
      

    Uma solução possível encontra-se abaixo.


    Resposta anterior.

    O valor Unicode para o caractere que você está postando é:

    $ printf '%x\n' "'�"
    fffd
    

    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:

    grep -axv '.*' out.txt 
    

    mas se você quiser apenas detectar se algum caractere é inválido, use:

    grep -qaxv '.*' out.txt; echo $?
    

    Se o resultado for1 que o arquivo está limpo, caso contrário será zero 0.


    Se o que você estava perguntando era: como encontrar o� personagem, então, use isto:

    ➤ a='Basically, if the file "out.txt" contains "�" anywhere in the file I'
    ➤ echo "$a" | grep -oP $(printf %b \\Ufffd)
    �
    

    Ou se o seu sistema processar corretamente o texto UTF-8, simplesmente:

    ➤ echo "$a" | grep -oP '�'
    �
    
    • 10
  3. user88036
    2018-10-11T18:15:07+08:002018-10-11T18:15:07+08:00

    Esta resposta muito inicial foi para o post original que era:

    Como grep para unicode � em um script bash

    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

    Tentar

    grep -oP "[^\x00-\x7F]"
    

    com a if .. thenseguinte declaração:

    if grep -oP "[^\x00-\x7F]" file.txt; then
        echo "grep found something ..."
    else
        echo "Nothing found!"
    fi
    

    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 ASCII

    dentrobash

    LC_COLLATE=C grep -o '[^ -~]' file
    
    • 4

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve