|
From: | Alfredo Casanova |
Subject: | Re: [shell-script-pt] Como fazer enviar especial chars via bash |
Date: | Sat, 28 Aug 2021 23:10:20 -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,048sAb.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
}urlencodetente usar aspas ao atribuir e chamar a variável tb pra evitar maiores problemasurlencode "@@bla##"
%40%40bla%23%23e 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.gitSe 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''repoURL=https://username:$PASSWORD@bitbucket.org/project/project.gite 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 (_)/(_)
---------------------------------
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.
[Prev in Thread] | Current Thread | [Next in Thread] |