Shell脚本(不是bash):如何将脚本重定向到su root?

3qpi33ja  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(151)

关于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脚本解释器运行?

frebpwbc

frebpwbc1#

如果你只是问如何在你使用的shell不支持herestring的情况下执行herestring,那么:

su root -c '/some/foo/command' << EOF
somepass
EOF

我不能写这个响应,至少要说明这样传递密码是不安全的。

ht4b089n

ht4b089n2#

如果我没理解错你的问题,有几种可能性。

选项1:使用wsl.exe以root身份运行,无需密码

首先,作为对WSL的一种“破解”,* 可能 * 没有理由需要首先输入密码。只要启用了WSL的Windows Interop特性(默认情况下是这样),您就可以简单地在 * WSL内 * 调用wsl.exe命令,使用如下命令将用户提升为root用户:

wsl.exe ~ -u root -e /some/foo/command

在这种情况下不需要密码。正如您所说,由于这是WSL,因此强制使用 Windows 用户的安全模型。
当然,此表单假定脚本:
1.具有指向正确shell/解释器的shebang
1.用可执行位设置
如果没有shebang行,并且您需要指定运行脚本的shell或解释器,则可以使用如下代码:

wsl.exe ~ -u root -e bash -lic /some/foo/command

参数说明:

  • ~是使用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放在您的工具带中,以备其他类似的可能情况使用。

相关问题