【问题标题】:Script to add a user to vncserver config file将用户添加到 vncserver 配置文件的脚本
【发布时间】:2016-07-06 12:46:55
【问题描述】:

我想编写一个 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 >> 命令添加最后一行应该相当简单!

有什么想法吗?

【问题讨论】:

  • 您的脚本是否应该适用于从 n 个用户到 n + 1 个用户的一般情况?
  • 是的,因为我不记得最后一个用户的号码
  • 这是最有意义的。解析VNCSERVERS 行,使用paramete-expansion 隔离最后一个用户,获取用户编号,然后将新用户号附加到该行(使用sed),然后您可以再次调用@ 987654333@ 完成VNCSERVERARGS 行的添加。 (我的钱花在 Benjamin 的解决方案上,如果他不做,我会帮忙)。

标签: bash vnc


【解决方案1】:

我会这样做:

#!/bin/bash

# Get new user name
new_user="$1"

# 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"

【讨论】:

  • 我唯一的验证调整是((ctr++)) || { printf "error: invalid 'ctr' value '%s'.\n" "$ctr"; exit 1; }(只是为了确保不将错误信息写入配置文件)总是喜欢bash的字符串处理能力......(哦,还有我认为user1等需要从位置参数中获取——我怀疑vncserver用户文字user1作为实际名称:)
  • @David 哦,疏忽了...必须更新位置参数。
  • 非常感谢。还有一个问题:users="${servers#*\"}" 和类似的行是如何解释的?我的意思是在哪里可以找到#*##* 和...的定义?它们与正则表达式有关吗?我以前没见过他们
  • @mahmood 这些被称为“参数扩展”,是一种非常强大的字符串操作方式。请参阅the manualBash Hackers Wikithis answer of mine
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多