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 21:49:14 -0300

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  (_)/(_)
---------------------------------

reply via email to

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