GNU/Linux >> Linux の 問題 >  >> Linux

期待スクリプトで使用するために特殊文字でパスワードを変換しますか?

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

Linux
  1. 特殊文字でSedを使用していますか?

  2. Bashスクリプトに.shまたは.bash拡張子を使用しますか?

  3. In Echo {a..z}では特殊文字は何を表していますか?

  1. 特殊文字を含むパスワードでRarファイルを抽出しますか?

  2. Bash スクリプトで Expect を使用して、SSH コマンドにパスワードを提供する

  3. オプションのプロンプトで期待する方法は?

  1. SSHPass:パスワードなしで(非対話的に)スクリプトを使用してサーバーにSSHで接続する方法

  2. Ssh – Sshサーバーにログインするためのシェルスクリプト?

  3. リモートパスワードの入力を求める SSH による Rsync