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