Usando variáveis bash no comando perl no script bash

3

Estou tentando gerar uma senha com hash como no arquivo /etc/shadow , usando o script bash. O usuário é solicitado a fornecer a senha que é salva em uma variável PSWD . Eu extraí o Hash e o valor salt do arquivo /etc/shadow e os salvei nas variáveis HVAL e SVAL respectivamente.

Agora, para gerar uma senha com hash usando a senha e o valor de Salt, preciso usar o comando fornecido abaixo ( Referência ):

$ perl -e 'print crypt("password","\\$salt\$") . "\n"'

No comando acima, devo substituir "password" pela variável $PSWD , "6" por $HVAL e "salt" pela variável $SVAL .

Eu tentei exportar as variáveis acima e substituí-las no comando perl, como mostrado abaixo, mas foi totalmente confuso.

perl -e 'print crypt("$ENV{"PSWD"}","\$$ENV{"HVAL"}\$$ENV{"SVAL"}\$") . "\n"'

Quais serão as correções?

    
por Mandar Shinde 02.08.2015 / 08:38

2 respostas

6

O problema está nas suas aspas duplas. Aqui você não precisa citar as chaves de hash como elas são identificadores simples . De perldoc perldata :

In fact, a simple identifier within such curlies is forced to be a string, and likewise within a hash subscript. Neither need quoting. Our earlier example, $days{'Feb'} can be written as $days{Feb} and the quotes will be assumed automatically. But anything more complicated in the subscript will be interpreted as an expression. This means for example that $version{2.0}++ is equivalent to $version{2}++, not to $version{'2.0'}++.

Então:

perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")'

Se você está usando dentro de backticks, você precisa dobrar suas barras invertidas como em:

var='perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")''

Melhor é usar a forma $(...) de substituição de comando:

var=$(perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")')
    
por 02.08.2015 / 08:46
0

A sequência para chegar à citação correta começa com o comando original:

perl -e 'print crypt("password","\\$salt\$") . "\n"'

Vamos adicionar um pouco de espaço:

perl -e 'print crypt("  password  ","\$  6  \$  salt  \$") . "\n"'

Vamos alterar as vars para seus equivalentes:

perl -e 'print crypt("  $ENV{PSWD}  ","\$  $ENV{HVAL}  \$  $ENV{SVAL}  \$") . "\n"'

Os equivalentes não devem ser citados, pois nas cotações eles falham:

perl -e 'print "$ENV{PSWD}" . "\n"'      # correct.
perl -e 'print "$ENV{"PSWD"}" . "\n"'    # fail.

E, finalmente, vamos remover os espaços inseridos acima:

perl -e 'print crypt("$ENV{PSWD}","\$$ENV{HVAL}\$$ENV{SVAL}\$") . "\n"'

então, o comando pode ser atribuído a uma variável.

var="$(  perl -e 'print crypt("$ENV{PSWD}","\$$ENV{HVAL}\$$ENV{SVAL}\$") . "\n"'  )"

Com valores exportados: PSWD=password , HVAL=6 , SVAL=saltsalt recebo:

$ 6 $ saisalt $ qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2 / jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh /

    
por 03.08.2015 / 17:20