当另一个用户执行别名命令失败时

当另一个用户执行别名命令失败时

不确定我在这里做错了什么。

User2 在其 .bash_profile 中获取一个文件来设置环境特定的别名。

# .bash_profile
source $HOME/set_environment_shortcuts

在 $HOME/set_environment_shortcuts 里面(这里有很多别名)。例子:

alias startservices="verylongcommand"

现在我想“从另一个用户启动服务”。

[User1@server1 ~]$ sudo su -l User2 -c '. ~/.bash_profile; startservices'
-bash: startservices: command not found

runuser 命令产生相同的结果。

[User1@Server1 ~]$ sudo runuser -l User2 -c '. ~/.bash_profile; startservices'
-bash: startservices: command not found

别名不能以这种方式工作吗?

请注意,当完全绕过别名时,该命令有效。

答案1

当 shell 非交互式时,别名不会扩展,除非expand_aliases使用 来设置 shell 选项shopt -s expand_aliases

别名是一种交互式使用的快捷工具。对于任何类型的脚本,请改用 shell 函数:

startservices () {
    # commands go here
}

Shell 函数在很多方面都比别名灵活得多。对于初学者来说,它们能够像 shell 脚本一样接受参数:

startservices () {
    user="$1"
    service="$2"
    # code to start service "$service" as user "$user"
}

您不必明确获取其他用户的来源.bash_profile。代替使用sudo -i。这将启动一个登录 shell,.bash_profile启动时将读取:

$ sudo -i -u User2 startservices

这需要startservices是 中的脚本或其他外部实用程序、在$PATHUser2shell 启动文件中定义的 shell 函数,或者是在 的 shell 启动文件中定义的User2别名(使用 set 运行 shell ) 。expand_aliasesUser2

也可以看看是否有充分的理由运行 sudo su?

答案2

别名在 user1 的 .bash_profile 中定义。当您使用“su -l user2”时,它实际上会清除 user1 的所有环境变量并加载 user2 的变量,其中未定义“startservices”别名。

您可以使用“su -p”选项来保留当前环境,但在这种情况下,user2 必须具有 user1 的 .bashrc 文件的读取权限。

相关内容