Expectスクリプトで使用するために、特殊文字にパスワードを変換します。

Expectスクリプトで使用するために、特殊文字にパスワードを変換します。

SFTPサイトに接続し、いくつかのファイルをアップロードする予想されるスクリプトがあります。 IDとパスワードはローカルテキストファイルに含まれています。 Expectスクリプトはこれらのファイルを変数として読み込み、SFTPサーバーに渡します。

私が経験している問題は、私たちが提供するパスワードが複雑で、特殊文字($\、!)などが含まれていることです。たとえば、パスワードがpass $ wordの場合、$はリテラルではなく特殊文字として渡されます。これは変数(複数のサイトとID)を介して渡されます。

「$pw」は$pwをサーバーに直接渡すため使用できませんが、「$pw」を使用すると特殊文字を送信します。パスワードをそのまま渡すために必要です。

これまでは手動で(例:pass \ $ word)エスケープしてきましたが、これは面倒なのでスクリプト形式で処理したいと思います。

スクリプトは次のとおりです。 (無実の人々を保護するために名前と場所が変更されました。)

#!/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 $un@$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または他の手段を介してエスケープ文字をエスケープすることを意味します。エスケープ文字自体は特別でAで終わることができるからです。サイクル。

助けてくれてありがとう!

ベストアンサー1

値を環境変数に渡します。また、コマンドインジェクションの脆弱性を防ぎ、ps出力にパスワードを表示します。

#! /bin/sh -

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 -Fe "$1" upload*|cut -d : -f1)

export home un sl pw

user=$1 /usr/bin/expect -c '
spawn /usr/bin/sftp -o KexDHMin=1024 $env(un)@$env(sl).mysteriouslocation.com
set timeout -1
expect *Authentication
expect Password*
send $env(pw)\r
expect sftp*
send "mput /$env(home)/$env(user)/transfer/*\r"
expect sftp*
send ls\r
expect sftp*
send bye\r
expect eof
exit'

sftp変数に実行コマンドを次のように見せるテキストが含まれている場合は、まだコマンドインジェクションの脆弱性である可能性があります!reboot。)

おすすめ記事