How would you add a share to smb.conf via a script?
To fit with modern sysadmin best practices it would be good to add your configs as individual files in /etc/smb/smb.d
and then reference them with an include
. Sadly samba does not support wildcard include
s so you have to do add something like:
include = /etc/smb/includes.conf
in your smb.conf
and then generate the includes.conf
with something like:
ls /etc/smb/smb.d/* | sed -e 's/^/include = /' > /etc/smb/includes.conf
For a bit more context:
chicks@silver 23:57:23 smb !531 $ ls smb.d
a.conf c.conf e.conf
chicks@silver 23:57:29 smb !532 $ ls /etc/smb/smb.d/* | sed -e 's/^/include = /' > /etc/smb/includes.conf
chicks@silver 23:57:40 smb !533 $ cat includes.conf
include = /etc/smb/smb.d/a.conf
include = /etc/smb/smb.d/c.conf
include = /etc/smb/smb.d/e.conf
So now you can stick any additional samba configs into /etc/smb/smb.d
, regenerate includes.conf
and restart samba and life is good.
Related videos on Youtube
Srikanth
Updated on September 18, 2022Comments
-
Srikanth over 1 year
I'd like to script adding a share to a
smb.conf
file. My current script just appends it to the end of the file, but that's not ideal. I'd rather have something that will add a new share if it doesn't exist, and replace it if it does.I'm currently scripting this on a CentOS 7 distro, but would ideally like something that would work across distros, though that's not a requirement.
Also, I'm using
bash
to do this because the script is run before other packages are added to the system. The script usesyum
to install thesamba
packages, and then is supposed to configure it and add shares.-
foxfabi over 9 yearsCheck for pre-existing modules for your favourite scripting language. For example, I quickly found File::Samba for perl
-
Zoredache over 9 yearsCan you tell us more about the environment and context of what you are doing? If I had a server and I wanted to programmatically change shares often, then I would create a directory, setup an include for that directory. Then I would just place one file per share in that directory.
-
Srikanth over 9 years@glennjackman - That would be ideal, but I was hoping to not have to add additional scripting languages and packages. This is part of an rpm and I'd rather not have a lot of pre-requirements. If I'm going to do that, I might as well use saltstack, puppet, chef or another tool like that. I was hoping for something more lightweight. Too bad there isn't a smbconfmerge command. I wonder what saltstack uses?
-
-
Srikanth over 9 yearsIs that independent of the distro? Also, how does that work if you want to update parameters as well as add/remove shares?
-
Philip over 9 yearsYep, that should work well regardless of distro (unless the distro comes with something like this already, but I haven't seen one yet). It'd be the same procedure no matter what you're changing: make x.conf changes/additions/removal, rebuild includes.conf, restart the daemon.
-
Srikanth over 9 yearsThis doesn't work with global settings. It also doesn't fix the issue that a particular share name could be added to one of the a.conf, b.conf, or c.conf files already.
-
chicks over 9 yearsThere's nothing to stop you from grepping through all of the configs and making sure they are up to some standard. You could use a similar mechanism for global settings too. One include for global settings would point to
*.conf
and another for shares would point to*.share
. -
chicks almost 4 yearsdocs.ansible.com/ansible/latest/modules/lineinfile_module.html would be another way to handle this.