shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script-pt] Como fazer enviar especial chars via bash


From: Arkanon
Subject: Re: [shell-script-pt] Como fazer enviar especial chars via bash
Date: Sat, 28 Aug 2021 23:05:04 -0300

Beleza, Alfredo!

Sua sugestão do xxd realmente é muito boa!

Comparei essa solução em duas pequenas variações: urlencode4, envolvendo um pipe (que cria um subshell e a princípio exige algo mais durante o processo) e urlencode5, que não cria um subshell extra ao passar o valor para o xxd por herestring. O "problema" da herestring é que ela obrigatoriamente(?) adiciona uma quebra de linha ao final da string, enquanto que a passagem por "echo |" permite evitar isso com o parâmetro -n. A presença da nova linha na solução 5 nos força a removê-la durante o sed.

urlencode4()
{
  echo -n "${1:-$string}" | xxd -p -c1000 | sed 's/../%&/g'
}

urlencode5()
{
  xxd -p -c1000 <<< "${1:-$string}" | sed 's/../%&/g;s/...$//'
}


O uso do xxd reduziu mais ainda o tempo de execução! :)
As duas soluções com ele brigam cabeça a cabeça pela liderança, hehe, mas parece que evitar o subshell realmente dá um mínimo de ganho no tempo de processamento.

$ benshmark 2000 urlencode{1..5}
urlencode1  0m4,232s
urlencode2  0m27,874s
urlencode3  0m4,010s
urlencode4  0m3,482s
urlencode5  0m3,892s

$ benshmark 2000 urlencode{1..5}
urlencode1  0m5,682s
urlencode2  0m22,199s
urlencode3  0m3,713s
urlencode4  0m3,028s
urlencode5  0m2,889s

$ benshmark 2000 urlencode{1..5}
urlencode1  0m3,984s
urlencode2  0m23,353s
urlencode3  0m4,173s
urlencode4  0m3,278s
urlencode5  0m3,048s

Ab.


Em sáb., 28 de ago. de 2021 às 22:22, Alfredo Casanova <atcasanova@gmail.com> escreveu:
Que aula!

Na verdade eu n sei praticamente nada de perl, essa função eu achei em algum lugar na internet há um bom tempo e ela mora em algum dotfile meu. Aí sempre usei. Quando tenho que fazer "na mão", sigo a lógica de fazer tudo e não apenas os caracteres necessários. E faço assim:


echo -n "$string" | xxd -p -c1000| sed 's/../%\0/g'

se quiser fazer o "benshmark" tb, fiquei curioso


Em sáb., 28 de ago. de 2021 21:49, Arkanon <arkanon@lsd.org.br> escreveu:
Boa noite.

Essa solução em perl seria caso de crucificação, nos idos tempos da lista do Yahoo :-p

Na intenção de amarrar o assunto ao tema literal da lista, deixo duas sugestões de urlencoding em shell propriamente dito.

Vamos assumir essa senha:

$ string='A$B#C@D/E F'

Primeiro, uma sugestão que codifica apenas os caracteres que podem deixar a url confusa. Por ex, '$#@/ '.

urlencode2()
{
  local tohex='$#@/ '
  eval echo $(sed -r "s:[$tohex]:\$(od -N1 -tx1 <<< '&' | grep -o ' ..' | tr ' ' %):g" <<< "${1:-$string}")
}

$ urlencode2
A%24B%23C%40D%2fE%20F

Vamos comparar a velocidade dessa solução com a em perl.

urlencode1()
{
  echo -ne "${1:-$string}" | perl -pe 's/\W/"%".unpack "H*",$&/gei'
  echo
}

$ urlencode1
A%24B%23C%40D%2fE%20F


"benshmark" é uma funçãozinha que executa n vezes cada função passada por nome via parâmetro e mede o tempo total da execução repetida para cada uma delas.

benshmark()
{
  local s L=$1; shift
  for s
  {
    echo -n "$s  "
    time for ((i=0;i<L;i++)); { $s; } &> /dev/null
  }
}

$ benshmark 2000 urlencode{1..2}
urlencode1  0m3,724s
urlencode2  0m20,830s


A solução em shell ficou mais lenta. Inaceitável! Tem que melhorar isso daí :)

A primeira coisa a levar em consideração é que, se é pra codificar em hexadecimal para não deixar a url confusa para os aplicativos, tanto faz codificar apenas os caracteres que confundem quanto codificar tudo. O cuidado em codificar apenas os caracteres especiais complica desnecessariamente o procedimento. Então vamos codificar tudo e ver o que acontece :)

urlencode3()
{
  : "$(od -tx1 <<< "${1:-$string}" | grep -oE '( ..)+')"
  : "${_// /%}"
  echo "${_%\%*}"
}

$ urlencode3
%41%24%42%23%43%40%44%2f%45%20%46


A segunda coisa é confirmar que a senha 100% urlencoded realmente é compreendida.

Teste em um projeto privado no GitLab:

$ user=arkanon

