Насчет сценария ожидания, который будет использовать удаление файла на SFTP-сервере, пожалуйста, помогите мнеLinux

Ответить
Anonymous
 Насчет сценария ожидания, который будет использовать удаление файла на SFTP-сервере, пожалуйста, помогите мне

Сообщение Anonymous »

У меня вопрос по поводу того, что сценарий будет использовать удаление файла на SFTP-сервере.

Код: Выделить всё

#!/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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»