GNU/Linux >> Linux Esercitazione >  >> Linux

Converti password con caratteri speciali da utilizzare con Expect Script?

Ho uno script previsto che si collega a un sito SFTP e carica alcuni file. L'ID e la password sono contenuti in file di testo locali. Lo script Expect legge quei file come una variabile e poi li passa al server SFTP.

Il problema che sto riscontrando è che ci vengono fornite password complesse che includono caratteri speciali ($\,!) ecc. Ad esempio, se la password è password $ password, $ passa come speciale anziché letterale. Essendo questo viene passato attraverso una variabile (più siti e ID)

Non sono in grado di utilizzare "$pw" poiché passerà letteralmente $pw al server e l'utilizzo di "$pw" invia caratteri speciali. Mi serve per passare la password esattamente così com'è.

Finora li ho eliminati manualmente (ad es. pass\$word) ma è noioso e vorrei farlo in modo script-o-matic.

La sceneggiatura è simile a questa (nomi e luoghi cambiati per proteggere gli innocenti)

#!/bin/bash

home=/data/ftp/vf/drop/
un=`cat /home/vf/workflow/.udf/.u/.u$1`
pw=`cat /home/vf/workflow/.udf/.p/.p$1`
sl=`cd /home/vf/workflow/scheduler; grep $1 upload*|cut -d \: -f1`

/usr/bin/expect -c "
spawn /usr/bin/sftp -o KexDHMin=1024 [email protected]$sl.mysteriouslocation.com
set timeout -1
expect *Authentication
expect Password*
send \"$pw\r\"
expect sftp*
send \"mput /$home/$1/transfer/*\r\"
expect sftp*
send \"ls \r\"
expect sftp*
send \"bye\r\"
expect eof
exit

Come posso passare la password allo script di attesa in modo che invii i caratteri letterali e non dia loro un significato speciale?
Non credo di poter scrivere una "correzione" per il file della password stesso, il che significa entrare e ogni volta che vede un carattere speciale, evitalo tramite sed o altri mezzi poiché il carattere di escape stesso è speciale e potrebbe finire in un ciclo.

Il tuo aiuto è molto apprezzato!

Risposta accettata:

Un piccolo frammento di Perl può essere utilizzato per sfuggire (barra rovesciata) a tutti i caratteri ASCII che non corrispondono a /[A-Za-z_0-9]/ utilizzando la funzione quotemeta. La riga di comando di Perl è facilmente incorporabile nello script della shell:

#/bin/sh
pstr='$x%y!zpass' # plain, un-escaped string
estr=$(perl -e 'print quotemeta shift(@ARGV)' "${pstr}")
echo ${estr}      # show escaped string

produce:

\$x\%y\!zpass

Linux
  1. Virtualizzazione su PC, spiegata ai principianti con casi d'uso pratici

  2. Usare Sed con personaggi speciali?

  3. Come aggiungere automaticamente account utente E password con uno script Bash?

  4. Utilizzare Expect in uno script Bash per fornire una password a un comando SSH

  5. Come utilizzare wait con prompt facoltativi?

Come utilizzare la password crittografata nello script della shell Bash Linux

Come utilizzare MySQL con l'applicazione Ruby On Rails

Mailing List Manager consigliato per l'uso con Postfix?

Estrarre un file Rar con una password che contiene caratteri speciali?

Script Bash per Loop spiegato con esempi

Strumento di controllo grammaticale da utilizzare con LaTeX?