Como atribuir valor a uma variável quando o valor contém um caractere $ nela

3

Meu objetivo: Automatizar o scp de um servidor para outro, usando as entradas do usuário Desafio: Eu não consigo configurar a equivalência de host autorizada ssh entre os servidores porque um usuário tendo acesso ao destino também terá acesso ao servidor de origem. Então, eu preciso configurar o método legado de fornecer senha quando solicitado e então fazer scp.

Aqui está o meu código

L_SRC_SID=source
L_SID=target
MOUNT_POINT=app07
SERVICE_PASS=some$value
APP_SERVER_1=hostname
SRC_MOUNT_POINT=app01

#And now transfer the file over
/usr/bin/expect -c "
   set timeout 1
   cd /$MOUNT_POINT/$L_SID/apps
   spawn scp -pr * apps@$APP_SERVER_1:/$SRC_MOUNT_POINT/$L_SRC_SID/apps .
   expect yes/no { send yes\r ; exp_continue }
   expect password: { send $SERVICE_PASS\r }
   expect 100%
   sleep 1
   exit
"

exit

Desafios: 1. Não consigo atribuir algum valor de valor $ à variável SERVICE_PASS 2. Como fazer com que o script de envio esperado funcione usando uma variável que tenha $ character na senha. Está falhando com o erro abaixo.

password: can't read "value": no such variable

Qualquer ajuda é apreciada

Alterei o código de acordo com as sugestões, mas ainda recebo o mesmo erro

L_SRC_SID=source
L_SID=target
MOUNT_POINT=app07
SERVICE_PASS='some$value'
APP_SERVER_1=hostname
SRC_MOUNT_POINT=app01

#And now transfer the file over
/usr/bin/expect -c "
   set timeout 1
   cd /$MOUNT_POINT/$L_SID/apps
   spawn scp -pr * apps@$APP_SERVER_1:/$SRC_MOUNT_POINT/$L_SRC_SID/apps .
   expect yes/no { send yes\r ; exp_continue }
   expect password: { send $SERVICE_PASS\r }
   expect 100%
   sleep 1
   exit
"

exit

Aqui está o erro completo.

password: can't read "value": no such variable
    while executing
"send some$value\r "
    invoked from within
"expect password: { send some$value\r }"
    
por Tapan Saha 10.07.2017 / 19:26

3 respostas

2

Como você está usando aspas duplas para o corpo do script de espera, você precisa lidar com a expansão da variável de shell both e com a expansão da variável expect (ou seja, Tcl). Quando o expect está sendo executado, a variável do shell foi expandida, portanto, espere ver isto:

expect password: { send some$value\r }

Então, agora, você precisa lidar com variáveis Tcl.

Você poderia adicionar mais citações:

/usr/bin/expect -c "
    ...
    expect password: { send {$SERVICE_PASS}; send \r }

Mas isso não é necessário: Eu colocaria o script expect entre aspas simples e passaria os parâmetros do shell pelo ambiente. Dessa forma, cada variável só será substituída uma vez: no shell ou no expect, e você não terá nenhuma surpresa.

export L_SRC_SID L_SID MOUNT_POINT SERVICE_PASS APP_SERVER_1 SRC_MOUNT_POINT

/usr/bin/expect -c '  # <- single quote
    set timeout -1
    cd /$env(MOUNT_POINT)/$env(L_SID)/apps
    spawn scp -pr * apps@$env(APP_SERVER_1):/$env(SRC_MOUNT_POINT)/$env(L_SRC_SID)/apps .
    expect {
        yes/no    { send yes\r ; exp_continue }
        password: { send $env(SERVICE_PASS)\r }
    }
    expect eof
'

Em geral, o uso de sleep em espera significa que você tem o tempo limite errado ou está esperando a coisa errada. Eu mudei os dois.

    
por 10.07.2017 / 21:43
3

Para essa situação, você desejará envolver seu valor entre aspas simples:

'some$value'

As aspas duplas "" suprimem a expansão de nome de arquivo, mas não a expansão de variável.

$ value="some$value"
$ echo $value
 some

Aspas simples '' suprimem o nome do arquivo e a expansão da variável.

$ value='some$value'
$ echo $value
 some$value

Atribuições anteriores '' allow variável Expansion

$ value='some$value'
$ echo $value'

$

Portanto, para suprimir expansões de caracteres, como $ , ! , " e / , use aspas simples!

    
por 10.07.2017 / 19:41
2

Use 'strong quotes' ; caracteres especiais como $ , ! , " e \ não têm significado dentro deles.

    
por 10.07.2017 / 19:33