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 uses yum to install the samba packages, and then is supposed to configure it and add shares.

  • 1
    Check for pre-existing modules for your favourite scripting language. For example, I quickly found File::Samba for perl Commented Dec 5, 2014 at 21:07
  • 1
    Can 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.
    – Zoredache
    Commented Dec 5, 2014 at 21:25
  • @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? Commented Dec 9, 2014 at 6:06

2 Answers 2


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 includes 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:

$ ls smb.d
a.conf  c.conf  e.conf
$ ls /etc/smb/smb.d/* | sed -e 's/^/include = /' > /etc/smb/includes.conf
$ 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.

  • Is that independent of the distro? Also, how does that work if you want to update parameters as well as add/remove shares? Commented Dec 8, 2014 at 14:48
  • 1
    Yep, 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.
    – Chris S
    Commented Dec 8, 2014 at 14:57
  • This 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. Commented Dec 9, 2014 at 6:02
  • There'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
    Commented Dec 9, 2014 at 18:22
  • docs.ansible.com/ansible/latest/modules/lineinfile_module.html would be another way to handle this.
    – chicks
    Commented Jul 16, 2020 at 14:54

This is an old topic but still useful. This are my scripts to create and delete users in a simple samba installation for storing backups.

Tested on CentOS

Prepare directory and permissions

Run this commands on a terminal

sudo mkdir /backups
sudo mkdir /etc/samba/smb.conf.d
sudo groupadd sambashare 
sudo chgrp sambashare /backups
sudo useradd -M -d /home/sadmin -s /usr/sbin/nologin -G sambashare sadmin
sudo smbpasswd -a sadmin
sudo smbpasswd -e sadmin


    workgroup = TUAITI
    security = user

    passdb backend = tdbsam

    printing = cups
    printcap name = cups
    load printers = yes
    cups options = raw

include = /etc/samba/includes.conf


if [ -z "$1" ]
    echo "No username given"
    exit 1

useradd -M -d /backups/$USER -s /usr/sbin/nologin -G sambashare $USER
mkdir /backups/$USER
chown $USER:sambashare /backups/$USER
chmod 2770 /backups/$USER
smbpasswd -a $USER
smbpasswd -e $USER

cat  /etc/samba/smb.conf.d/$USER.conf
    path = /backups/$USER
    browseable = no
    read only = no
    force create mode = 0660
    force directory mode = 2770
    valid users = $USER @sadmin

ls /etc/samba/smb.conf.d/* | sed -e 's/^/include = /' > /etc/samba/includes.conf

smbcontrol all reload-config


if [ -z "$1" ]
    echo "No username given"
    exit 1

read -r -p "Are you sure you want to delete the user ? [y/N] " response
response=${response,,}    # tolower
if [[ "$response" =~ ^(yes|y)$ ]]
    smbpasswd -x $USER
    userdel $USER
    mv /backups/$USER /backups/$USER.`date +"%Y%m%d%H%M%S"`.deleted
    rm /etc/samba/smb.conf.d/$USER.conf

    ls /etc/samba/smb.conf.d/* | sed -e 's/^/include = /' > /etc/samba/includes.conf

    smbcontrol all reload-config
    echo "Nothing done"

You must log in to answer this question.

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