关于su root -c '/some/foo/command' <<<'somepass'
,我们不能在shell(不是bash)env中使用字符串输入重定向。
我的盒子是在WSLv 2上的alpine,所以安全性不是问题,因为它是一个windows + WSLv 2 dev盒子。这个脚本不能用bash运行,因为它是一个/etc/profile.d/.sh脚本,在用户登录之前运行,并且总是使用shell而不是bash,所以我不能改变它使用bash的方式,有没有可能在不使用像bash那样的平面文件的情况下将密码传递给输入,或者是否有办法强制/etc/profile.d/.sh脚本使用bash而不是普通shell脚本解释器运行?
2条答案
按热度按时间frebpwbc1#
如果你只是问如何在你使用的shell不支持herestring的情况下执行herestring,那么:
我不能写这个响应,至少要说明这样传递密码是不安全的。
ht4b089n2#
如果我没理解错你的问题,有几种可能性。
选项1:使用
wsl.exe
以root身份运行,无需密码首先,作为对WSL的一种“破解”,* 可能 * 没有理由需要首先输入密码。只要启用了WSL的Windows Interop特性(默认情况下是这样),您就可以简单地在 * WSL内 * 调用
wsl.exe
命令,使用如下命令将用户提升为root用户:在这种情况下不需要密码。正如您所说,由于这是WSL,因此强制使用 Windows 用户的安全模型。
当然,此表单假定脚本:
1.具有指向正确shell/解释器的shebang
1.用可执行位设置
如果没有shebang行,并且您需要指定运行脚本的shell或解释器,则可以使用如下代码:
参数说明:
~
是使用WSL设置用户(在本例中为root)主目录的公共起始目录的好方法。它必须是wsl.exe
命令后的第一个参数。-u
(--user
)指定了WSL分发中要作为其运行的用户-e
(--exec
)是代替或作为shell运行的可执行文件。例如,wsl.exe -e ps -efH
(当没有运行任何其他程序时)将 * 只 * 运行ps
命令,没有“所属”进程/shell。bash -l
把它当作一个登录shell,这样你的配置文件就可以在启动时获得。如果没有这个,你可能会丢失必要的环境变量或者你的命令的其他配置。但是,如果你 * 不 * 需要这个命令,就不要使用它,因为不获得你的配置文件可能会提高执行速度。bash -i
和上面的一样,但是是用于“交互式”shell的,这样你的rc文件(例如~/.bashrc
)就是源代码。同样,如果不需要的话,不要使用它,这很可能不会用于root
执行脚本。bash -c
是要在shell中运行的命令字符串。选项2:将密码传递给
sudo
根据this Super User answer,使用
sudo -S
接受来自标准输入的密码。(可能)选项3:期待
我昨晚在类似的环境中考虑了这个问题,我相信
expect
可以用于这种情况。我还没有机会在我的用例中试用它。当然,对于您的用例,前两个选项几乎肯定更容易,也更健壮。但是,请将
expect
放在您的工具带中,以备其他类似的可能情况使用。