写入文件在Linux中使用另一个组

时间:2014-08-14 04:31:07

标签: linux shell unix

我有一个用户ID操作,它属于sysgroup,usergroup等多个组。当我在默认情况下写入其他用户目录时,它正在sysgroup下写入。但对于某些用户,我需要使用usergroup权限进行编写。我怎么能实现这个目标呢?

这是我的示例代码

if ls n18_????_??????????.txt &> /dev/null; then
     cp n18_????_??????????.txt /export/home/user
     chgrp usergroup /export/home/user/n18_????_??????????.txt
     mv n18_????_??????????.txt $archDir
fi

我正在复制然后更改组,所以每次更改所有匹配模式的文件的组。

3 个答案:

答案 0 :(得分:4)

SG

另一种方法是使用sg

sg usergroup bash

它召唤另一个活动组为usergroup的shell。如果退出,它会恢复原状。

usermod命令

您还可以使用usermod更改用户的主要群组。它使其成为每次登录的默认设置。

usermod -g usergroup user

请参阅sgusermod

须藤

另一种方法是使用sudo。请参阅此thread

sudo -g usergroup id -gn  ## Verify that it works.
sudo -g usergroup bash

脚本解决方案

您可以使用sudo重新调用脚本。

#!/bin/bash
if [[ $1 == __GROUP_CHANGED__ ]]; then
    shift
else
    exec /usr/bin/sudo -g users "$0" __GROUP_CHANGED__ "$@"
fi

或者

#!/bin/sh
if [ "$1" = __GROUP_CHANGED__ ]; then
    shift
else
    exec /usr/bin/sudo -g users "$0" __GROUP_CHANGED__ "$@"
fi

该概念也可以与sg一起使用,但sg不接受该命令的原始参数。它只接受一个字符串参数并将其传递给/bin/sh。当您传递多个参数(尤其是那些带有空格的参数)时,这不是一个好方法。引用是一个很大的问题。

答案 1 :(得分:2)

首先:

newgrp wheel

然后:

touch newfile

文件位于wheel组中。来自newgrp手册页:

  
    

newgrp命令用于在登录会话期间更改当前组ID ....

  

您还可以更改文件组:

chown :usergroup oldfile

答案 2 :(得分:1)

install命令允许您在指定目标文件的所有权和权限时复制文件。

顺便提一下,您可能希望避免使用parsing ls output,但我不确定最常用的解决方案是什么。简单地忽略任何错误消息通常是一个坏主意,但也许它在这里是最简单的。 (这意味着你不会被通知,例如,如果你缺乏权限,那么!)

 install --group usergroup n18_????_??????????.txt /export/home/user 2>/dev/null &&
 mv n18_????_??????????.txt "$archDir"

请注意,此处存在竞争条件。如果在install执行期间出现与通配符匹配的新文件,mv即使未复制也会移走它们。如果你可以使用Bash-only结构,试试这个:

list=( n18_????_??????????.txt )  # Expands the wildcard only once
if [ -e "${list[0]}" ]; then
    install --group usergroup "${list[@]}" /export/home/user &&
    mv "${list[@]}" "$archDir"
fi

这是一个更好的解决方案,因为它会在正常情况下安静地运行时显示任何警告或错误消息。