首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理Unix权限读取bash中csv文件中的动态字段

管理Unix权限读取bash中csv文件中的动态字段
EN

Stack Overflow用户
提问于 2019-03-20 13:33:17
回答 1查看 81关注 0票数 0

目前,我使用的是一个bash脚本,它应该能够在处理部分的末尾管理文件和目录的权限。

实际上,我有4个组件:

  • 源文件.conf文件和libs (.sh)的主脚本处理事情,并调用函数"ApplyPermissionFromCSVFile“,最后以.csv文件作为参数,以确保正确设置权限。此函数应处理管理文件权限的任务。
  • 一个名为"permission_lib.sh“的脚本包含几个函数,其中包括"ApplyPermissionFromCSVFile”函数。这个脚本来源于主脚本的开头。
  • 一个.conf文件,它包含一些定义为变量的路径,这些变量来源于主脚本的开头
  • 一个.csv文件,包含ApplyPermissionFromCSVFile函数读取的文件和目录的路径(包括“动态路径”,该路径引用conf文件中定义的变量)。

目前,主脚本运行正常,能够同时获得conf文件和lib文件,但是当我在"ApplyPermissionFromCSVFile“中放置一些调试点时,似乎不会由bash解释”动态路径“。

主要剧本摘录:

代码语言:javascript
复制
######################################### 
includes 
##################################################

# this section can _almost_ be copied as-is ;-)

nameOfThisScript=$(basename "${BASH_SOURCE[0]}")
directoryOfThisScript="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"


configFile="$directoryOfThisScript/$nameOfThisScript.conf"
functionsFile="$directoryOfThisScript/safeScriptsFunctions.sh"
permissionLib="$directoryOfThisScript/permission_lib.sh"

permissionFile="$directoryOfThisScript/$nameOfThisScript.permissionFile.csv"

for fileToSource in "$configFile" "$functionsFile" "$permissionLib"; do
        source "$fileToSource" 2>/dev/null || {
                echo "File '$fileToSource' not found"
                exit 1
                }
done
#Main Loop to read CSV File is called in permissionLib.sh
ApplyPermissionFromCSVFile $permissionFile

conf文件的摘录(实际文件名替换为示例):

代码语言:javascript
复制
totovariable="/usr/local"
tatavariable="$totovariable/bin"

csv文件的摘录:

代码语言:javascript
复制
$totovariable;someuser;somegroup;0600
$tatavariable;someuser;somegroup;0600

权限库文件的提取:

代码语言:javascript
复制
function ApplyPermissionFromCSVFile {
        local csvFileName="$1"
        local fieldNumberFileName=1
        local fieldNumberOwner=2
        local fieldNumberGroupOwner=3
        local fieldNumberPermissions=4

        while read csvLine
        do
                fileName=$(getFieldFromCsvLine "$fieldNumberFileName" "$csvLine")
                fileOwner=$(getFieldFromCsvLine "$fieldNumberOwner" "$csvLine")
                fileGroupOwner=$(getFieldFromCsvLine "$fieldNumberGroupOwner" "$csvLine")
                filePermissions=$(getFieldFromCsvLine "$fieldNumberPermissions" "$csvLine")
                permissionArray[0,0]="$fileName|$fileOwner|$fileGroupOwner|$filePermissions"
                echo "${permissionArray[0,0]}"
        done < "$csvFileName"
}

getFieldFromCsvLine() {
        csvFieldSeparator=';'
        fieldNumber="$1"
        csvLine="$2"
        echo "$csvLine" | cut -d "$csvFieldSeparator" -f "$fieldNumber"
}

不要为循环在每次迭代时覆盖值这一事实而费心,这不是这里的目的(而是选择答案:p)。

产出的结果:

代码语言:javascript
复制
$totovariable|someuser|somegroup|0600
$tatavariable|someuser|somegroup|0600

Changing owner to someuser:somegroup for file $tatavariable
chown: cannot access '$tatavariable': No such file or directory
Changing permissions to 0600 for file $tatavariable
chmod: cannot access '$tatavariable': No such file or directory

经过一些调查研究后,这似乎是正常的:

  • conf文件来源(按主脚本)
  • lib文件的来源(按主脚本)
  • csv文件不是源文件,而是读取文件(按lib中的函数)。因此bash将变量内容视为“纯字符串”,而不是变量。

问题是,在主脚本级别上,我无法清楚地看到应该如何并在哪里用它的值(在.conf文件中定义并由主脚本来源)替换“纯字符串”变量?在库级使用全局变量?

