我的很多工作流程涉及使用 sudo 交互式会话 ( sudo -i
) 作为服务用户,该用户能够运行我的个人用户名无法运行的某些操作。当我这样做时,我喜欢保留 PS1 变量和其他一些 bash 细节。由于我无法修改服务用户的.bashrc
,因此我在我的主目录中设置了一个脚本来按照我喜欢的方式导出它。例如,我的工作流程可能如下所示:
ssh me@remote
sudo -i -u service_user
. /home/me/ps1.sh
*service user commands here*
exit
我想滚动 sudo 命令并将 PS1 脚本源到一个命令中。我的想法是使用类似的东西sudo -i -u service_user -c sh ". /home/me/ps1.sh"
,它将传递命令 - 问题是会话将在命令运行后立即退出,而不是挂在交互模式下。除了请求管理员允许通过 sudo 保留 PS1 变量之外,我还能做些什么吗?
答案1
您可以使用--rcfile
告诉 bash 读取您的ps1.sh
文件而不是service_user
's .bashrc
:
sudo -i -u service_user bash --rcfile /home/me/ps1.sh
然后执行流程将类似于sudo
运行bash -lc 'bash --rcfile /home/me/ps1.sh'
as service_user
。如果您想获取 的来源service_user
,.bashrc
可以在ps1.sh
文件中执行此操作。
in不是“交互式”的,它-i
是sudo -i
登录shell(即,启动一个 shell,它将处理目标用户.profile
或等效用户并运行给定的命令)。这就是为什么执行会bash -l
包装实际命令。如果service_user
s.profile
无关紧要,您可以这样做:
sudo -u service_user bash --rcfile /home/me/ps1.sh