Я підключаюся до віддаленої системи через sftp, використовуючи очікування. Я хочу отримати останню дату змінення файлу my.csv в змінну в очікуваному скрипті
Нижче мій код:
spawn sftp -o Port=$port $user@$host
expect "Password:"
send "$passwordr";
expect "sftp> "
set file_time [exec ls -la my.csv| awk {{ print $6$7$8}}]
send "echo $file_timer";
expect "sftp> "
send "quitr";
expect eof
Відповіді:
2 для відповіді № 1Добре, я подивився на це важче. Я бачу кілька помилок:
- Коли ви виконуєте ls -la, ви робите це на своємулокальний комп'ютер ... не на віддаленому сервері SFTP. Якщо ви хочете виконати це на sftp-сервері, вам потрібно використовувати "відправити", щоб його було надіслано за породженим сеансом.
- Якщо ви мали використовувати "send", то ви не зможете запустити його через awk, оскільки ls буде командою sftp server, і не існує awk на інтерфейсі сервера sftp.
- Нарешті, я не думаю, що надсилання відлуння ехо на сформований sftp-сеанс - це те, що ви хочете. Я гадаю, що ви хочете, щоб він відображався на локальній машині. Отже команда TCL "виставляє" те, що ви хочете там.
Отже, що вам потрібно зробити, це відправити команду ls до sftp-сервера, а потім скористатися очікуванням з регулярним виразом, щоб вирвати мітку часу з повернутого виводу.
Там, ймовірно, більш елегантні способи шкіри цекішка, але припускаючи, що протягом кількох місяців англійська мова і що ваше ім'я файлу завжди ідентичне (my.csv), тут є робочий варіант (на TCL 8.4.13) цього сценарію:
spawn sftp user@host
expect "assword:"
send "mypasswordr";
expect "sftp>"
send "ls -la my.csvr"
expect -re "[-rwx]{10}.*((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec).*)my.csv"
set timestamp $expect_out(1,string)
expect "sftp>"
send "quitr";
expect eof
puts "Timestamp is: $timestamp"
Я залишу контроль над помилками, обробку тайм-аутів і все те, що добре для вас. :-)
Дайте мені знати, якщо це працює у вашому середовищі.