SFTPサイトに接続していくつかのファイルをアップロードするexpectスクリプトがあります。 IDとパスワードはローカルテキストファイルに含まれています。期待スクリプトは、これらのファイルを変数として読み込み、SFTPサーバーに渡します。
私が経験している問題は、特殊文字($ \ ,!)などを含む複雑なパスワードが提供されていることです。たとえば、パスワードがpass $ wordの場合、$はリテラルではなく特殊文字として渡されます。これは変数(複数のサイトとID)を介して渡されます
「$pw」は文字通りサーバーに$pwを渡し、「$ pw」を使用すると特殊文字が送信されるため、使用できません。パスワードをそのまま渡すために必要です。
私はこれまで手作業でそれらをエスケープしてきました(例:pass \ $ word)が、それは面倒であり、スクリプト-o-maticallyで実行したいと思います。
スクリプトは次のようになります(無実を保護するために名前と場所が変更されました)
#!/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
パスワードをexpectスクリプトに渡して、リテラル文字を送信し、特殊な意味を与えないようにするにはどうすればよいですか?
パスワードファイル自体の「修正」をスクリプト化できないと思います。つまり、入力します。エスケープ文字自体は特殊であり、ループに陥る可能性があるため、特殊文字を検出するたびに、sedまたはその他の手段でエスケープします。
あなたの助けは大歓迎です!
承認された回答:
小さなPerlスニペットを使用して、/[A-Za-z_0-9]/
と一致しないすべてのASCII文字をエスケープ(バックスラッシュ)することができます。 quotemeta関数を使用します。 Perlコマンドラインはシェルスクリプトに簡単に組み込むことができます:
#/bin/sh
pstr='$x%y!zpass' # plain, un-escaped string
estr=$(perl -e 'print quotemeta shift(@ARGV)' "${pstr}")
echo ${estr} # show escaped string
生成:
\$x\%y\!zpass