1

背景:特殊文字のパスワードのテストに使用されるexpectスクリプトを作成しようとしています。実行に失敗したテストケースの1つは、パスワードの前に特殊文字「-」を付けることです。例: "-foo"注:sshキーは問題外であると想定します注:bashシェルが私が使用しているシェルであると想定します

私のコード:これは私の接続機能であり、ウィキペディアの厚意によります:

    proc connect {passwd} {
      expect {
        "yes/no" {
          send "yes\r"
        }
      }
      expect {
        "?assword:" {
            send "$passwd\r"
            expect {
              "sftp*" {
                return 0
              }
            }
        }
      }
      # timed out
      return 1

}

set user [lindex $argv 0]
set passwd [lindex $argv 1]
set host [lindex $argv 2]

spawn sftp $user@$host

puts '$passwd'\r
set rez [connect $passwd]

私のbashスクリプトには、次のものがあります。

passwd="-foo"
./sftp_test $user $passwd $host

私が試したこと:問題は、シェルが変数を展開しているため、コマンドがsend -fooとして解釈され、sendに無効なパスワードがあることを示していることです。

これに対する一般的な解決策として一重引用符を使用しようとしましたが、パスワードが拒否されています(一重引用符が保持されていると思われます)。'$ passwd'"\r"を送信します

質問:sendコマンドでパスワードをエスケープして、パスワード内の特殊文字のすべての順列($fooとf$ ooと-fooなど)に使用できるようにする方法はありますか?

4

2 に答える 2

1

あなたがする必要があるのはこれです:

send -- "$passwd\r"

--、ダッシュで始まる後続の単語がsendコマンドのオプションとして扱われないことを示します。

これを習慣にして、すべての送信コマンドに対して実行することをお勧めします。

于 2013-02-05T22:58:34.080 に答える
1

エスケープする文字が$の場合はどうなりますか

次のコマンドを送信する必要がありますが、それを変数として扱い続けることを期待しています。

    W $$RBLDSTS^VPRJ()

だから私が使うとき:

    send "W $$RBLDSTS^VPRJ()\r";

私は得る:

    can't read "RBLDSTS": no such variable

この場合、コマンドを変数に割り当て、$を\でエスケープする必要がありました。

    set command \$\$RBLDSTS^VPRJ()
    send "W $command\r";
于 2013-12-19T19:19:54.517 に答える