web-dev-qa-db-fra.com

SCP: Erreur: nom de fichier inattendu:

Un SCP que j'utilise depuis longtemps pour télécharger des fichiers a soudainement cessé de fonctionner. J'ai couru le script il y a 12 heures et cela a bien fonctionné, mais s'est soudainement arrêté.

La commande en question permettait de télécharger le répertoire actuel dans un dossier distant:

#!/bin/bash
cd "$(dirname "$0")"

scp -r . <remote_server>:<remote_folder>

Le message d'erreur est:

scp: error: unexpected filename: .

Je suis sur un Mac en cours d'exécution Mojave 10.14.2.

MISE À JOUR: J'ai résulé le problème spécifique en réécrisant la commande à cela, mais je serais toujours intéressé à savoir ce qui s'est cassé:

scp -r $(pwd) <remote_server>:<remote_folder>
21
Eliezer Steinbock

Le coupable est CVE-2018-20685 , dont la description est la suivante:

Dans OpenSSH 7.9, SCP.c dans le client SCP permet aux serveurs SSH distants de contourner les restrictions d'accès souhaitées via le nom de fichier de fichier. ou un nom de fichier vide. L'impact modifie les autorisations du répertoire cible du côté du client.

Cela fait partie d'un ensemble plus grand de vulnérabilités SCP . Citant de là:

Aperçu

Les clients SCP de plusieurs fournisseurs sont susceptibles d'un serveur SCP malveillant effectuant des modifications non autorisées dans la manipulation des répertoires cible et/ou de la sortie du client.

La description

De nombreux clients SCP ne vérifient pas si les objets renvoyés par le serveur SCP correspondent à ceux qu'elle a demandé. Cette question remonte à 1983 et à la RCP, sur laquelle SCP est basée. Une faille distincte dans le client permet aux attributs de répertoire cible d'être modifiés de manière arbitraire. Enfin, deux vulnérabilités dans les clients peuvent permettre au serveur de spoof de la sortie du client.

Le commit qui a correcté cette vulnérabilité à OpenBSD a été faite le 16 novembre 2018

21
BlackBear

L'autre réponse de @blackbear explique pourquoi Cela ne fonctionne plus.

Mais si comme moi, vous avez fini sur cette question à la recherche d'une solution, il semble que la bonne façon de le faire est avec rsync au lieu de scp. Par exemple, l'une de mes anciennes commandes scp aurait ressemblé à ceci:

# this no longer works due to the "."
scp -BCr output/html/. www:/var/www/site/html/

Maintenant à la place, j'utilise ceci:

rsync --recursive --times --compress --delete --progress output/html/ www:/var/www/site/html/

Si vous préférez les drapeaux plus courts, cela ressemblerait à ceci:

rsync -rtz --del --progress output/html/ www:/var/www/site/html/

La traînée / sur la source est importante. Il indique RSYNC que vous voulez le conten de ce répertoire sans le nom du répertoire.

Considérez également --dry-run et man rsync Avant de gâcher les choses.

10
Stéphane