Вопрос или проблема
[перенесено с StackOverflow]
Мы используем PSFTP вместе с ppk-файлом и командным файлом для загрузки CSV на удаленный SFTP-хост. Это работало много (много) месяцев, и только недавно параметр -b стал выдавать ошибку “Fatal: unable to open”.
Детали:
Мы запускаем PSFTP.exe на Windows с использованием пакетного файла или командной строки.
Командный файл, который мы передаем с параметром -b, называется “sftpcommands.txt” и содержит следующие строки:
put "D:\batch\Upload.csv"
quit
Вот что мы запускаем из пакетного файла или командной строки:
psftp.exe -v -P 22 -i D:\batch\keyfile.ppk -b D:\batch\sftpcommands.txt [email protected]
Вот результат:
Ищем хост "SFTPHost.domain.com" для SSH соединения
Подключение к hostIP, порт 22
Наш клиент утверждает: SSH-2.0-PuTTY_Release_0.82
Подключено к hostIP (с localIP:35022)
Удаленная версия: SSH-2.0-AWS_SFTP_1.1
Используем SSH протокол версии 2
Нет доступного контекста безопасности GSSAPI
Выполняем ECDH обмен ключами с кривой nistp256, используя хэш SHA-256 (ускорено SHA-NI)
Отпечаток ключа хоста:
ssh-rsa 4096 SHA256:ajIF+и_другие_данные
Инициализация AES-256 SDCTR (ускорено AES-NI) для исходящей шифрации
Инициализация HMAC-SHA-256 (ускорено SHA-NI) для исходящего MAC алгоритма
Инициализация AES-256 SDCTR (ускорено AES-NI) для входящей шифрации
Инициализация HMAC-SHA-256 (ускорено SHA-NI) для входящего MAC алгоритма
Чтение файла ключа "D:\batch\keyfile.ppk"
Используем имя пользователя "OurUser".
Предложен открытый ключ
Предложение открытого ключа принято
Аутентификация с открытым ключом "информация_о_ключе"
Отправлена подпись открытого ключа
Доступ предоставлен
Открытие главного канала сессии
Удаленное отладочное сообщение: SFTP: ключевые опции: пересылка агентов пересылка портов pty user-rc пересылка x11
Удаленное отладочное сообщение: SFTP: ключевые опции: пересылка агентов пересылка портов pty user-rc пересылка x11
Открыт главный канал
Запуск оболочки/команды
Подключено к some-host.server.transfer.us-east-1.amazonaws.com
Удаленная рабочая директория —
Fatal: unable to open
Сессия отправлена со статусом 0
Главный канал сессии закрыт
Все каналы закрыты
Теперь странная часть: мы можем отказаться от синтаксиса скрипта -b и вручную ввести те же команды, которые находятся в файле sftpcommands.txt
, когда появляется приглашение psftp>
(например):
psftp.exe -v -P 22 -i D:\batch\keyfile.ppk [email protected]
Ищем хост "SFTPHost.domain.com" для SSH соединения
Подключение к hostIP, порт 22
Наш клиент утверждает: SSH-2.0-PuTTY_Release_0.82
Подключено к hostIP (с localIP:35022)
Удаленная версия: SSH-2.0-AWS_SFTP_1.1
Используем SSH протокол версии 2
Нет доступного контекста безопасности GSSAPI
Выполняем ECDH обмен ключами с кривой nistp256, используя хэш SHA-256 (ускорено SHA-NI)
Отпечаток ключа хоста:
ssh-rsa 4096 SHA256:ajIF+и_другие_данные
Инициализация AES-256 SDCTR (ускорено AES-NI) для исходящей шифрации
Инициализация HMAC-SHA-256 (ускорено SHA-NI) для исходящего MAC алгоритма
Инициализация AES-256 SDCTR (ускорено AES-NI) для входящей шифрации
Инициализация HMAC-SHA-256 (ускорено SHA-NI) для входящего MAC алгоритма
Чтение файла ключа "D:\batch\keyfile.ppk"
Используем имя пользователя "OurUser".
Предложен открытый ключ
Предложение открытого ключа принято
Аутентификация с открытым ключом "информация_о_ключе"
Отправлена подпись открытого ключа
Доступ предоставлен
Открытие главного канала сессии
Удаленное отладочное сообщение: SFTP: ключевые опции: пересылка агентов пересылка портов pty user-rc пересылка x11
Удаленное отладочное сообщение: SFTP: ключевые опции: пересылка агентов пересылка портов pty user-rc пересылка x11
Открыт главный канал
Запуск оболочки/команды
Подключено к some-host.server.transfer.us-east-1.amazonaws.com
Удаленная рабочая директория —
psftp> put "D:\batch\Upload.csv"
local:D:\batch\Upload.csv => remote:/Upload.csv
psftp> quit
Сессия отправлена со статусом 0
Главный канал сессии закрыт
Все каналы закрыты
Сторонняя организация переместила серверы SFTP несколько месяцев назад, но, насколько мне известно, параметр -b все равно работал на их новом хосте (однако я могу ошибаться).
Насколько мне известно, на нашей стороне ничего не изменилось, и, как указано, мы проводим A/B тестирование с тем же локальным пользователем Windows, теми же локальными файлами и т.д. Не должно быть никаких проблем с локальными правами, так как, опять же, мы используем Windows, и учетная запись, на которой выполнен вход, открывает/редактирует/доступна ко всем вовлеченным файлам. Я также пробовал перемещать параметр -b на разные позиции в строке команды.
Может ли эта ошибка быть вызвана настройками безопасности, конфигурации или формата на удаленном SFTP-сервере, вызывающими путаницу с файлом команд -b?
Примечание: у меня открыт тикет с операторами удаленного SFTP-хоста для выяснения проблемы, и если я найду решение, я размещу ответ здесь в случае, если это поможет кому-то еще, кто видит “Fatal: unable to open” на переключателе -b.
Ответ или решение
Теория
Проблема с параметром -b
в PSFTP, который выдает ошибку "Fatal: unable to open", может быть вызвана несколькими факторами, связанными как с локальной системой, так и с удаленным сервером SFTP. PSFTP, представляющее собой утилиту для передачи файлов по протоколу SFTP, полагается на корректное выполнение скриптовых команд, что определяется содержанием и доступностью файла команд. Ошибка указывает на то, что PSFTP не может открыть этот файл, и причины могут варьироваться от проблем с правами доступа в локальной системе до измененных настроек удаленного сервера.
Пример
В данной ситуации вы используете PSFTP для автоматизированной загрузки файлов на удаленный SFTP-сервер с помощью команды -b
, которая позволяет исполнять команды из указанного текстового файла, в данном случае sftpcommands.txt
. Эта схема работала на протяжении длительного времени, однако с недавних пор возникла ошибка. Воспроизвести команду вручную удалось без проблем, что указывает на успешное соединение и авторизацию на сервере, а также правильность команд в файле.
Применение
-
Проверка прав доступа и наличия файла:
- Убедитесь, что файл
sftpcommands.txt
находится по указанному путиD:\batch\
и доступен для чтения. Проверьте права доступа на этот файл, а также на директорию, в которой он находится.
- Убедитесь, что файл
-
Форматирование файла:
- Проверьте файл на наличие скрытых символов или ошибок в кодировке. Файл должен быть в текстовом формате без BOM (Byte Order Mark), лучше всего создавать его в текстовом редакторе без дополнительных форматирований.
-
Проверка пути к файлу:
- Убедитесь, что путь
D:\batch\sftpcommands.txt
указан правильно, особенно если выполняете скрипт от другого пользователя или с другой директории. Попробуйте использовать абсолютные пути без кавычек или проверяющиеся через различные средовые UAC/групповые политики.
- Убедитесь, что путь
-
Проверка PSFTP:
- Проверьте версию PSFTP. Возможно, обновление утилиты или откат до предыдущей версии поможет, если изменения в поведении связаны с обновлением программы.
-
Изменения на удаленном сервере:
- Хотя смена сервера на стороне SFTP-провайдера не должна влиять на локальное исполнение командного файла, изменения в конфигурации нового сервера (например, фильтрация команд или изменения в поддержке sftp-протоколов) потенциально могут вызвать такие проблемы. Убедитесь в том, что на новом сервере нет настройкой, которые влияют на чтение батч-файлов.
-
Журналирование и логирование:
- Используйте более подробное логирование, чтобы получше разобраться в проблеме. Добавьте опции
-v
для детализированного вывода, чтобы выявить дополнительные строки журнала, которые могут указать на точную причину сбоя.
- Используйте более подробное логирование, чтобы получше разобраться в проблеме. Добавьте опции
-
Контекстные ошибки:
- Проверьте системный лог Windows на наличие ошибок или предупреждений, связанных с выполнением скриптов или доступностью директории.
-
Обратная связь с провайдером:
- Поддерживайте контакт с администраторами удаленного сервера о возможных изменениях в их конфигурации. Они могли внедрить новые политики безопасности, которые влияют на работу с командными файлами.
Заключение
Каждый из перечисленных шагов может дать ключ к пониманию проблемы. Если локальные проверки не выявят проблемы, вполне возможно, что изменения на стороне провайдера вносят ограничения, которые необходимо обсудить и пересмотреть. Ошибки такого рода могут требовать как локальной диагностики, так и взаимодействия с поставщиками услуг для полной их локализации и устранения.