$ git clone https://gitlab.com/$user/teste.git

Cloning into 'teste'...
Username for 'https://gitlab.com': ^C


Usei como senha a string 'A$B#C@D/E F' sem os apóstrofos. Como até espaço há na senha, se ela não estiver codificada, a url no "git clone" deverá, no mínimo, estar entre aspas:

$ read -s pass

$ git clone "https://$user:$pass@gitlab.com/$user/teste.git"

Cloning into 'teste'...
fatal: não foi possível acessar 'https://D/E F@gitlab.com/arkanon/teste.git/': URL using bad/illegal format or missing URL


Evidentemente o comando se perde todo.
Vamos testar com a senha codificada apenas nos caracteres especiais:

$ hpass1=$(urlencode2 "$pass")
$ echo $hpass1

A%24B%23C%40D%2fE%20F
$ git clone https://$user:$hpass1@gitlab.com/$user/teste.git teste-hpass1
Cloning into 'teste-hpass1'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 197 bytes | 98.00 KiB/s, done.
repo 'user.name' has been set to 'Arkanon'
repo 'user.email' has been set to 'arkanon@lsd.org.br'


Funcionou, como esperado. Agora vamos testar com a senha completamente codificada:

$ hpass2=$(urlencode3 "$pass")
$ echo $hpass2

%41%24%42%23%43%40%44%2f%45%20%46
$ git clone https://$user:$hpass2@gitlab.com/$user/teste.git teste-hpass2
Cloning into 'teste-hpass2'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 197 bytes | 98.00 KiB/s, done.
repo 'user.name' has been set to 'Arkanon'
repo 'user.email' has been set to 'arkanon@lsd.org.br'


Beleza, também funcionou!

E, finalmente, vamos comparar novamente, dessa vez as 3 soluções.
Três comparações na sequência:

$ benshmark 2000 urlencode{1..3}
urlencode1  0m6,681s
urlencode2  0m21,149s
urlencode3  0m3,943s

$ benshmark 2000 urlencode{1..3}
urlencode1  0m4,282s
urlencode2  0m23,017s
urlencode3  0m3,893s

$ benshmark 2000 urlencode{1..3}
urlencode1  0m4,435s
urlencode2  0m24,310s
urlencode3  0m3,990s


Bem melhor, hein? :)

Abrashos.

Em qui., 26 de ago. de 2021 às 20:53, Alfredo Casanova <atcasanova@gmail.com> escreveu:
Nunca usei bitbucket, mas acho que você pode testar essa função:
urlencode()
{
(( $# != 1 )) && return 1
echo -ne "$1" | perl -pe 's/\W/"%".unpack "H*",$&/gei'
echo
}

urlencode 

tente usar aspas ao atribuir e chamar a variável tb pra evitar maiores problemas

urlencode "@@bla##"
%40%40bla%23%23

e no comando do git coloca a string que usa a variável entre aspas tb.



On Thu, Aug 26, 2021 at 8:45 PM George Robinson <george.robinson.br@gmail.com> wrote:
Prezados amigos da lista,

Me deparei com essa questão hoje, enquanto tentava fazer um script para rodar um git pull no servidor remoto via ssh.

Pois bem, depois de muito pesquisar, eu descobri que o git não aceita na url especial chars caso a senha por exemplo contenha $#@ como parte dela, portanto, é necessário utilizar uma tabela conhecida como URL Encoding para substituir.

Como a minha senha tem @ e # eu substitui os mesmos por %40 e %23 respectivamente, portando se eu tenho uma senha do tipo @@bla## eu teria que enviar algo como git pull https://username:%40%40bla%23%23@bitbucket.com/repo/repo.git

Se eu enviar o comando diretamente na console, a conexão é feita com sucesso e eu tenho acesso ao repositório, porém, via script, eu recebo essa info:

Branch 'qa' set up to track remote branch 'qa' from 'origin'.
remote: Invalid username or password
fatal: Authentication failed for 'https://bitbucket.org/project/project.git/'

eu criei um arquivo .env onde eu gero um password como tal:

PASSWORD=''%40%40bla%23%23''


e envio um comando via ssh para utilizar a repoURL após fazer um source .env no script.

Eu acredito que não é uma questão de escape, e sim uma questão de fazer o URL ENCODING funcionar via ssh.

Alguém já passou por isso?

--
George Robinson
Analista de Suporte
Tel: +55 (21) 97449-8138
_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.


--
[]'s
Alfredo Tristão Casanova
Linux User #228230

_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.


--
(o_  @arkanon  (Twitter)     __o
//\   arkanon@lsd.org.br   _`\<,
V_/_      www.lsd.org.br  (_)/(_)
---------------------------------
_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.
_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.


--
(o_  @arkanon  (Twitter)     __o
//\   arkanon@lsd.org.br   _`\<,
V_/_      www.lsd.org.br  (_)/(_)
---------------------------------

reply via email to

[Prev in Thread] Current Thread [Next in Thread]