0

My OpenWrt router has configured some basic parameters for my Public Samba share at /etc/samba/smb.conf. I now need to add some extra parameters to this share and so I want to append them to the very last line of the Public share section of the configuration.

I've worked out how to append text after the section but this puts it in on the first line:

[Public]
        path = /srv/public
        create mask = 0700
        directory mask = 0700
        read only = yes
        guest ok = yes
sed -i '/\[Public\]/a hello world' /tmp/sed.sh

Output

[Public]
        hello world <-- 
        path = /srv/public
        create mask = 0700
        directory mask = 0700
        read only = yes
        guest ok = yes

However, I would like to place text after the last line of that section:

Desired output

[Public]
        path = /srv/public
        create mask = 0700
        directory mask = 0700
        read only = yes
        guest ok = yes
        hello world <--

Additionally is there a way I can append a heredoc (EOF) so I can add multiple lines without having to put all of the code into one line?

Entire config

[global]
    netbios name = OpenWrt-AP1 
    interfaces = br-lan 
    server string = Samba on OpenWRT
    unix charset = UTF-8
    workgroup = WORKGROUP

    ## This global parameter allows the Samba admin to limit what interfaces on a machine will serve SMB requests.
    bind interfaces only = yes

    ## time for inactive connections to-be closed in minutes
    deadtime = 15

    ## disable core dumps
    enable core files = no

    ## set security (auto, user, domain, ads)
    security = user

    ## This parameter controls whether a remote client is allowed or required to use SMB encryption.
    ## It has different effects depending on whether the connection uses SMB1 or SMB2 and newer:
    ## If the connection uses SMB1, then this option controls the use of a Samba-specific extension to the SMB protocol introduced in Samba 3.2 that makes use of the Unix extensions.
    ## If the connection uses SMB2 or newer, then this option controls the use of the SMB-level encryption that is supported in SMB version 3.0 and above and available in Windows 8 and newer. 
    ## (default/auto,desired,required,off)
    #smb encrypt = default

    ## set invalid users
    invalid users = root

    ## map unknow users to guest
    map to guest = Bad User

    ## allow client access to accounts that have null passwords. 
    null passwords = yes

    ## The old plaintext passdb backend. Some Samba features will not work if this passdb backend is used. (NOTE: enabled for size reasons)
    ## (tdbsam,smbpasswd,ldapsam)
    passdb backend = smbpasswd

    ## Set location of smbpasswd ('smbd -b' will show default compiled location)
    #smb passwd file = /etc/samba/smbpasswd 

    ## LAN (IPTOS_LOWDELAY TCP_NODELAY) WAN (IPTOS_THROUGHPUT) WiFi (SO_KEEPALIVE) try&error for buffer sizes (SO_RCVBUF=65536 SO_SNDBUF=65536)
    socket options = IPTOS_LOWDELAY TCP_NODELAY

    ## If this integer parameter is set to a non-zero value, Samba will read from files asynchronously when the request size is bigger than this value.
    ## Note that it happens only for non-chained and non-chaining reads and when not using write cache.
    ## The only reasonable values for this parameter are 0 (no async I/O) and 1 (always do async I/O).
    ## (1/0)
    #aio read size = 0
    #aio write size = 0

    ## If Samba has been built with asynchronous I/O support, Samba will not wait until write requests are finished before returning the result to the client for files listed in this parameter.
    ## Instead, Samba will immediately return that the write request has been finished successfully, no matter if the operation will succeed or not.
    ## This might speed up clients without aio support, but is really dangerous, because data could be lost and files could be damaged. 
    #aio write behind = /*.tmp/

    ## lower CPU useage if supported and aio is disabled (aio read size = 0 ; aio write size = 0)
    ## is this still broken? issue is from 2019 (NOTE: see https://bugzilla.samba.org/show_bug.cgi?id=14095 )
    ## (no, yes)
    #use sendfile = yes

    ## samba will behave as previous versions of Samba would and will fail the lock request immediately if the lock range cannot be obtained.
    #blocking locks = No

    ## disable loading of all printcap printers by default (iprint, cups, lpstat)
    load printers = No
    printcap name = /dev/null

    ## Enabling this parameter will disable Samba's support for the SPOOLSS set of MS-RPC's.
    disable spoolss = yes

    ## This parameters controls how printer status information is interpreted on your system.
    ## (BSD, AIX, LPRNG, PLP, SYSV, HPUX, QNX, SOFTQ)
    printing = bsd

    ## Disable that nmbd is acting as a WINS server for unknow netbios names
    #dns proxy = No

    ## win/unix user mapping backend
    #idmap config * : backend = tdb

    ## Allows the server name that is advertised through MDNS to be set to the hostname rather than the Samba NETBIOS name.
    ## This allows an administrator to make Samba registered MDNS records match the case of the hostname rather than being in all capitals.
    ## (netbios, mdns)
    mdns name = mdns

    ## Clients that only support netbios won't be able to see your samba server when netbios support is disabled.
    #disable netbios = Yes

    ## Setting this value to no will cause nmbd never to become a local master browser.
    #local master = no

    ## (auto, yes) If this is set to yes, on startup, nmbd will force an election, and it will have a slight advantage in winning the election. It is recommended that this parameter is used in conjunction with domain master = yes, so that nmbd can guarantee becoming a domain master. 
    #preferred master = yes

    ## (445 139) Specifies which ports the server should listen on for SMB traffic.
    ## 139 is netbios/nmbd
    #smb ports = 445 139

    ## This is a list of files and directories that are neither visible nor accessible.
    ## Each entry in the list must be separated by a '/', which allows spaces to be included in the entry. '*' and '?' can be used to specify multiple files or directories as in DOS wildcards.
    veto files = /Thumbs.db/.DS_Store/._.DS_Store/.apdisk/

    ## If a directory that is to be deleted contains nothing but veto files this deletion will fail unless you also set the delete veto files parameter to yes.
    delete veto files = yes

