首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字符串块读取为多变量ubuntu

问将字符串块读取为多变量ubuntu
EN

Unix & Linux用户
提问于 2018-12-03 11:13:51
回答 1查看 250关注 0票数 1

我有一个可以复制权限的脚本,它工作得很好,这是一个有趣的行:

代码语言:javascript
复制
...
bash commands.sh $PAM_USER "medium" /bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed} /usr/bin/{vim,touch,java,python,gcc,awk,make}
...

commands.sh有一个循环,它读取列出的所有权限,并将它们复制到指定的目录中。当我试图从一个配置文件读取权限时,也会出现同样的问题。

我的配置文件包含以下内容:

代码语言:javascript
复制
MEDIUM_PERMISSIONS_BIN=/bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed}
MEDIUM_PERMISSIONS_USR_BIN=/usr/bin/{vim,touch,java,python,gcc,awk,make}
MEDIUM_ENVIROMENT_LIFESPAN=midnight
MEDIUM_PERSISTENT_HOME=true

注意:最后两种配置是不同的,现在我正试着正确地阅读前两行。

我将配置文件添加到前面的脚本中,并尝试执行以下操作:

代码语言:javascript
复制
source /etc/users/config.cfg
...
 bash commands.sh $PAM_USER "medium" $MEDIUM_PERMISSIONS_BIN $MEDIUM_PERMISSIONS_USR_BIN
...

问题是,循环是这样读取它的:

代码语言:javascript
复制
loop: /bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed}
loop: /usr/bin/{vim,touch,java,python,gcc,awk,make}

以前,当它将其读取为/bin/ls、/bin/rm、/bin/rm等时,因此循环能够找到这些命令,因此它能够找到第一个版本,而不是在第二个版本中,前面指定的输出不正确。

我已经阅读了sed和awk命令,但我对这些命令非常陌生,无法让它们工作。

如何读取配置文件中的权限,就像在第一个版本中直接介绍它们一样?

谢谢

编辑: commands.sh代码:

代码语言:javascript
复制
#!/bin/bash

CHROOT="/users/$2/$1"
if [ ! -d "$CHROOT/home/$1" ]; then
    mkdir -p "$CHROOT/home/$1"
fi

for i in $( ldd $* | grep -v dynamic | cut -d " " -f 3 | sed 's/://' | sort | uniq )
do
    cp -v --parents $i $CHROOT
done

#ARCH amd64
if [ -f /lib64/ld-linux-x86-64.so.2 ]; then
    cp --parents /lib64/ld-linux-x86-64.so.2 /$CHROOT
fi

#ARCH i386
if [ -f /lib/ld-linux.so.2 ]; then
    cp --parents /lib/ld-linux.so.2 /$CHROOT
fi

clear
cd

注释:我删除了所有调试回波。这段代码很大程度上是从下面的代码中复制出来的:https://linuxconfig.org/how-to-automatically-chroot-jail-selected-ssh-user-logins

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-12-03 11:27:30

您正在尝试定义数组变量,但正在使用字符串的格式:

代码语言:javascript
复制
## This will define a string variable
$ MEDIUM_PERMISSIONS_BIN=/bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed}
$ echo $MEDIUM_PERMISSIONS_BIN
/bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed}

## The parentheses tell the shell this is an array
$ MEDIUM_PERMISSIONS_BIN=(/bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed})
$ echo $MEDIUM_PERMISSIONS_BIN  ## the 1st element of the array
/bin/ls
$ echo ${MEDIUM_PERMISSIONS_BIN[@]} ## the entire array
/bin/ls /bin/rm /bin/bash /bin/nano /bin/mkdir /bin/kill /bin/ln /bin/ps /bin/grep /bin/sed

因此,只需将配置文件更改为:

代码语言:javascript
复制
MEDIUM_PERMISSIONS_BIN=(/bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed})
MEDIUM_PERMISSIONS_USR_BIN=(/usr/bin/{vim,touch,java,python,gcc,awk,make})
MEDIUM_ENVIROMENT_LIFESPAN=midnight
MEDIUM_PERSISTENT_HOME=true

然后,在脚本中使用"${MEDIUM_PERMISSIONS_BIN[@]}"。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/485664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档