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.
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.
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.
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
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