-
-
Save pudquick/1362a8908be01e23041d to your computer and use it in GitHub Desktop.
In the past i've often had the need to mount a smb volume with the "no browse" flag set, this prevents it from showing up in the finder side bar and prevents the share from showing on the Desktop, however the share is still fully accessible from the CLI.
i was able to achieve this using: mount_smbfs -o no browse
I managed to find a similar key in NetFS:
kNetFSMountFlagsKey:
The value of this key needs to be the value of MNT_DONTBROWSE
which according to the mount.h file (https://opensource.apple.com/source/xnu/xnu-2050.7.9/bsd/sys/mount.h)
is: 0x00100000
So if we do:
mount_options = {
NetFS.kNetFSAllowSubMountsKey: True,
NetFS.kNetFSMountFlagsKey: 0x00100000,
}
Then we get the share mounting in the no browse mode :)
$ mount
/dev/disk0s2 on / (hfs, local, journaled)
//[email protected]/Share_Name on /Volumes/Share_Name (smbfs, nodev, nosuid, nobrowse, mounted by username)
This seems to be broken when run in a recently released preview OS. It complains about open_options = {NetFS.kNAUIOptionKey: NetFS.kNAUIOptionNoUI}. KeyError: 'kNAUIOptionNoUI'
Hidden Mount Sierra:
mount_options = { NetFS.kNetFSAllowSubMountsKey: True, NetFS.kNetFSMountFlagsKey: 0x00100000 }
Hidden Mount High Sierra:
mount_options = { ' AllowSubMounts': True, 'MountFlags': 0x00100000 }
Some changes need to be made to get this working with Python 3. Specifically the way the username and password is passed for the authenticated mounts - it needs to be sent as a "real" NSString
(thanks @pudquick for the pointer in Macadmins Slack).
Add:
from Foundation import NSString
Change:
objc.loadBundleFunctions(
NetFS_bundle, NetFS, [('NetFSMountURLSync', 'i@@@@@@o^@')])
to:
objc.loadBundleFunctions(
NetFS_bundle, NetFS, [('NetFSMountURLSync', b'i@@@@@@o^@')])
And wherever a user/pass string is passed in:
NSString.alloc().initWithString_('string_to_convert')
@pudquick just wondering if you've revisited this given some deprecations that are going to happen in PyObjC 9:
/usr/local/bin/redlands/mount_shares.py:24: DeprecationWarning: This function will be removed in PyObjC 9, switch to the modern metadata system
NetFS_bundle = objc.initFrameworkWrapper('NetFS', frameworkIdentifier=None, frameworkPath=objc.pathForFramework('NetFS.framework'), 1globals=NetFS, scan_classes=False)
Thanks @pudquick for the chat over Slack about the changes that will be upcoming to PyObjC 9.
For anyone else using this, you should be able to comment out these lines and simply replace it all with import NetFS
and have it work...
(tested against PyObjC
v7.3).
# class attrdict(dict):
# __getattr__ = dict.__getitem__
# __setattr__ = dict.__setitem__
#
#
# NetFS = attrdict()
# # Can cheat and provide 'None' for the identifier,
# # it'll just use frameworkPath instead
# # scan_classes=False means only add the contents of this Framework
# NetFS_bundle = objc.initFrameworkWrapper('NetFS',
# frameworkIdentifier=None,
# frameworkPath=objc.pathForFramework(
# 'NetFS.framework'),
# globals=NetFS,
# scan_classes=False)
# # NetFS_bundle = objc.ObjCLazyModule('NetFS', None, objc.pathForFramework('NetFS.framework'))
#
# # https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
# # Fix NetFSMountURLSync signature
# del NetFS['NetFSMountURLSync']
# objc.loadBundleFunctions(NetFS_bundle, NetFS, [('NetFSMountURLSync', b'i@@@@@@o^@')])
Will this mount local shares?