必须确定所有用户主目录 - 代字号脚本问题

时间:2010-01-15 04:12:03

标签: bash tilde-expansion

假设某个用户有一个主目录/ home / someuser

NAME = SomeUser是否

在bash中 - 我用什么表达式组合使用tilde(〜)和$ NAME来返回用户主目录?

HOMEDIRECTORY=~someuser
echo $HOMEDIRECTORY
/home/someuser
NAME=someuser
echo ~$NAME
~someuser

有什么建议吗?

6 个答案:

答案 0 :(得分:16)

更安全

eval HOMEDIRECTORY="$(printf "~%q" "$NAME")"

此处%q选项printf引用并转义危险字符。

如果$NAME是乔,你会得到类似/home/joe的内容。对于root,您可能会获得/root。对于“abc; rm something”你会得到“〜abc; rm something”而不是删除某些内容。

答案 1 :(得分:6)

如果您有权访问getent

getent passwd "$NAME" | cut -d: -f 6

答案 2 :(得分:1)

Tilde(〜)它与$ HOME相同,所以并非所有用户都将以root用户身份归属于同一目录。

但是如果你坚持使用代字号,那就行了:

echo ~/../$NAME

见:

$ pwd
/home/oreyes
$ export NAME=john 
$ export DIRECTORYNAME=~/../$NAME
$ cd $DIRECTORYNAME
$ pwd
/home/john

答案 3 :(得分:1)

bash和csh之间的有趣区别,其中〜$ VARNAME实际上是你所期望的!

这很难看,但它似乎在bash中起作用:

homedir=`eval "echo ~$USERNAME"`

现在$ homedir保存与$ USERNAME相关联的主目录。

答案 4 :(得分:1)

最佳方法

必填:没有 ( n.b。,这与 getent 的技术相同,不需要 getent

home() { # returns empty string on invalid user
    grep "^$1:" /etc/passwd | cut -d ':' -f 6
}

# grep "^$user:" /etc/passwd | cut -d ':' -f 6
/var/lib/memcached

ROOT LINUX的NICE方法

必需:Linux, root (或 sudo

home() { # returns errorlevel 1 on invalid user
    su "$1" -s '/bin/sh' -c 'echo $HOME'
} 

# su memcached -s '/bin/sh' -c 'echo $HOME'
/var/lib/memcached

完全扩展的解决方案

magic() { # returns unexpanded tilde express on invalid user
    local _safe_path; printf -v _safe_path "%q" "$1"
    eval "ln -sf $_safe_path /tmp/realpath.$$"
    readlink /tmp/realpath.$$
    rm -f /tmp/realpath.$$
}

使用示例:

$ magic ~nobody/would/look/here
/var/empty/would/look/here

$ magic ~invalid/this/will/not/expand
~invalid/this/will/not/expand

治疗CSH的方法

这是一个BASH脚本,只需调用 csh

必填: csh

home() { # return errorlevel 1 on invalid user
    export user=$1; csh -c "echo ~$user"
}

$ export user=root; csh -c "echo ~$user"
/var/root

$ export user=nodfsv; csh -c "echo ~$user"
Unknown user: nodfsv.

解决方法

必填:手指(已弃用)

home() {
    finger -m "$1" | 
    grep "^Directory:" | 
    sed -e 's/^Directory: //' -e 's/ .*//'
}

# finger -m "haldaemon" | 
> grep "^Directory:" | 
> sed -e 's/^Directory: //' -e 's/ .*//'
/home/haldaemon

您可以将 grep 操作合并到 sed 中,但由于此方法很糟糕,我不会打扰。

答案 5 :(得分:0)

一种替代方式

awk -F":" '{print "user: "$1", Home directory is: "$6}' /etc/passwd