Ошибка Control-M scp с именем пути к файлу, содержащим пробелы

Ниже приведен мой сценарий оболочки для передачи ДВА файлов с использованием протокола scp. Второй оператор scp показывает каталог исходного файла, содержащий пробелы (см. строку 10, где я добавил обратную косую черту в Badge\ Docs, чтобы обозначить, что имя подпапки — «Badge Docs» (между двумя словами есть пробел).

copy_data_reports.sh
# 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 - работает
[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 не показывает никаких сообщений об ошибках. Цените все полезные материалы.

Обратная косая черта необходима, когда ваш контекст не заключен в кавычки. Когда вы находитесь в цитируемом контексте, пробел уже помечен как буквальный, а не синтаксический; обратная косая черта неуместна. (В одинарных кавычках это справедливо для всех символов без исключения; в двойных кавычках есть некоторые символы, которые по-прежнему имеют особое значение, даже если они не заключены в кавычки, например $ или ", но среди них все еще нет пробела).

Charles Duffy 04.04.2024 21:45

Привет @CharlesDuffy, изначально я пропустил обратную косую черту в пути к файлу в двойных кавычках для второго оператора scp, но когда я выполнил его в Linux, это не удалось, поэтому мне пришлось снова вставить обратную косую черту, чтобы он работал. Все еще не мог понять, почему Control-M не выполняет второй оператор SCP в сценарии оболочки, КОГДА простое выполнение сценария оболочки в Linux будет работать.

punsoca 05.04.2024 01:14

Я обновил свой пост, включив в него содержимое файла журнала, сгенерированное заданием сценария scp, запущенным CONTROL-M - выполнение, похоже, внезапно остановилось при втором выполнении scp во время «ожидания» ввода пароля. Не уверен что происходит.

punsoca 05.04.2024 03:37

изменить interact на expect eof?

sexpect - Expect for Shells 05.04.2024 14:53

Спасибо @sexpect-ExpectforShells — замена «взаимодействовать» на «ожидать eof» РАБОТАЕТ с CONTROL-M! Интересно, что у Linux нет проблем с выполнением и передачей двух файлов в сценарии — похоже, что Control-M более строг, когда дело доходит до правильного кодирования ожидаемого сценария.

punsoca 05.04.2024 22:39

основная причина должна быть примерно такой: stackoverflow.com/q/60222681/900078

sexpect - Expect for Shells 06.04.2024 16:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кто-то предложил в разделе комментариев выше заменить «взаимодействовать» на «ожидать 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». Урок выучен.

Другие вопросы по теме