Mám očekávaný skript, který se připojuje k webu SFTP a nahrává nějaké soubory. ID a heslo jsou obsaženy v místních textových souborech. Očekávaný skript načte tyto soubory jako proměnnou a poté je předá serveru SFTP.
Problém, se kterým se setkávám, je, že dostáváme složitá hesla, která obsahují speciální znaky ($\,!) atd. Pokud je například heslo heslo $slovo, $ přejde jako speciální, nikoli doslovný. Tím se předává přes proměnnou (více webů a ID)
Nemohu použít „$pw“, protože to doslova předá $pw na server a použití „$pw“ odešle speciální znaky. Potřebuji, aby předal heslo přesně tak, jak je.
Dosud jsem jim unikal ručně (např. heslo\$slovo), ale to je zdlouhavé a chtěl bych to udělat skriptově.
Skript vypadá takto (jména a místa se změnila, aby chránili nevinné)
#!/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
Jak mohu buď předat heslo očekávanému skriptu, aby odeslal doslovné znaky, a nedávat jim zvláštní význam?
Nemyslím si, že mohu naskriptovat „opravu“ pro samotný soubor s hesly, což znamená jít dovnitř a pokaždé, když uvidí speciální znak, unikne mu pomocí sed nebo jiným způsobem, protože samotný znak escape je speciální a mohl by skončit ve smyčce.
Vaší pomoci si velmi vážíme!
Přijatá odpověď:
Malý úryvek v Perlu lze použít k escapování (obrácené lomítko) všech znaků ASCII, které neodpovídají /[A-Za-z_0-9]/
pomocí funkce quotemeta. Příkazový řádek Perlu lze snadno začlenit do vašeho shell skriptu:
#/bin/sh
pstr='$x%y!zpass' # plain, un-escaped string
estr=$(perl -e 'print quotemeta shift(@ARGV)' "${pstr}")
echo ${estr} # show escaped string
produkuje:
\$x\%y\!zpass