我在Linux服务器上设置了一个Mercurial存储库,有些(但不是全部)用户有权推送它。它们通过ssh连接到存储库。
这些用户是unix组的成员。下面是我用来更改存储库以允许它从它们接收推送的脚本。
这可以改善吗?这里有不必要的操作吗? bash
脚本有什么不好的风格吗?
#!/bin/bash
if [[ $# -lt 2 ]]; then
echo Usage: $0 directory groupname
exit 1
fi
if ! chown -R :$2 $1; then
echo chown failure
exit 2
fi
if ! find $1/.hg -type d -exec chmod g+s {} \;; then
echo chmod failure
exit 3
fi
if ! find $1 -perm -u+r -exec chmod g+r {} \;; then
echo chmod failure 2
exit 4
fi
if ! find $1 -perm -u+w -exec chmod g+w {} \;; then
echo chmod failure 3
exit 5
fi
if ! find $1 -perm -u+x -exec chmod g+x {} \;; then
echo chmod failure 4
exit 6
fi
答案 0 :(得分:1)
一些小问题:通过使用>&2
重定向将错误消息回显给stderr是个好主意。并且您应该在变量周围添加双引号,以便您的脚本可以使用包含空格的文件名。
您可以将初始行更改为#!/bin/bash -e
,以便在出现错误时立即退出脚本。这可以让你删除所有if
语句。或者,如果您想要更多控制,可以使用trap ERR
命令调用自定义错误处理代码:
#!/bin/bash
function uhoh() {
echo "error in script!" >&2
exit 1
}
trap uhoh ERR
if [[ $# -lt 2 ]]; then
echo "Usage: $0 directory groupname" >&2
exit 1
fi
chown -R :"$2" "$1"
find "$1"/.hg -type d -exec chmod g+s {} \;
find "$1" -perm -u+r -exec chmod g+r {} \;
find "$1" -perm -u+w -exec chmod g+w {} \;
find "$1" -perm -u+x -exec chmod g+x {} \;
如果你想在出现故障时立即停止脚本,我个人会选择/bin/bash -e
选项。我认为检查每个命令的结果并为每个命令设置不同的退出代码是过度的。你不需要那么强大,没有人会为退出代码3与退出代码4做任何不同的事情......
答案 1 :(得分:1)
使用-exec运行find会为每个文件启动单独的chown进程。如果您这样做,您将获得更少的流程捶打(以及更快的速度):
find "$1"/.hg -type d -print0 | xargs chmod g+s
find "$1" -perm -u+r -print0 | xargs chmod g+r
find "$1" -perm -u+w -print0 | xargs chmod g+w
find "$1" -perm -u+x -print0 | xargs chmod g+x
顺便说一句,您是否看过Mercurial的ACL Extension与hg-ssh的组合?只要唯一的访问权限是ssh,它就会做同样的事情。