全体構成

全体構成

私のOpenWrtルーターは、Public私のSamba共有のいくつかの基本的なパラメータで構成されています/etc/samba/smb.conf。これで、この共有にいくつかの追加パラメータを追加する必要があるので、設定の共有セクションのPublic最後の行に追加したいと思います。

そのセクションの後にテキストを追加する方法を見つけましたが、これを行うと、テキストが最初の行に表示されます。

[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

出力

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

しかし、セクションの最後の行の後にテキストを配置したいと思います。

希望の出力

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

また、すべてのコードを1行に追加せずに複数行を追加できるようにheredoc(EOF)を追加する方法はありますか?

全体構成

[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

答え1

構成ファイルに追加する行を含むheredocでgnu sedを使用します。

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
  • インデントレベルはタブです。

答え2

awk私はこれを使用します

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

一致する場合は、[Public]トグルを設定し、長さ0の最初の行でトグルをリセットし、目的のテキストを挿入します。

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

答え3

いくつかのトリックを使用すると、次のawkブロックがこのブロックの後に始まり、レコード区切り文字として機能すると想定されます\n[。最後のレコード区切り記号のために最後の行を削除しますhead

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

ネペレ

other config
#and a comment

[Block 1]
    option1 = value1
    option2 = value2

[Block 2]
    option1 = value1
    option2 = value2

出力

other config
#and a comment

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

[Block 2]
    option1 = value1
    option2 = value2

関連情報