作为我追求的一部分切换到非 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
打印到终端。ls
pwd
为什么第一个命令有效,但第二个命令不起作用?如何制作一个 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