Код: Выделить всё
#!/usr/bin/expect
set sftp_host [lindex $argv 0]
set sftp_user [lindex $argv 1]
set sftp_password [lindex $argv 2]
set target_dir [lindex $argv 3]
set log_file [lindex $argv 4]
proc log_message {message log_file} {
exec echo "[exec date "+%Y-%m-%d %H:%M:%S"] - $message" >> $log_file
}
log_user 0
exp_internal 0
spawn sftp $sftp_user@$sftp_host
expect {
-re ".*password:.*" {
send "$sftp_password\r"
}
timeout {
log_message "Timeout during login" $log_file
exit 1
}
}
expect {
-re ".*sftp.*>" {
send "cd $target_dir\r"
expect {
-re ".*Couldn't canonicalize: No such file or directory.*" {
log_message "Directory not found: $target_dir, skipping to next" $log_file
send "bye\r"
exit 0
}
-re ".*sftp.*>" {
send "ls -l\r"
}
}
}
}
if {[llength $expect_out(buffer)] == 0} {
log_message "No output from SFTP command for $target_dir" $log_file
exit 0
}
set dir_stack [list $target_dir]
while {[llength $dir_stack] > 0} {
set current_dir [lindex $dir_stack end]
log_message "Current directory: $current_dir" $log_file
set dir_stack [lrange $dir_stack 0 end-1]
#log_message "Remaining stack: $dir_stack" $log_file
expect {
-re ".*sftp.*>" {
log_message "Sending command: cd $current_dir" $log_file
send "cd $current_dir\r"
expect {
-re ".*sftp.*>" { ;
log_message "Successfully changed directory to: $current_dir" $log_file
send "ls -l\r"
expect {
-re ".*sftp.*>" {
set captured_output $expect_out(buffer)
log_message "First captured output: $captured_output" $log_file
regsub -all {\r} $captured_output "" clean_output
set output_lines [split $clean_output "\n"]
set clean_lines [lrange $output_lines 1 end]
set final_output [join $clean_lines "\n"]
log_message "Final captured output: $final_output" $log_file
set skip_delete 0
foreach line [split $final_output "\n"] {
if {[regexp {^[d-]} $line]} {
set entry [lindex [split $line] end]
set type [string index $line 0]
log_message "entry: $entry" $log_file
log_message "type: $type" $log_file
if {$type == "d"} {
set sub_dir "$current_dir/$entry"
log_message "Found subdirectory: $sub_dir" $log_file
lappend dir_stack $sub_dir
log_message "Remaining stack in foreach: $dir_stack" $log_file
set skip_delete 1
} else {
log_message "Found file: $entry in $current_dir" $log_file
send "rm $entry\r"
expect {
-re ".*sftp.*>" {}
timeout {
log_message "Failed to delete file: $entry" $log_file
}
}
}
}
}
if {$skip_delete == 0} {
log_message "Deleting directory: $current_dir" $log_file
send "cd [file dirname $current_dir]\r"
expect -re ".*sftp.*>"
send "rmdir [file tail $current_dir]\r"
expect {
-re ".*sftp.*>" {
log_message "Successfully deleted directory: $current_dir" $log_file
}
timeout {
log_message "Failed to delete directory: $current_dir" $log_file
}
}
}
}
}
}
}
}
}
}
send "bye\r"
log_message "Session closed" $log_file
exit 0
введите здесь описание изображения
Я пытаюсь создать сценарий Expect для выполнения следующих операций для каталога структура:
Перемещайтесь по структуре каталогов рекурсивно или с помощью цикла while.
Для самого глубокого каталога удалите все элементы внутри него.
После удаления всех элементов удалите сам каталог.
Перейдите в родительский каталог и повторите процесс.
При тестировании сценария я заметил, что он успешно идентифицирует подкаталоги, но не может выполнить последующую логику для cd и ls после идентификации подкаталога. Вместо этого он ожидает неопределенное время, прежде чем сеанс в конечном итоге истечет.
В чем может быть причина этой проблемы и как ее можно решить?
Подробнее здесь: https://stackoverflow.com/questions/793 ... se-help-me
Мобильная версия