################ Filesystem and creation rules ################
    ## reported filesystem type (NTFS,Samba,FAT)
    #fstype = FAT

    ## Allows a user who has write access to the file (by whatever means, including an ACL permission) to modify the permissions (including ACL) on it.
    #dos filemode = Yes

    ## file/dir creating rules
    #create mask = 0666
    #directory mask = 0777
    #force group = root
    #force user = root
    #inherit owner = windows and unix
################################################################

######### Dynamic written config options #########

[Public]
        path = /srv/public
        create mask = 0700
        directory mask = 0700
        read only = yes
        guest ok = yes

[Multimedia]
        path = /srv/multimedia
        create mask = 0700
        directory mask = 0700
        read only = yes
        guest ok = yes

0

3 Answers 3

1

Using gnu sed with heredoc containing what lines to be appended in the config file.

add=$(sed -e 's:^:\t:;s:\\:&&:g;$!s:$:\\:' <<!
---> Hello, world! <---
---> ok tata by by <---
!
)

sed -e '
  /^\[Public]/,/^$/!b
  /./{
    $a\
'"$add"'
  }
  //!i\
'"$add"'
' /etc/samba/smb.conf
  • Indent level is a tab character.
1

I'd use awk for this

awk '/^\[Public\]/ {toggle=1} toggle && $0=="" {toggle=0; printf "\t%s\n", "hello world <--"} 1' /tmp/sed

When it matches [Public] the toggle is set, and then at the first zero-length line the toggle is reset and required text inserted.

awk '
    /^\[Public\]/ {toggle=1}    # or: $0=="[Public]"
    toggle && $0=="" {toggle=0; printf "\t%s\n", "hello world <--"}
    1
' /tmp/sed
0
0

A little trick using awk, assumes that the next block starts after this one and thus uses \n[ as record separator. Delete last lines with head due to last record separator.

awk 'BEGIN {RS="\n\\[";ORS="\n["} 
     /Block 1/ {$0 = $0"\toption3 = value3\n"} {print}' 1  |
     head -n-2 

infile

other config
#and a comment

[Block 1]
    option1 = value1
    option2 = value2

[Block 2]
    option1 = value1
    option2 = value2

output

other config
#and a comment

[Block 1]
    option1 = value1
    option2 = value2
    option3 = value3

[Block 2]
    option1 = value1
    option2 = value2

You must log in to answer this question.

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