如何在Bash中作为另一个用户执行一组命令?

Nat*_*man 65 bash su

这里已经存在一些关于将命令作为另一个用户运行的问题.但是,问题和答案集中在单个命令而不是一组长命令上.

例如,请考虑以下脚本:

#!/bin/bash
set -e

root_command -p param1  # run as root

# these commands must be run as another user
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'
Run Code Online (Sandbox Code Playgroud)

这里有几点需要注意:

  • 最后三个命令必须作为另一个用户使用su或运行sudo.在示例中有三个命令,但假设还有更多...

  • 命令本身使用单引号和双引号.

上面的第二点阻止使用以下语法:

su somebody -c "command"
Run Code Online (Sandbox Code Playgroud)

...因为命令本身包含引号.

什么是"分组"命令并在另一个用户帐户下运行它们的正确方法?

Bar*_*mar 147

试试这个:

su somebody <<'EOF'
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'
EOF
Run Code Online (Sandbox Code Playgroud)

<<介绍一个here-doc.下一个标记是分隔符,直到以分隔符开头的行的所有内容都作为标准输入提供给命令.将分隔符放在单引号中可防止here-doc中的变量替换.

  • 如果使用`<< EOF`而不是`<<'EOF`',那么here-doc中的变量将被扩展. (8认同)
  • 这将是一些有用的:如果你需要的命令实际上在用户的完整环境中运行,就好像他们已经登录,其中可能包括不同的路径,例如.在'某人'之前加上他们的连字符,就像这样:su - 某人...... (6认同)
  • 关闭EOF之前,请确保没有空格(例如,从缩进的“ if”语句调用时)。否则会引发错误-请参阅http://www.tldp.org/LDP/abs/html/here-docs.html (3认同)
  • 如果遇到"su:必须从终端运行",请尝试"sudo su somebody << EOF". (2认同)

ste*_*ton 7

我对bash-foo不是那么好,所以有一种更优雅的方式,但我过去通过使用多个脚本和一个"驱动程序"来解决这个问题

例如

司机

#!/bin/bash
set -e

su root script1
su somebody script2
Run Code Online (Sandbox Code Playgroud)

SCRIPT1

#!/bin/bash
set -e

root_command -p param1  # run as root
Run Code Online (Sandbox Code Playgroud)

SCRIPT2

#!/bin/bash
set -e

# these commands must be run as another user
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'
Run Code Online (Sandbox Code Playgroud)