我发现的实际解决方案:

  • sed代用品
  • 使用法

任何帮助都是值得感激的。

EN

回答 1

Stack Overflow用户

发布于 2019-03-21 14:41:07

使用的解决方案:

代码语言:javascript
复制
fileName=eval echo "$fileName"

由于.csv文件中的路径可能包含"$“符号,所以Bash参数展开不会在每种情况下都有效。

示例:包含以下csv内容:

代码语言:javascript
复制
$tatavariable;someuser;somegroup;0600
$totovariable/thisotherfile.txt;someuser;somegroup;0660
$totovariable;someuser;somegroup;0600
/home/someuser/lolzy.txt;someuser;somegroup;0666

和以下conf文件:

代码语言:javascript
复制
totovariable="/home/someuser/fack"
tatavariable="$totovariable/thisfile.txt"

以下bash代码(在大多数情况下不强烈推荐)将适用于每种情况(包含$符号或不包含$符号):

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

#########################
# Function
#########################

getFieldFromCsvLine() {
        local csvFieldSeparator=';'
        local fieldNumber="$1"
        local csvLine="$2"
        echo "$csvLine" | cut -d "$csvFieldSeparator" -f "$fieldNumber"
}

#########################
#Core Script
#########################

source configFile.conf

csvFileName="permissionFile.csv"
fieldNumberFileName=1
fieldNumberOwner=2
fieldNumberGroupOwner=3
fieldNumberPermissions=4

while read csvLine
do
        fileName=$(getFieldFromCsvLine "$fieldNumberFileName" "$csvLine")
        fileOwner=$(getFieldFromCsvLine "$fieldNumberOwner" "$csvLine")
        fileGroupOwner=$(getFieldFromCsvLine "$fieldNumberGroupOwner" "$csvLine")
        filePermissions=$(getFieldFromCsvLine "$fieldNumberPermissions" "$csvLine")

        #Managing Variables used as 'Dynamic path'
        fileName=$(eval echo "$fileName")
        echo "Content of \$fileName is $fileName"

done < "$csvFileName"

结果:

代码语言:javascript
复制
[someuser@SAFEsandbox:~]$ ./simpletest.sh
Content of $fileName is /home/someuser/fack/thisfile.txt
Content of $fileName is /home/someuser/fack/thisotherfile.txt
Content of $fileName is /home/someuser/fack
Content of $fileName is /home/someuser/lolzy.txt

下面的bash代码(基于bash参数展开)将引发错误:

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

#########################
# Function
#########################

getFieldFromCsvLine() {
        local csvFieldSeparator=';'
        local fieldNumber="$1"
        local csvLine="$2"
        echo "$csvLine" | cut -d "$csvFieldSeparator" -f "$fieldNumber"
}

#########################
#Core Script
#########################

source configFile.conf

csvFileName="permissionFile.csv"
fieldNumberFileName=1
fieldNumberOwner=2
fieldNumberGroupOwner=3
fieldNumberPermissions=4

while read csvLine
do
        fileName=$(getFieldFromCsvLine "$fieldNumberFileName" "$csvLine")
        fileOwner=$(getFieldFromCsvLine "$fieldNumberOwner" "$csvLine")
        fileGroupOwner=$(getFieldFromCsvLine "$fieldNumberGroupOwner" "$csvLine")
        filePermissions=$(getFieldFromCsvLine "$fieldNumberPermissions" "$csvLine")

        #Managing Variables used as 'Dynamic path'
        fileName=${!fileName}
        echo "Content of \$fileName is $fileName"

done < "$csvFileName"

.csv包含$符号时的行为示例:

代码语言:javascript
复制
[someuser@SAFEsandbox:~]$ ./simpletest.sh
./simpletest.sh: line 35: $tatavariable: bad substitution

当您删除.csv文件中的$符号,但其中仍然存在增量路径概念时,行为示例:

代码语言:javascript
复制
[someuser@SAFEsandbox:~]$ ./simpletest.sh
Content of $fileName is /home/someuser/fack/thisfile.txt
./simpletest.sh: line 35: totovariable/thisotherfile.txt: bad substitution

在这里使用bash参数展开(在大多数情况下都是推荐的)并不容易,因为它强制管理脚本中的2种情况:

  • 包含引导$或serveral $(连接变量路径)的路径。
  • 路径不包含前导$或serveral $ (contatenated变量路径)

问候

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

https://stackoverflow.com/questions/55261964

复制
相关文章

相似问题

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