背景
我一直觉得这个问题是XY问题。标题暗示他们想要任何东西,/root/.bashrc
但真正要问的是此文件中的别名是什么-普遍认为这样做是不可能的- 为什么我的Bash脚本不能识别别名?。
基本上是设计使然,您的别名不会被sudo
携带,因为它们不便于携带,这也是我对它们的看法。
脚本和任何可能在给定盒子上运行的软件都不应假定用户环境中存在任何内容。但是我意识到,在某些情况下,给定用户帐户中可能会有一些别名,而在$HOME/.bashrc
其他情况下,其他人可能希望利用这些别名。
为此,您可以简单地告诉Bash解释器,以扩展它在登录过程中发现的别名,而不是使用时遇到的常规shell行为sudo
。
例
设定
为了进行设置,我在根用户/root/.bashrc
和/root/.bash_profile
文件中添加了以下别名,环境变量和函数。
$ grep smurf ~/.bashrc
alias brc_smurf='echo "ran alias from /root/.bashrc"'
export brc_smurf_env='var from /root/.bashrc'
bpf_smurf_func() { echo 'ran func from /root/.bash_profile'; }
$ grep smurf ~/.bash_profile
alias bpf_smurf='echo "ran alias from /root/.bash_profile"'
export bpf_smurf_env='var from /root/.bash_profile'
brc_smurf_func() { echo 'ran func from /root/.bashrc'; }
不做任何事情,这些工作都没有(不足为奇):
$ sudo brc_smurf
sudo: brc_smurf: command not found
$ sudo bpf_smurf
sudo: bpf_smurf: command not found
我们看到,在以下alias
命令中运行时,该命令没有显示别名sudo
:
$ sudo alias
$
此行为表明您不应期望别名可访问。但是我们继续...
步骤#1-可见的别名
如果我们运行,bash -ci
我们可以诱使Bash至少阅读我们的内容$HOME/.bashrc
:
$ sudo bash -ci 'alias' | grep smurf
alias brc_smurf='echo "ran alias from /root/.bashrc"'
很酷,也许我们可以运行它?
$ sudo bash -ci 'alias; brc_smurf'
bash: alias; brc_smurf: No such file or directory
第2步 - shopt -s expand_aliases
不。同样,这是设计使然,我们正在做我们不应该做的事情,因此有很多“安全性”必须禁用。另一个“安全”是Bash。
$ sudo bash -ci 'shopt -s expand_aliases; alias; brc_smurf'
alias brc_smurf='echo "ran alias from /root/.bashrc"'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
ran alias from /root/.bashrc
在这里,我们可以看到消息/root/.bashrc
,我们已经成功执行了root用户的alias brc_smurf
。
步骤#3-环境变量如何?
如果您使用的是上面显示的方法,那么这些现在也应该可以使用。
$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env'
ran alias from /root/.bashrc
var from /root/.bashrc
步骤#4-函数如何?
这些也按预期工作:
$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env;brc_smurf_func'
ran alias from /root/.bashrc
var from /root/.bashrc
ran func from /root/.bashrc
TLDR;
您可以执行以下操作来访问环境变量+别名/root/.bashrc
:
$ sudo bash -ci 'shopt -s expand_aliases; <cmds>'
外卖
此方法启用的内容/root/.bashrc
,但不提取的内容/root/.bash_profile
。
参考文献
/root/.bashrc
但实际上问号后面的内容是该文件的别名-这是不可能的-unix.stackexchange.com/questions/1496/…。