如何在bash脚本中获取不同用户的$HOME目录?
我需要执行一部分bash脚本作为不同的用户,并在该用户的$ HOME目录内。但是,我不知道如何确定这个变量。切换到该用户并调用$ HOME不能提供正确的位置:
# running script as root,but switching to a different user... su - $different_user echo $HOME # returns /root/ but should be /home/myuser 更新: 似乎问题是,我试图切换用户在我的脚本的方式: $different_user=deploy # create user useradd -m -s /bin/bash $different_user echo "Current user: `whoami`" # Current user: root echo "Switching user to $different_user" # Switching user to deploy su - $different_user echo "Current user: `whoami`" # Current user: root echo "Current user: `id`" # Current user: uid=0(root) gid=0(root) groups=0(root) sudo su $different_user # Current user: root # Current user: uid=0(root) gid=0(root) groups=0(root) 在bash脚本中作为不同用户切换用户和执行命令的正确方法是什么?
更新:根据这个问题的标题,人们似乎来到这里只是寻找一种方法来找到一个不同的用户的主目录,而不需要模仿那个用户。
在这种情况下,最简单的解决方案是使用用户名为感兴趣的tilde expansion,结合eval(这是必需的,因为用户名必须作为无引号文字为了波浪号展开工作): eval echo "~$different_user" # prints $different_user's home dir. 注:通常caveats regarding the use of 相比之下,本回答的其余部分涉及冒充用户并在该用户的主目录中执行操作。 注意: >默认情况下管理员和其他用户(如果通过sudoers文件授权)可以通过sudo模拟其他用户。 作为另一个用户执行命令的基本形式是: sudo -H -u someUser someExe [arg1 ...] # Example: sudo -H -u root env # print the root user's environment 注意: >如果您忽略指定-H,模拟进程(在指定用户的上下文中调用的进程)将在$ HOME中报告原始用户的主目录。 可选地,您可以通过或通过(n模拟)shell运行模拟进程,方法是将someExe前缀为-i或-s – 不指定someExe …创建一个交互式shell: > -i为someUser创建一个登录shell,这意味着以下内容: > someUser的用户特定shell配置文件(如果已定义)将被加载。 > -s创建一个非登录shell: >没有加载shell配置文件(虽然交互式非登录shell的初始化文件是例如?/ .bashrc) 使用shell意味着在命令行上传递的字符串参数可能受到模拟shell(可能在调用shell初始扩展之后)的shell扩展 – 见下面的平台特定的区别。比较以下两个命令(使用单引号防止调用shell过早扩展): # Run root's shell profile,change to root's home dir. sudo -u root -i eval 'echo $SHELL - $USER - $HOME - $PWD' # Don't run root's shell profile,use current working dir. # Note the required -H to define $HOME as root`s home dir. sudo -u root -H -s eval 'echo $SHELL - $USER - $HOME - $PWD' 调用的shell由“SHELL环境变量(如果已设置)或shell在passwd(5)中指定”(根据man sudo)确定。注意,使用-s它是调用用户的环境很重要,而-i它是被模拟的用户的。 请注意,有关shell相关行为(使用-i或-s)的平台差异: > sudo on Linux显然只接受一个可执行文件或内建名称作为-s / -i之后的第一个参数,而OSX允许传递整个shell命令行;例如,OSX直接接受sudo -u root -s’echo $ SHELL – $ USER – $ HOME – $ PWD'(不需要eval),而Linux不(从sudo 1.8.95p开始)。 无论模拟进程是否涉及shell,其环境都将设置以下变量,反映调用的用户和命令:SUDO_COMMAND,SUDO_USER,SUDO_UID =,SUDO_GID。 看到人sudo和人sudoers更多的微妙。 提示帽子@DavidW和@Andrew的灵感。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |