Создание внешнего набора команд в ожидании SFTP - PullRequest
2 голосов
/ 09 ноября 2011

В настоящее время у меня есть некоторый код, который выполняет SFTP с помощью wait / tcl.Это примерно так:

send -i $ftpid "$cmd\r"
expect {
    -i $ftpid -re "\n5\[0-9]\[0-9] \[^bB].*\nsftp> " {
        set errorCode 149
        set errorInfo "SFTP command error on $cmd."
        return 1
    }
    -i $ftpid "452 Err.*\nsftp> " {
        set errorCode 149
        set errorInfo "SFTP 452 command error on $cmd."
        return 1
    }
    -i $ftpid "Invalid command*\nsftp> " {
        set errorCode 149
        set errorInfo "SFTP invalid command on $cmd."
        return 1
    }
    -i $ftpid -re "\n2\[0-9]\[0-9] .*\nsftp> " {
        return 0
    }
}

Иногда я сталкиваюсь с ситуациями, когда на FTP-сервере есть коды возврата или сообщения, которые не соответствуют тому, что уже заполнено в базе кода.Вместо того, чтобы изменять основной код для этих целей, я хотел бы иметь внешний файл (например, returncodes.tbl), в котором я могу получить список сообщений, таких как:

552 Invalid Return*\nsftp>;<errorCode>;<errorInfo>
400 Some Error*\nsftp>;<errorCode>;<errorInfo>
...

Так что он будет интерпретироватьсяэто в ожидаемом коде вроде:

-i $ftpid "552 Invalid Return*\nsftp>" {
    set errorCode <errorCode>
    set errorInfo "<errorInfo>"
    return 1
}
-i $ftpid "400 Some Error*\nsftp>" {
    set errorCode <errorCode>
    set errorInfo "<errorInfo>"
    return 1
}

Я знаю, как читать внешний файл и разбивать переменные вверх (открывать / читать / разбивать).Однако я не могу понять, как создать цикл, необходимый внутри оператора ожидаемого.Надеялся, что у кого-то есть идея, как этого добиться.

1 Ответ

2 голосов
/ 10 ноября 2011

Я думаю, я бы подошел к этому, построив регистр в конце существующего оператора ожидаемого, который может перехватить шаблон и проанализировать его с помощью регулярного выражения. Тогда вам просто нужен цикл for, чтобы проползти по файлу и поймать совпадение.

Возможно, вам придется поиграть с регулярным выражением, чтобы заставить его работать правильно - отправка \ r во второй раз выровняет ожидаемый буфер, чтобы вы могли перехватить код ошибки.

(я не знаю, как вы загрузили файл, поэтому сейчас я предполагаю, что это плоский список, разделенный на "\ n" и ";")

expect {
     #your existing expect code here

    -i $ftpid -re "\[0-9]{3}.*\\*\nsftp>" {
        send -i $ftpid "\r"
        expect -i $ftpid "sftp>"
        regexp "^(.*\nsftp>)\nsftp>" $expect_out(buffer) garbage errorMsg
        set index 0
        foreach element $filelistyouloaded {
            if { $element == $errorMsg } { 
                 set errorCode $filelistyouloaded([expr $index + 1])
                 set errorInfo $filelistyouloaded([expr $index + 2])
                 return 1
            }
            incr index
        }
    }        

}
...