6

私は Bash スクリプトを作成し、Expect を使用して sftp を実行しています。今度は、Expect ブロックで、条件ステートメントで Bash 変数にアクセスしたいと考えています。しかし、私はそうすることができません。どうすればこれを行うことができますか?

また、このスクリプトの実行は C プログラムから制御され、出力をログ ファイルにリダイレクトします (これも動的です)。それを行って、標準出力のすべての出力を抑制できますか。

コードは次のとおりです。

!/usr/bin/bash
host=$1
user=$2
pass=$3
action=$4
path=$5
echo "Starting...."

function doAction {

strAction="\""$action"\""
echo $strAction

/usr/bin/expect <<EOF > logfile.txt
**set bashaction $strAction**
spawn sftp $user@$host

expect "password:"
send "$pass\r"
expect"sftp>"
send "cd $path\r"
**if {$bashaction == "TEST"} {**
  expect "sftp>"
  send "prompt\r"
}

expect "sftp>"
send <sftp command>
expect "sftp>"
send_user "quit\n"

exit
  EOF
}

doAction
echo "DONE....."

1.の場合、代わりにExpectスクリプトを使用すると機能しました。ロギングの問題については、使用log_user 0してlog_file -a <file>助けました。

4

3 に答える 3

14

Bash を使用する必要はありません。Expectはそれをすべて処理できます:

#!/usr/bin/expect

set host [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set action [lindex $argv 3]
set path [lindex $argv 4]
puts "Starting...."

puts "\"$action\""
spawn sftp $user@$host

expect "password:"
send "$pass\r"

expect"sftp>"
send "cd $path\r"

if {$action == "TEST"} {
    # Do something
} else {
    # Do something else
}

expect "sftp>"
send_user "quit\r"

puts "DONE....."

Bash 由来の Tcl/Expect 構文は少し奇妙ですが、上記のスケルトンを展開しても問題はありません。

于 2012-06-21T05:17:06.960 に答える
4

TCL および Expect からの環境変数へのアクセス

この Expect スクリプトを別のプロセスから呼び出しているため、環境変数を利用できます。たとえば、親プロセスがアクションを環境にエクスポートした場合、expect スクリプト内で次のようにその値にアクセスできます。

$::env(action)

Bash では、exportビルトインを使用してエクスポート用の変数をマークできます。例えば:

export action

C から Expect スクリプトを呼び出す方法がわからないので、変数が適切にエクスポートされていることを確認するのはあなた次第です。

標準出力へのロギングを無効にする

生成されたプロセスからの標準出力へのロギングを無効にするために、Expect は log_user コマンドを提供します。生成されたプロセスが stdout に書き込むのを防ぐことができますlog_user 0

expect(1) マニュアルには次のように書かれています。

デフォルトでは、send/expect ダイアログは stdout (開いている場合はログファイル) に記録されます。stdout へのロギングは、コマンド「log_user 0」で無効になり、「log_user 1」で再度有効になります。ログファイルへのロギングは変更されていません。

これは実際には標準出力を閉じません。これは通常、とにかく必要なものではありません。これを行うと、stdout に書き込むものはすべて、次のようなエラーをスローします。

can not find channel named "stdout"
    while executing
"puts hello"
    (file "/tmp/foo" line 8)
于 2012-06-24T16:25:02.573 に答える
0

標準出力への出力を抑制するには、使用できます

command here >/dev/null 2>/dev/null

ログ ファイルに書き込むには、同様のパイプ (>または>>)を使用するかtee、長いパイプの途中に出力を書き込む場合はコマンドを使用できます。

于 2012-06-21T06:09:25.603 に答える