Bash,调用新 shell 后执行命令

Bash,调用新 shell 后执行命令

我正在尝试制作这样的脚本:

#!/bin/bash
sudo -s
something...

当我执行它时,我会得到一个新的 shell,但something只有当我退出由 创建的 shell 时才会执行sudo -s,而不是在其中执行。

有什么帮助吗?

答案1

另一种方法是将完整的 bash 命令传递给sudo

#!/bin/bash
sudo bash -c 'command1; command2; command3;'

然而,更好的方法是启动脚本sudo相反。将其sudo放入脚本中并不是一个好主意。最好以 root 权限运行整个脚本 ( sudo script.sh)。如有必要,您可以使用sudo删除特定命令的权限。例如:

#!/usr/bin/env bash
whoami
echo $HOME
sudo -u terdon whoami  ## drop privileges for specific command.

运行上面的脚本返回:

$ sudo ~/scripts/a.sh
root
/root
terdon

答案2

问题是sudo -s没有任何参数将为 root 打开一个交互式 shell。

如果您只想使用运行单个命令sudo -s,您可以简单地执行以下操作:

sudo -s command

例如 :

$ sudo -s whoami
root

或者您可以在这里使用字符串:

$ sudo -s <<<'whoami'
root

如果您有多个命令,可以在此处使用 doc :

$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--

答案3

伯恩外壳有一个-c标志,您可以使用它来将任意脚本传递到 shell,这样您就可以编写类似的内容

sudo sh -c 'something'

然而,这仅对最简单的命令有用,因为正确引用脚本非常麻烦,如果通过以下方式将命令发送到远程服务器,则更加不便SSH因为参数脚本将被分析两次,一次在发送脚本的一侧,一次在运行脚本的一侧。

如果something是一个复杂的脚本或者需要传递一个SSH行,通常的做法是编写一个函数,prepare_something_script其工作是在其上编写脚本“某事”标准输出。在最简单的形式中,该函数可以使用此处文档来生成其输出:

prepare_something_script()
{
  cat <<EOF
something
EOF
}

prepare_something_script然后可以使用 授予的权限在本地执行生成的脚本须藤如下:

prepare_something_script | sudo sh

在必须使用授予的权限远程执行脚本的场景中须藤通常以 Base 64 对脚本进行编码,以避免重定向标准输入SSH, 像这样:

something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"

如果您在函数中使用该代码,请不要忘记标记某事64变量为当地的。的一些实现64位基数提供一个-d要解码的标志,与详细变体相比,它的支持较差--decode。某些实现需要-w 0在编码命令中添加 a以避免虚假换行。

答案4

您需要在 sudo -s 之前添加命令,而不是在下一行中。

sudo -s something...

相关内容