scp sobre SFTP: escribir rutas remotas que realmente se resolven
O scp moderno transfire por SFTP, así que a expansión de tilde e os comodíns compórtanse distinto. Escriba rutas de servidor explícitas e escolla o protocolo a propósito.
Un comando scp que funcionou nun script durante anos pode fallar nun cliente actual cun erro de ruta que non ten nada que ver co túnel. A VPN transportou os bytes; o cliente pediu ao servidor un nome que o servidor non puido resolver. O scp actual de OpenSSH transfire por SFTP de forma predeterminada, e SFTP non fai expansión ao estilo de shell como facía o protocolo antigo. Percorrer o comando desde a súa propia conta cara a fóra mostra onde se interpreta realmente a ruta.
Empece pola conta e despois polo directorio no que pode escribir
Os dous puntos separan dous espazos de nomes, e só o lado esquerdo pertence á máquina na que escribe. Todo o que segue resólveo o servidor, baixo a conta coa que se autenticou, dentro da vista do sistema de ficheiros que teña esa conta. Confirme ambos antes de compoñer o comando, porque unha ruta correcta para o administrador non é automaticamente correcta para o usuario da transferencia. Esa diferenza é a orixe da maioría dos erros de permisos que parecen fallos de rede.
Pregunte ao servidor pola súa propia vista: ssh [email protected] pwd e ssh [email protected] ls -ld /srv/archive. Se o segundo comando informa de permiso denegado, o túnel está ben e a ruta non é utilizábel para esa conta. Corrixa a propiedade ou escolla outro destino en lugar de ampliar permisos para que a transferencia poida continuar.
Unha configuración restrinxida de SFTP pode presentar un chroot como raíz do sistema de ficheiros. Dentro desa vista unha ruta absoluta é absoluta dentro do chroot, que non é a mesma localización que ve o administrador no host.
Nomee explicitamente ambos os lados dos dous puntos
Unha carga debería indicar o nome do ficheiro remoto en lugar de supor que o nome base local será aceptable no outro extremo.
scp q3-invoice.csv [email protected]:/home/transfer/drop/q3-invoice.csvUnha descarga debería indicar o destino local exactamente polo mesmo motivo. Os dous espazos de nomes son independentes, e un script que supón que coinciden rompe a primeira vez que a árbore remota usa unha disposición diferente.
scp [email protected]:/srv/archive/2026-q3.csv ./2026-q3.csvEvite ~otheruser nun script que se mantén. Expandir o directorio persoal doutra conta era unha función do shell remoto, e un servidor SFTP pode non implementar a extensión que o emula. Escriba a ruta absoluta que a conta pode abrir realmente, e entrecomille as rutas locais con espazos en lugar de copiar capas de comiñas escritas para un shell no servidor.
Saiba que protocolo usa realmente o seu scp
Desde OpenSSH 9.0 o cliente usa SFTP de forma predeterminada, e as distribucións adoptan ou retroportan ese comportamento segundo o seu propio calendario. A cadea de versión di que pretende o cliente, pero unha compilación de provedor pode diferir do upstream, así que comprobe o cliente que realmente executa: ssh -V.
Os dous protocolos resolven nomes de forma distinta. O SCP antigo pide ao shell do usuario remoto que expanda a ruta, así que os comodíns e as tildes xestiónaos ese shell coas súas propias regras. SFTP emite operacións de transferencia de ficheiros, así que un comodín ou o expande o cliente ou non se expande en absoluto. Ambos viaxan dentro de SSH á mesma máquina, e por iso un host pode comportarse distinto baixo dous clientes.
scp -v imprime o subsistema que solicita, e unha liña de subsistema sftp confirma que se usa a ruta moderna. scp -O forza o protocolo antigo onde está soportado e realmente se require, e trae consigo as súas propias regras de comiñas. Non é unha opción de VPN, non é unha forma de habilitar algo no servidor e non é unha razón para relaxar a comprobación da clave do host.
Probe a ruta antes de que o script dependa dela
Un problema de ruta aparece no peor momento posíbel, nunha tarefa automatizada de noite sen ninguén mirando. Demostre primeiro o destino cun ficheiro pequeno e a conta exacta que usa a tarefa, e manteña ese comando de proba xunto á definición da tarefa. Se a proba necesita outra conta ou outro directorio, a tarefa tamén necesitará un.
Comprobe tamén o lado do servidor. grep -i subsystem /etc/ssh/sshd_config mostra se hai un subsistema SFTP configurado, e sftp -b /dev/null [email protected] remata con éxito só cando ese subsistema responde. Un host que acepta inicios de sesión SSH pero non ten subsistema falla en toda transferencia moderna mentres parece perfectamente san nunha proba de inicio de sesión.
Anote a versión do cliente, o protocolo en uso e a ruta remota absoluta nas notas da tarefa. Cando a próxima actualización cambie un valor predeterminado, esa nota é a diferenza entre unha corrección de cinco minutos e unha tarde de conxecturas.