web-dev-qa-db-ja.com

expectコマンドからログに出力をリダイレクトする方法

次のコードがあります。 scpがすべてを正常にコピーしたかどうかを確認するために、expectの出力をログファイルにリダイレクトするにはどうすればよいですか。このコードの一部はバックグラウンドで実行されます。

    export L_SRC_SID L_SID MOUNT_POINT SERVICE_PASS APP_SERVER_1 SRC_MOUNT_POINT

    #And now transfer the file over
    /usr/bin/expect -c '
    set timeout -1
    cd /$env(MOUNT_POINT)/$env(L_SID)/apps
    spawn scp -pr apps$env(L_SRC_SID)@$env(APP_SERVER_1):/$env(SRC_MOUNT_POINT)/$env(L_SRC_SID)/apps/* .
    expect {
            yes/no { send yes\r ; exp_continue }
            password: { send $env(SERVICE_PASS)\r }
    }
    expect eof
    '
2
Tapan Saha

expectには奇妙な名前の_log_file_プロシージャがあり、(drumroll ...)ファイルにログを記録するので、通常は単に

_#!/usr/bin/env expect
set timeout -1
log_file blah.log
...
_

tCLコード内。詳細については、expect(1)のmanページの_log_file_(および_log_user_)も参照してください。

3
thrig

expectの呼び出しの出力をリダイレクトするだけです。

/usr/bin/expect -c '
set timeout -1
cd /$env(MOUNT_POINT)/$env(L_SID)/apps
spawn scp -pr apps$env(L_SRC_SID)@$env(APP_SERVER_1):/$env(SRC_MOUNT_POINT)/$env(L_SRC_SID)/apps/* .
expect {
        yes/no { send yes\r ; exp_continue }
        password: { send $env(SERVICE_PASS)\r }
}
expect eof
' >> /path/to/logfile 2>> /path/to/errorfile

または、scpの出力のみをキャプチャする場合は、リダイレクトits出力のみ:

/usr/bin/expect -c '
set timeout -1
cd /$env(MOUNT_POINT)/$env(L_SID)/apps
spawn scp -pr apps$env(L_SRC_SID)@$env(APP_SERVER_1):/$env(SRC_MOUNT_POINT)/$env(L_SRC_SID)/apps/* . >> /path/to/logfile 2>> /path/to/errorfile
expect {
        yes/no { send yes\r ; exp_continue }
        password: { send $env(SERVICE_PASS)\r }
}
expect eof
'
2
DopeGhoti