Ниже приведен мой сценарий оболочки для передачи ДВА файлов с использованием протокола scp.
Второй оператор scp показывает каталог исходного файла, содержащий пробелы (см. строку 10, где я добавил обратную косую черту в Badge\ Docs
, чтобы обозначить, что имя подпапки — «Badge Docs» (между двумя словами есть пробел).
# Copy revenue file
spawn scp ftpaccess@prod:/storage/revenue_bo/*Revenue.xlsx /data/revenue_bo/
expect "ftpaccess@prod's password:\n"
send "mypass\n"
send "exit\n"
expect eof
# Copy PO_REPORT.xlsx
cd /data/storage/exp/Badge_Docs/
spawn scp -T ftpaccess@prod:"/storage/data/Badge\ Docs/PO_REPORT.xlsx" /data/storage/exp/Badge_Docs/
expect "ftpaccess@prod's password:\n"
send "mypass\n"
send "exit\n"
interact
Скрипт работает, когда я запускаю его на Linux-сервере. И Revenue.xlsx
, и PO_REPORT.xlsx
подбираются/обновляются в соответствующей папке назначения.
[linux_prd]$ ./copy_data_reports.sh
spawn scp ftpaccess@prod:/storage/revenue_bo/*Revenue.xlsx /data/revenue_bo/
ftpaccess@prod's password:
Revenue.xlsx 100% 130KB 1.5MB/s 00:00
spawn scp -T ftpaccess@prod:"/storage/data//Badge Docs/PO_REPORT.xlsx" /data/storage/exp/Badge_Docs/
ftpaccess@prod's password:
PO_REPORT.xlsx 100% 20MB 27.5MB/s 00:00
Мы настроили copy_data_reports.sh
для запуска через Control-M. Control-M показывает, что этот скрипт выполняется без проблем, НО я вижу, что передается только «Revenue.xlsx», хотя the second file (PO_REPORT.xlsx) is not being transmitted.
подозреваю, что это может быть как-то связано с наличием пробела в исходном пути для второго оператор scp (путь к исходной папке для первого scp НЕ содержит пробелов, и это сработало).
Я обязательно заключил путь к исходной папке в двойные кавычки (")
И сохранил обратную косую черту, чтобы указать, что между путем есть пробел («Badge Docs»). Есть ли что-то, что я мог пропустить?
---- ОБНОВЛЕНИЕ. Ниже приведен файл журнала, созданный при запуске copy_data_reports.sh с помощью CONTROL-M:
spawn scp ftpaccess@prod:/storage/revenue_bo/*Revenue.xlsx /data/revenue_bo/
ftpaccess@prod's password:
Revenue.xlsx 100% 130KB 1.5MB/s 00:00
spawn scp -T ftpaccess@prod:"/storage/data//Badge Docs/PO_REPORT.xlsx" /data/storage/exp/Badge_Docs/
ftpaccess@prod's password:<eof>
Интересно, что задание сценария, запущенное CONTROL-M, внезапно завершается во время выполнения пароля для второго оператора scp.
Есть ли какая-либо разница между запуском сценария оболочки scp из Linux и тем же сценарием, запускаемым через CONTROL-M? Я не понимаю, почему задание, запущенное CONTROL-M, завершилось преждевременно, поскольку файл журнала запуска Control-M не показывает никаких сообщений об ошибках. Цените все полезные материалы.
Привет @CharlesDuffy, изначально я пропустил обратную косую черту в пути к файлу в двойных кавычках для второго оператора scp, но когда я выполнил его в Linux, это не удалось, поэтому мне пришлось снова вставить обратную косую черту, чтобы он работал. Все еще не мог понять, почему Control-M не выполняет второй оператор SCP в сценарии оболочки, КОГДА простое выполнение сценария оболочки в Linux будет работать.
Я обновил свой пост, включив в него содержимое файла журнала, сгенерированное заданием сценария scp, запущенным CONTROL-M - выполнение, похоже, внезапно остановилось при втором выполнении scp во время «ожидания» ввода пароля. Не уверен что происходит.
изменить interact
на expect eof
?
Спасибо @sexpect-ExpectforShells — замена «взаимодействовать» на «ожидать eof» РАБОТАЕТ с CONTROL-M! Интересно, что у Linux нет проблем с выполнением и передачей двух файлов в сценарии — похоже, что Control-M более строг, когда дело доходит до правильного кодирования ожидаемого сценария.
основная причина должна быть примерно такой: stackoverflow.com/q/60222681/900078
Кто-то предложил в разделе комментариев выше заменить «взаимодействовать» на «ожидать eof», и Control-M, похоже, это понравилось — наконец-то это сработало.
# Copy revenue file
spawn scp ftpaccess@prod:/storage/revenue_bo/*Revenue.xlsx /data/revenue_bo/
expect "ftpaccess@prod's password:\n"
send "mypass\n"
send "exit\n"
expect eof
# Copy PO_REPORT.xlsx
cd /data/storage/exp/Badge_Docs/
spawn scp -T ftpaccess@prod:"/storage/data/Badge\ Docs/PO_REPORT.xlsx" /data/storage/exp/Badge_Docs/
expect "ftpaccess@prod's password:\n"
send "mypass\n"
send "exit\n"
expect eof # replacing "interact" -> works with Control-M
Выходной журнал, созданный при выполнении сценария Control-M, теперь показывает успешную передачу PO_REPORT.xls:
spawn scp ftpaccess@prod:/storage/revenue_bo/*Revenue.xlsx /data/revenue_bo/
ftpaccess@prod's password:
Revenue.xlsx 100% 130KB 1.5MB/s 00:00
spawn scp -T ftpaccess@prod:"/storage/data//Badge Docs/PO_REPORT.xlsx" /data/storage/exp/Badge_Docs/
ftpaccess@prod's password:
PO_REPORT.xlsx 100% 20MB 27.5MB/s 00:00
С опозданием осознаю также, что, глядя на последнюю строку файла журнала, который я разместил выше, о задании, запускаемом CONTROL-M, показывающем ftpaccess@prod's password:<eof>
, уже давая подсказку, что мне следовало использовать expect eof
во втором операторе «spawn scp», как я это сделал в первый оператор «spawn scp». Урок выучен.
Обратная косая черта необходима, когда ваш контекст не заключен в кавычки. Когда вы находитесь в цитируемом контексте, пробел уже помечен как буквальный, а не синтаксический; обратная косая черта неуместна. (В одинарных кавычках это справедливо для всех символов без исключения; в двойных кавычках есть некоторые символы, которые по-прежнему имеют особое значение, даже если они не заключены в кавычки, например
$
или"
, но среди них все еще нет пробела).