GNU/Linux >> Znalost Linux >  >> Linux

Převést heslo se speciálními znaky pro použití s ​​Expect Script?

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

Linux
  1. Virtualizace na PC, vysvětlení pro začátečníky s praktickými příklady použití

  2. Ssh – Shell skript pro přihlášení na Ssh server?

  3. Používáte Sed se speciálními znaky?

  1. Jak používat šifrované heslo ve skriptu Linux Bash Shell

  2. Extrahovat soubor Rar s heslem, které obsahuje speciální znaky?

  3. Použijte Expect ve skriptu Bash k zadání hesla příkazu SSH

  1. SSHPass:Jak SSH na server pomocí skriptu bez hesla (neinteraktivně)

  2. Použít rozšíření .sh nebo .bash pro skripty Bash?

  3. Co znamenají speciální postavy v Echo {a..z}?