scp przez SFTP: zapis zdalnych ścieżek, które naprawdę się rozwiązują
Współczesny scp przesyła przez SFTP, więc rozwinięcie tyldy i symbole wieloznaczne zachowują się inaczej. Zapisuj jawne ścieżki serwera i świadomie wybieraj protokół.
Polecenie scp, które przez lata działało w skrypcie, może zawieść na obecnym kliencie z błędem ścieżki, który nie ma nic wspólnego z tunelem. VPN przeniósł bajty; klient poprosił serwer o nazwę, której serwer nie potrafił rozwiązać. Obecny OpenSSH scp domyślnie przesyła przez SFTP, a SFTP nie wykonuje rozwinięcia w stylu powłoki jak stary protokół. Prześledzenie polecenia od własnego konta na zewnątrz pokazuje, gdzie ścieżka jest naprawdę interpretowana.
Zacznij od konta, a potem od katalogu, do którego może pisać
Dwukropek rozdziela dwie przestrzenie nazw, a tylko lewa strona należy do maszyny, na której piszesz. Wszystko po nim rozwiązuje serwer, pod kontem, którym się uwierzytelniłeś, w obrębie tego widoku systemu plików, który ma to konto. Potwierdź oba przed złożeniem polecenia, ponieważ ścieżka poprawna dla administratora nie jest automatycznie poprawna dla użytkownika transferu. Ta różnica jest źródłem większości błędów uprawnień, które wyglądają jak awarie sieci.
Zapytaj serwer o jego własny widok: ssh [email protected] pwd i ssh [email protected] ls -ld /srv/archive. Jeśli drugie polecenie zgłasza odmowę dostępu, tunel jest w porządku, a ścieżka jest bezużyteczna dla tego konta. Popraw własność lub wybierz inne miejsce docelowe, zamiast rozszerzać uprawnienia, aby transfer mógł trwać.
Ograniczona konfiguracja SFTP może przedstawić chroot jako katalog główny systemu plików. W tym widoku ścieżka bezwzględna jest bezwzględna wewnątrz chroot, co nie jest tym samym miejscem, które administrator widzi na hoście.
Nazwij wyraźnie obie strony dwukropka
Wysyłanie powinno podać zdalną nazwę pliku, zamiast zakładać, że lokalna nazwa podstawowa będzie akceptowalna po drugiej stronie.
scp q3-invoice.csv [email protected]:/home/transfer/drop/q3-invoice.csvPobieranie powinno podać lokalne miejsce docelowe z dokładnie tego samego powodu. Obie przestrzenie nazw są niezależne, a skrypt, który zakłada ich zgodność, psuje się za pierwszym razem, gdy zdalne drzewo używa innego układu.
scp [email protected]:/srv/archive/2026-q3.csv ./2026-q3.csvUnikaj ~otheruser w utrzymywanym skrypcie. Rozwijanie katalogu domowego innego konta było funkcją zdalnej powłoki, a serwer SFTP może nie implementować rozszerzenia, które to emuluje. Zapisz ścieżkę bezwzględną, którą konto naprawdę może otworzyć, a lokalne ścieżki ze spacjami ujmij w cudzysłowy, zamiast kopiować warstwy cudzysłowów napisane dla powłoki na serwerze.
Wiedz, którego protokołu naprawdę używa twój scp
Od OpenSSH 9.0 klient domyślnie używa SFTP, a dystrybucje przyjmują to zachowanie lub przenoszą je wstecz według własnego harmonogramu. Ciąg wersji mówi, co zamierza klient, ale kompilacja dostawcy może różnić się od upstream, więc sprawdź klienta, którego naprawdę uruchamiasz: ssh -V.
Oba protokoły rozwiązują nazwy inaczej. Stary SCP prosi zdalną powłokę użytkownika o rozwinięcie ścieżki, więc symbole wieloznaczne i tyldy są obsługiwane przez tę powłokę według jej własnych zasad. SFTP zamiast tego wydaje operacje transferu plików, więc symbol wieloznaczny jest albo rozwijany przez klienta, albo wcale. Oba podróżują wewnątrz SSH do tej samej maszyny, dlatego jeden host może zachowywać się inaczej pod dwoma klientami.
scp -v wypisuje podsystem, o który prosi, a linia podsystemu sftp potwierdza, że używana jest nowoczesna ścieżka. scp -O wymusza stary protokół tam, gdzie jest obsługiwany i naprawdę potrzebny, i przynosi ze sobą własne zasady cytowania. To nie opcja VPN, nie sposób na włączenie czegokolwiek na serwerze i nie powód, by poluzować sprawdzanie klucza hosta.
Przetestuj ścieżkę, zanim skrypt na niej polega
Problem ze ścieżką ujawnia się w najgorszym możliwym momencie, w zautomatyzowanym zadaniu w nocy, gdy nikt nie patrzy. Najpierw udowodnij miejsce docelowe małym plikiem i dokładnym kontem, którego używa zadanie, i trzymaj to polecenie testowe obok definicji zadania. Jeśli test potrzebuje innego konta lub innego katalogu, zadanie też będzie go potrzebować.
Sprawdź także stronę serwera. grep -i subsystem /etc/ssh/sshd_config pokazuje, czy skonfigurowano podsystem SFTP, a sftp -b /dev/null [email protected] kończy się sukcesem tylko wtedy, gdy ten podsystem odpowiada. Host, który przyjmuje logowania SSH, ale nie ma podsystemu, zawodzi przy każdym nowoczesnym transferze, choć w teście logowania wygląda całkowicie zdrowo.
Zapisz wersję klienta, używany protokół i bezwzględną ścieżkę zdalną w notatkach zadania. Gdy następna aktualizacja zmieni wartość domyślną, ta notatka będzie różnicą między pięciominutową poprawką a popołudniem zgadywania.