我正在尝试制作这样的脚本:
#!/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...