In past OSX versions, one could copy files from SMB shares like so:

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

However, in recent versions, sbmclient has been replaced with smbutil which does not have copying capabilities. As far as I can tell, the only replacement is mount -t smbfs. I am not aware of any way to install smbclient on OSX (Print file from terminal via smb).

Mounting is pretty annoying though:

  1. You have to create a folder for the mount point (what if it already exists?)
  2. If the same folder has already been mounted on a different folder, mount will fail (with a pretty misleading error)
  3. There's no "structured" way to tell which shares are mounted where (that I know of), meaning you'll have to grep/sed the output of df to try and work around the issues above

Basically I just want to reliably copy a file from an SMB share in a bash script, and the issues above make it more complicated than it should be (and already was before smbclient was dropped).


1 Answer 1


You cannot do that without first mounting the share.

For mounting it from the command-line, whether through Terminal or from an SSH session, there are several methods with different advantages and disadvantages.

A few variables, to make it easier to copy/paste the rest :

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

Method 1

Create a temporary folder, mount into that, then unmount and remove the temporary folder.

This is the only method that also works without a user being logged in, like through a SSH session opened right after boot. But if a user is actually logged in there is still an icon on the desktop to access the share through the Finder.

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

# ls -l $dir
# ...

umount $dir && rmdir $dir

Method 2

This one only works if a user is logged in. But it has the advantage to mount into the standard /Volumes/$share folder.

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

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

diskutil unmount /Volumes/$share

This method opens a Finder Window in the GUI, showing the mounted share.

Method 3

Like method 2, this only works if a user is logged in, and also mounts into the standard /Volumes/$share folder.

However, unlike method 2, it does not open a Finder window to the mounted share. (But it does also create the icon on the Desktop).

It needs cumbersome quoting if using variables, because one cannot use single quotes.

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

# ls -l  /Volumes/$share
# ...
diskutil unmount /Volumes/$share
  • What about if you're going the opposite direction, ie copying a file from a local directory to an SMB share? I have my NAS shared through SMB on my network, and I can access the files just fine via the File Explorer window, but when I try to copy a file TO the SMB share, I get this error: $ cp chat.db smb://NAS6ABA8C._smb._tcp.local/iPhone-SMS-backup/chat-DB-backup/ cp: directory smb://NAS6ABA8C._smb._tcp.local/iPhone-SMS-backup/chat-DB-backup does not exist Do I still have to go through the whole smbfs rigamarole just to be able to simply copy the file to the remote location?
    – Raleigh L.
    Oct 3, 2022 at 5:28

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .