我有一个用户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
我正在复制然后更改组,所以每次更改所有匹配模式的文件的组。
答案 0 :(得分:4)
另一种方法是使用sg
:
sg usergroup bash
它召唤另一个活动组为usergroup
的shell。如果退出,它会恢复原状。
您还可以使用usermod
更改用户的主要群组。它使其成为每次登录的默认设置。
usermod -g usergroup user
另一种方法是使用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
这是一个更好的解决方案,因为它会在正常情况下安静地运行时显示任何警告或错误消息。