web-dev-qa-db-fra.com

Comment créer un répertoire s'il n'existe pas dans sftp

Je veux créer un répertoire s'il n'existe pas après la connexion au serveur sftp.

test.sh

sftp [email protected] << EOF
mkdir test
put test.xml
bye
EOF

Maintenant, j'appelle test.sh et télécharge différents fichiers à chaque fois pour tester le dossier. Lors de l'exécution de cette

mkdir test

La première fois que cela fonctionne et la deuxième fois, elle ne peut pas créer de répertoire: Erreur d'échec?

Comment créer un répertoire s'il n'existe pas et s'il existe ne créez pas de répertoire dans sftp.

7
karan

Je comprends que ce fil est ancien et qu’il a été marqué comme ayant répondu, mais la réponse n’a pas fonctionné dans mon cas. La deuxième page sur Google pour une recherche concernant "sftp vérifiant un répertoire", voici donc une mise à jour qui me permettrait de gagner quelques heures. 

En utilisant un EOT, vous ne pouvez pas capturer le code d'erreur résultant du répertoire introuvable. Le travail que j'ai trouvé consistait à créer un fichier contenant des instructions pour l'appel, puis à capturer le résultat de cet appel automatisé. 

L'exemple ci-dessous utilise sshpass mais mon script utilise également cette même méthode pour s'authentifier avec sshkeys. 

Créez le fichier contenant les instructions:

echo "cd $RemoteDir" > check4directory
cat check4directory; echo "bye" >> check4directory

Définir les autorisations:

chmod +x check4directory

Ensuite, établissez la connexion à l'aide de la fonctionnalité de traitement par lots:

export SSHPAA=$remote_pass
sshpass -e sftp -v -oBatchMode=no -b check4directory $remote_user@$remote_addy

Enfin, vérifiez le code d'erreur:

if [ $? -ge "1" ] ; then
  echo -e "The remote directory was not found or the connection failed."
fi

À ce stade, vous pouvez quitter 1 ou lancer une autre action. Notez que si la connexion SFTP échoue pour une autre raison, telle que mot de passe ou adresse incorrecte, l'erreur déclenchera l'action. 

4
DevOps ninja

Une autre variante consiste à scinder la session SFTP en deux.

La première session SFTP émet simplement la commande MKDIR.

La deuxième session SFTP peut alors supposer l'existence du répertoire et mettre les fichiers.

3
andyb

Vous pouvez utiliser l'accès SSH de votre compte pour vérifier d'abord si le répertoire existe (en utilisant la commande "test"). S'il renvoie le code de sortie 0, le répertoire existe, sinon ce n'est pas le cas. Vous pouvez agir en conséquence.

# Both the command and the name of your directory are "test"
# To avoid confusion, I just put the directory in a separate variable
YOURDIR="test"

# Check if the folder exists remotely
ssh [email protected] "test -d $YOURDIR"

if [ $? -ne 0 ]; then
  # Directory does not exist
  sftp [email protected] << EOF
  mkdir test
  put test.xml
  bye
  EOF
else
  # Directory already exists
  sftp [email protected] << EOF
  put test.xml
  bye
  EOF
fi
3
Oldskool

man 1 sftp (du package openssh-client):

-b batchfile

    Batch mode reads a series of commands from an input
    batchfile instead of stdin. Since it lacks user
    interaction it should be used in conjunction with
    non-interactive authentication. A batchfile of ‘-’
    may be used to indicate standard input. sftp will
    abort if any of the following commands fail: get,
    put, reget, reput, rename, ln, rm, mkdir, chdir, ls,
    lchdir, chmod, chown, chgrp, lpwd, df, symlink, and
    lmkdir. Termination on error can be suppressed on a
    command by command basis by prefixing the command
    with a ‘-’ character (for example, -rm /tmp/blah*).

Alors:

{
  echo -mkdir dir1
  echo -mkdir dir1/dir2
  echo -mkdir dir1/dir2/dir3
} | sftp -b - $user@$Host
1
gavenkoa