将用户添加到 vncserver 配置文件的脚本

Script to add a user to vncserver config file

我想编写一个 bash 脚本来自动将用户添加到 vncserver 配置文件。根据 Centos guide,我必须编辑 /etc/sysconfig/vncserver

  1. 将第一行从 VNCSERVERS="1:user1" 扩展到 VNCSERVERS="1:user1 2:user2"
  2. 为新用户添加一行(示例中的第二个用户)VNCSERVERARGS[2]="-geometry 1250x700"

因此,运行./add_user_to_vnc user2,原文件的内容将从

更新
VNCSERVERS="1:user1"
VNCSERVERARGS[1]="-geometry 1250x700"

VNCSERVERS="1:user1 2:user2"
VNCSERVERARGS[1]="-geometry 1250x700"
VNCSERVERARGS[2]="-geometry 1250x700"

这种脚本的两个难点(对我来说)是维护计数器和扩展第一行。使用 echo >> 命令附加最后一行应该相当简单!

有什么想法吗?

以下是我的做法:

#!/bin/bash

# Get new user name
new_user=""

# Get list of current users
servers="$(grep 'VNCSERVERS' vncserver)"

# Extract counter of last user
users="${servers#*\"}"      # Remove everything up to first quote
last_user="${users##* }"    # Remove everything up to last space
ctr="${last_user%%:*}"      # Remove everything starting from colon

# Increase counter
(( ++ctr ))

# Remove trailing quotes from line with current users
servers="${servers%\"}"

# Construct new first line
printf -v servers "%s %d:%s\"" "$servers" "$ctr" "$new_user"

# Construct new line for server args
serv_args="VNCSERVERARGS[$ctr]=\"-geometry 1250x700\""

# Use sed to replace first line and append last line
sed '1s/.*/'"$servers"'/;$a\'"$serv_args"'' vncserver

备注:

  • 这会将新文件打印到标准输出。要更新您的 vncserver 文件,您必须
    • 要么重定向到一个临时文件,然后重命名该文件(请注意,./script > vncserver 会在处理文件之前截断该文件,您最终会得到一个空文件)
    • 或更新 sed 行以使用 sed -i(或 BSD sed:sed -i'')进行就地处理。要保留备份文件,请使用 sed -i.bak.
  • 有些 seds 需要在追加命令后换行 a\;然后 sed 命令将变为

    sed '1s/.*/'"$servers"'/;$a\
    '"$serv_args"'' vncserver
    
  • 提取计数器感觉有点笨重,但它必须考虑到列表中只有一个用户的可能性,因此没有空格。我很确定更优雅的解决方案是可能的。

用法示例(sed -i):

$ cat vncserver
VNCSERVERS="1:user1"
VNCSERVERARGS[1]="-geometry 1250x700"
$ ./SO.sh user2
$ cat vncserver
VNCSERVERS="1:user1 2:user2"
VNCSERVERARGS[1]="-geometry 1250x700"
VNCSERVERARGS[2]="-geometry 1250x700"
$ ./SO.sh another_user
$ cat vncserver
VNCSERVERS="1:user1 2:user2 3:another_user"
VNCSERVERARGS[1]="-geometry 1250x700"
VNCSERVERARGS[2]="-geometry 1250x700"
VNCSERVERARGS[3]="-geometry 1250x700"
$ ./SO.sh latest_user
$ cat vncserver
VNCSERVERS="1:user1 2:user2 3:another_user 4:latest_user"
VNCSERVERARGS[1]="-geometry 1250x700"
VNCSERVERARGS[2]="-geometry 1250x700"
VNCSERVERARGS[3]="-geometry 1250x700"
VNCSERVERARGS[4]="-geometry 1250x700"