Команда scp, която е работила в скрипт години наред, може да се провали на съвременен клиент с грешка в пътя, която няма нищо общо с тунела. VPN пренесе байтовете; клиентът поиска от сървъра име, което сървърът не можа да разреши. Съвременният OpenSSH scp прехвърля през SFTP по подразбиране, а SFTP не прави разгръщане в стил шел, както правеше старият протокол. Проследяването на командата от собствения ви акаунт навън показва къде пътят всъщност се интерпретира.

Започнете от акаунта, после от директорията, в която може да пише

Двоеточието разделя две пространства от имена и само лявата страна принадлежи на машината, на която пишете. Всичко след него се разрешава от сървъра, под акаунта, с който сте се удостоверили, в рамките на какъвто изглед на файловата система има този акаунт. Потвърдете и двете, преди да съставите командата, защото път, който е правилен за администратора, не е автоматично правилен за потребителя на прехвърлянето. Тази разлика е източникът на повечето грешки с права, които изглеждат като мрежови повреди.

Попитайте сървъра за неговия собствен изглед: ssh [email protected] pwd и ssh [email protected] ls -ld /srv/archive. Ако втората команда съобщи отказ в достъпа, тунелът е наред и пътят е неизползваем за този акаунт. Поправете собствеността или изберете друга дестинация, вместо да разширявате правата, за да може прехвърлянето да продължи.

Ограничена конфигурация на SFTP може да представи chroot като корен на файловата система. В този изглед абсолютният път е абсолютен в рамките на chroot, което не е същото място, което администраторът вижда на хоста.

Назовавайте двете страни на двоеточието явно

Качването трябва да посочи отдалеченото име на файла, вместо да предполага, че локалното базово име ще бъде приемливо от другата страна.

scp q3-invoice.csv [email protected]:/home/transfer/drop/q3-invoice.csv

Свалянето трябва да посочи локалната дестинация по точно същата причина. Двете пространства от имена са независими и скрипт, който предполага, че съвпадат, се чупи първия път, когато отдалеченото дърво използва различно оформление.

scp [email protected]:/srv/archive/2026-q3.csv ./2026-q3.csv

Избягвайте ~otheruser в поддържан скрипт. Разгръщането на домашната директория на друг акаунт беше функция на отдалечения шел и SFTP сървърът може да не реализира разширението, което я емулира. Напишете абсолютния път, който акаунтът наистина може да отвори, и ограждайте локалните пътища с интервали в кавички, вместо да копирате слоеве кавички, написани за шел на сървъра.

Знайте кой протокол всъщност използва вашият scp

От OpenSSH 9.0 клиентът използва SFTP по подразбиране и дистрибуциите приемат или пренасят това поведение по свой график. Низът за версията ви казва какво възнамерява клиентът, но доставчикова компилация може да се различава от upstream, затова проверете клиента, който наистина изпълнявате: ssh -V.

Двата протокола разрешават имената различно. Старият SCP моли отдалечения потребителски шел да разгърне пътя, така че шаблоните и тилдите се обработват от този шел по неговите собствени правила. SFTP вместо това издава операции за прехвърляне на файлове, така че шаблонът или се разгръща от клиента, или не се разгръща изобщо. И двата пътуват в SSH до същата машина, поради което един хост може да се държи различно при два клиента.

scp -v отпечатва подсистемата, която заявява, а редът за подсистема sftp потвърждава, че съвременният път се използва. scp -O налага стария протокол там, където е поддържан и наистина необходим, и връща със себе си собствените си правила за кавички. Това не е VPN опция, не е начин да включите нещо на сървъра и не е причина да разхлабите проверката на ключа на хоста.

Тествайте пътя, преди скриптът да зависи от него

Проблем с пътя изниква в най-лошия възможен момент, в автоматизирана задача през нощта без никой да гледа. Докажете дестинацията първо с малък файл и точния акаунт, който задачата използва, и дръжте тестовата команда до дефиницията на задачата. Ако тестът се нуждае от различен акаунт или различна директория, задачата също ще се нуждае.

Проверете и сървърната страна. grep -i subsystem /etc/ssh/sshd_config показва дали е конфигурирана подсистема SFTP, а sftp -b /dev/null [email protected] завършва успешно само когато тази подсистема отговори. Хост, който приема SSH влизания, но няма подсистема, се проваля при всяко съвременно прехвърляне, докато изглежда напълно здрав при тест за влизане.

Запишете версията на клиента, използвания протокол и абсолютния отдалечен път в бележките на задачата. Когато следващото обновяване промени подразбиране, тази бележка е разликата между петминутна поправка и следобед на догадки.

Подобни статии