Một lệnh scp đã chạy trong script nhiều năm có thể thất bại trên một máy khách hiện tại với lỗi đường dẫn không liên quan gì đến đường hầm. VPN đã chở các byte; máy khách yêu cầu máy chủ một cái tên mà máy chủ không thể phân giải. scp của OpenSSH hiện tại truyền qua SFTP theo mặc định, và SFTP không thực hiện mở rộng kiểu shell như giao thức cũ. Lần theo lệnh từ chính tài khoản của bạn ra ngoài cho thấy đường dẫn thực sự được diễn giải ở đâu.

Bắt đầu từ tài khoản, rồi từ thư mục mà nó có thể ghi

Dấu hai chấm tách hai không gian tên, và chỉ bên trái thuộc về máy bạn đang gõ. Mọi thứ sau đó được máy chủ phân giải, dưới tài khoản bạn đã xác thực, bên trong khung nhìn hệ thống tệp mà tài khoản đó có. Hãy xác nhận cả hai trước khi soạn lệnh, vì một đường dẫn đúng cho quản trị viên không tự động đúng cho người dùng truyền tải. Chính sự khác biệt đó là nguồn gốc của phần lớn lỗi quyền trông giống sự cố mạng.

Hỏi máy chủ về khung nhìn của chính nó: ssh [email protected] pwd và ssh [email protected] ls -ld /srv/archive. Nếu lệnh thứ hai báo bị từ chối quyền, đường hầm vẫn ổn và đường dẫn không dùng được cho tài khoản đó. Hãy sửa quyền sở hữu hoặc chọn đích khác thay vì mở rộng quyền để việc truyền tải có thể tiếp tục.

Một cấu hình SFTP hạn chế có thể trình bày chroot như gốc của hệ thống tệp. Bên trong khung nhìn đó, một đường dẫn tuyệt đối là tuyệt đối trong chroot, không phải cùng vị trí mà quản trị viên thấy trên máy chủ.

Gọi tên rõ ràng cả hai phía của dấu hai chấm

Một lần tải lên nên nêu tên tệp từ xa thay vì giả định tên cơ sở cục bộ sẽ được chấp nhận ở phía bên kia.

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

Một lần tải xuống nên nêu đích cục bộ vì đúng lý do đó. Hai không gian tên độc lập, và một script giả định chúng khớp nhau sẽ hỏng ngay lần đầu cây từ xa dùng bố cục khác.

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

Tránh ~otheruser trong một script được duy trì. Mở rộng thư mục nhà của tài khoản khác là tính năng của shell từ xa, và máy chủ SFTP có thể không triển khai phần mở rộng mô phỏng điều đó. Hãy viết đường dẫn tuyệt đối mà tài khoản thực sự mở được, và đặt đường dẫn cục bộ có dấu cách trong ngoặc kép thay vì sao chép các lớp ngoặc kép viết cho shell trên máy chủ.

Biết scp của bạn thực sự dùng giao thức nào

Từ OpenSSH 9.0, máy khách dùng SFTP theo mặc định, và các bản phân phối áp dụng hoặc chuyển ngược hành vi đó theo lịch riêng. Chuỗi phiên bản cho biết máy khách định làm gì, nhưng bản dựng của nhà cung cấp có thể khác upstream, vì vậy hãy kiểm tra máy khách bạn thực sự chạy: ssh -V.

Hai giao thức phân giải tên khác nhau. SCP cũ yêu cầu shell của người dùng từ xa mở rộng đường dẫn, nên ký tự đại diện và dấu ngã do shell đó xử lý theo quy tắc riêng. SFTP thay vào đó phát ra các thao tác truyền tệp, nên ký tự đại diện hoặc được máy khách mở rộng hoặc không được mở rộng chút nào. Cả hai đều đi trong SSH đến cùng một máy, đó là lý do một máy chủ có thể hành xử khác nhau dưới hai máy khách.

scp -v in ra hệ thống con mà nó yêu cầu, và một dòng hệ thống con sftp xác nhận đường dẫn hiện đại đang được dùng. scp -O buộc giao thức cũ ở nơi nó được hỗ trợ và thực sự cần thiết, và nó mang theo các quy tắc trích dẫn của riêng mình. Đây không phải tùy chọn VPN, không phải cách bật thứ gì trên máy chủ, và không phải lý do để nới lỏng việc kiểm tra khóa máy chủ.

Kiểm tra đường dẫn trước khi script phụ thuộc vào nó

Một vấn đề đường dẫn xuất hiện vào thời điểm tồi tệ nhất, trong một công việc tự động ban đêm không ai theo dõi. Hãy chứng minh đích trước bằng một tệp nhỏ và đúng tài khoản mà công việc dùng, và giữ lệnh kiểm tra đó bên cạnh định nghĩa công việc. Nếu bài kiểm tra cần tài khoản khác hoặc thư mục khác, công việc cũng sẽ cần.

Kiểm tra cả phía máy chủ. grep -i subsystem /etc/ssh/sshd_config cho biết hệ thống con SFTP có được cấu hình hay không, và sftp -b /dev/null [email protected] chỉ thoát thành công khi hệ thống con đó trả lời. Một máy chủ chấp nhận đăng nhập SSH nhưng không có hệ thống con sẽ thất bại ở mọi lần truyền hiện đại trong khi trông hoàn toàn khỏe mạnh trong một bài kiểm tra đăng nhập.

Ghi lại phiên bản máy khách, giao thức đang dùng và đường dẫn từ xa tuyệt đối trong ghi chú công việc. Khi bản nâng cấp tiếp theo thay đổi một giá trị mặc định, ghi chú đó chính là khác biệt giữa một bản sửa năm phút và cả buổi chiều đoán mò.

Bài viết liên quan