将用户添加到 vncserver 配置文件的脚本
Script to add a user to vncserver config file
我想编写一个 bash 脚本来自动将用户添加到 vncserver
配置文件。根据 Centos guide,我必须编辑 /etc/sysconfig/vncserver
和
- 将第一行从
VNCSERVERS="1:user1"
扩展到 VNCSERVERS="1:user1 2:user2"
- 为新用户添加一行(示例中的第二个用户)
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"
我想编写一个 bash 脚本来自动将用户添加到 vncserver
配置文件。根据 Centos guide,我必须编辑 /etc/sysconfig/vncserver
和
- 将第一行从
VNCSERVERS="1:user1"
扩展到VNCSERVERS="1:user1 2:user2"
- 为新用户添加一行(示例中的第二个用户)
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"