6 votes

Terminal (bash) - copier des fichiers à partir de partages Windows (SMB) sans montage

Dans les versions antérieures d'OSX, on pouvait copier des fichiers à partir de partages SMB comme suit :

smbclient //my-server/foo -U USER%PASS -I 127.0.0.1 -c "get my.file" 

Cependant, dans les versions récentes, sbmclient a été remplacé par smbutil qui n'a pas de capacité de copie. Pour autant que je sache, le seul remplacement est mount -t smbfs . Je ne connais pas de moyen d'installer smbclient sur OSX ( Imprimer un fichier depuis le terminal via smb ).

Le montage est cependant assez ennuyeux :

  1. Vous devez créer un dossier pour le point de montage (et s'il existe déjà ?).
  2. Si le même dossier a déjà été monté sur un autre dossier, mount échouera (avec une erreur assez trompeuse)
  3. Il n'y a pas de moyen "structuré" de savoir quelles actions sont montées où (à ma connaissance), ce qui signifie que vous devrez grep / sed la sortie de df pour essayer de contourner les problèmes ci-dessus

Fondamentalement, je veux juste copier de manière fiable un fichier à partir d'un partage SMB dans un bash script, et les problèmes ci-dessus rendent cela plus compliqué que cela ne devrait être (et l'était déjà avant smbclient a été abandonné).

7voto

mivk Points 807

Vous ne pouvez pas le faire sans monter d'abord le partage.

Pour le monter à partir de la ligne de commande, que ce soit par le biais de Terminal ou d'une session SSH, il existe plusieurs méthodes présentant des avantages et des inconvénients différents.

Quelques variables, pour faciliter le copier/coller du reste :

user=my_username; pass=my_password; server=my_server; share=my_share

Méthode 1

Créez un dossier temporaire, montez-le dans ce dossier, puis démontez-le et supprimez le dossier temporaire.

C'est la seule méthode qui fonctionne également sans qu'un utilisateur soit connecté, comme par exemple via une session SSH ouverte juste après le démarrage. Mais si un utilisateur est réellement connecté, il y a toujours une icône sur le bureau pour accéder au partage via le Finder.

dir=$(mktemp -d)
mount -t smbfs //$user:$pass@$server/$share $dir

# ls -l $dir
# ...

umount $dir && rmdir $dir

Méthode 2

Celui-ci ne fonctionne que si un utilisateur est connecté. Mais il a l'avantage de se monter dans le standard /Volumes/$share dossier.

open "smb://$user:$pass@$server/$share"

# ls -l /Volumes/$share
# ...

diskutil unmount /Volumes/$share

Cette méthode ouvre une fenêtre Finder dans l'interface graphique, montrant le partage monté.

Méthode 3

Comme la méthode 2, cette méthode ne fonctionne que si un utilisateur est connecté, et monte également dans le standard /Volumes/$share dossier.

Cependant, contrairement à la méthode 2, elle n'ouvre pas une fenêtre du Finder sur le partage monté. (Mais elle crée également l'icône sur le Bureau).

Il est nécessaire d'utiliser des guillemets compliqués si l'on utilise des variables, car on ne peut pas utiliser de guillemets simples.

osascript -e "mount volume \"smb://$user:$pass@$server/$share\""

# ls -l  /Volumes/$share
# ...

diskutil unmount /Volumes/$share

0 votes

Qu'en est-il si vous allez dans la direction opposée, c'est-à-dire si vous copiez un fichier d'un répertoire local vers un partage SMB ? Mon NAS est partagé via SMB sur mon réseau, et je peux accéder aux fichiers sans problème via la fenêtre de l'Explorateur de fichiers, mais lorsque j'essaie de copier un fichier À le partage SMB, j'obtiens cette erreur : $ cp chat.db smb://NAS6ABA8C._smb._tcp.local/iPhone-SMS-backup/chat-DB-backup/ cp : le répertoire smb://NAS6ABA8C._smb._tcp.local/iPhone-SMS-backup/chat-DB-backup n'existe pas. smbfs pour pouvoir simplement copier le fichier vers l'emplacement distant ?

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X