How to create a link, for multiple users, to a network share, which itself is on a network share?
Working Windows-based solution
I've got a folder on a network share which works great in Windows. It is basically an index of other available file servers. It looks something like this:
\\server1\directory
Server2.lnk <-(links to \\server2\files)
Server3.lnk <-(links to \\server3\files)
Server4.lnk <-(links to \\server4\files)
I'm trying to replicate this functionality in macOS, but I have run into these problems:
Attempting to use an Alias in macOS
I connected to //server2/files
via Finder
using Go -> Connect to Server
. Once I was connected in Finder
, I created an Alias
using for the //server2/files
folder. I then copied that Alias
to the //server1/directory
location. The Alias
works... as long as I'm using the same computer from which I created the Alias
. But if I try to use it from another mac, it fails.
The other mac doesn't even seem to recognize the file as an Alias
file. It has an icon similar to a terminal
icon, and when I double-click it, the mac tells me that there is no Application defined to open the file. I noticed that the original created Alias
file doesn't seem to have any kind of extension, so I'm not sure how a different mac is supposed to recognize it as an Alias
file.
The nice thing about a Windows .lnk
file is that it seems to work reliably and consistently no matter from what machine the .lnk
is accessed, whereas a mac Alias
file seems to somehow depend on some configuration of the original machine where it was created.
For example, if I open the Alias
file in vi
, I can see amongst the garbled code that it includes at least the username used to access the Share, whereas I want each user that clicks on the Alias
to access the Share using their own credentials (the mac is joined to AD and users login using their AD credentials). Again, this works seamlessly with UNC paths and .lnk
files.
Attempting to use a terminal script in macOS
I tried to make a simple script that mounts the shares. So inside //server1/directory
I created a file Server2.command
with the following content:
mkdir /Volumes/Server2
mount_smbfs //server2/files /Volumes/Server2
cd /Volumes/Server2
open .
My problem with this solution is that I have many servers and many users using the same machine. One great thing about using the Connect to Server
option in Finder is that it seems to automatically "clean up" the /Volumes
directory. After ejecting a share, or after ending a session, it removes the corresponding /Volumes/Sharename
folder. I don't see any way to accomplish the same behavior if I use this terminal-based solution.
Question
Can someone give me a good way to replicate the .lnk
functionality I have described above?
I know the Windows links functions via UNC paths, whereas in macOS I can only access these network shares via smb
or afp
mounts, but since I see that the Connect to Server
option pretty much functions how I need it to, I just need a way to use that same functionality, with the caveat that I need to automate it, because I'm not going to ask my Users (I have many Users using the same machine) to each create a Connect to Server
Alias
manually.
Solution 1:
Found the answer. You must create an .afploc
file. This is similar to an .inetloc
file.
The easiest way to create a .afploc
file:
- open
Finder
Go -> Connect to Server
- type the address in the
Connect to Server
window (e.g.afp://server.domain.com/
- highlight what you just typed (
afp://server.domain.com
) - grab what you just highlighted and drag it to the desktop (or any folder, presumably) and release
- a file named
server.domain.com.afploc
should be created automatically on your desktop - you can then copy that file anywhere and it will function to automatically start the
Go -> Connect to Server
process on any mac computer - you can also rename the file if you want, and you can edit its contents to create other
.afploc
files that point to other servers or paths - you can also use this same process and substitute an
smb://
path. this creates an.inetloc
file which works the same way
Solution 2:
To complement Daniel's answer, it may be worth noting that these .afploc or .inetloc files are just plain XML plist files. So you could also generate them by hand or from a script. An example file for an smb share looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>URL</key>
<string>smb://server/share</string>
</dict>
</plist>
So if you have many such shortcuts to define, you could have a file like this:
$ cat shares.txt
server1 share1
server2 share2
server3 other-share
And then run this to generate .inetloc files for every server-share:
cat shares.txt | while read server share; do
cat <<'EOF' >"$server-$share.inetloc"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>URL</key>
<string>smb://$server/$share</string>
</dict>
</plist>
EOF
done