以其他用户身份使用命令运行 bash 子 shell,而不返回到父 shell

以其他用户身份使用命令运行 bash 子 shell,而不返回到父 shell

作为我追求的一部分切换到非 root 用户时保留 bashrc 和 vimrc,我计划创建一些超级难看的别名来切换到其他用户,立即执行一些命令,然后在他们的提示下将我删除。

使用初始命令运行交互式 bash 子 shell,而不立即返回(“超级”) shell似乎没有回答我的问题。bash --init-file <(echo "ls; pwd; a=7")按预期工作;但sudo bash --init-file <(echo "ls; pwd; a=7")不返回任何内容;没有任何内容从orecho $a打印到终端。lspwd

为什么第一个命令有效,但第二个命令不起作用?如何制作一个 bash 命令来执行其他用户 shell 中的命令,这些命令会持续更改环境变量,然后访问该 shell?请注意,这更多的是为了切换到其他非 root 用户;我已经有了适用于 root 的不同解决方案

答案1

% echo <(echo "ls; pwd; a=7")
/proc/self/fd/11
% bash
$ echo <(echo "ls; pwd; a=7")
/dev/fd/63

因此该<(...)表单实际上是特定于 shell 的文件描述符的路径,其他进程可能无法使用该路径;特别是一个bash实际上是一根管道:

$ function hmm() { ls -al $1; }
$ hmm <(echo pwd)
lr-x------ 1 jhqdoe jhqdoe 64 Aug 21 14:58 /dev/fd/63 -> pipe:[910134]

sudo出于安全原因,默认情况下会尽力关闭所有这些文件描述符(请参阅--close-from中的选项文档sudo(8))。您也许可以通过 然后 来摆动这些文件描述符之一(如果安全策略允许并且您可以承受风险closefrom_override--close-from

另一种方法是使用expect,然后在运行一些命令后将东西交给用户:

#!/usr/bin/env expect
spawn -noecho bash
expect -ex {$}
send "pwd\r"
expect -ex {$}
interact

相关内容