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

这里已经询问了关于作为另一个用户运行命令的 一些现有的问题。但是,问答集中在 一个简单的命令上,而不是一长串命令。

例如,考虑以下脚本:

#!/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'

这里有几点要注意:

  • 最后三个命令必须作为另一个使用 susudo的用户运行。在这个例子中有三个命令,但是假设有更多的..。

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

上述第二点防止使用以下语法:

su somebody -c "command"

因为命令本身包含引号。

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

100202 次浏览

我对 Bash-foo 不是很了解,所以一定会有一种更优雅的方式,但我过去曾使用多个脚本和一个“驱动程序”来解决这个问题。

例如:

司机

#!/bin/bash
set -e


su root script1
su somebody script2

脚本一

#!/bin/bash
set -e


root_command -p param1  # Run as root

脚本2

#!/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'

试试这个:

su somebody <<'EOF'
command1 -p 'parameter with "quotes" inline'
command2 -p 'parameter with "quotes" inline'
command3 -p 'parameter with "quotes" inline'
EOF

<<引入了 给你,医生。下一个标记是分隔符,以分隔符开头的行之前的所有内容都作为标准输入提供给命令。将分隔符放在单引号中可以防止在 here-doc 中进行变量替换。

此脚本检查当前运行该脚本的用户是否是所需的用户。如果没有,那么脚本将与所需的用户一起重新执行。

#!/usr/bin/env bash


TOKEN_USER_X=TOKEN_USER_X
USER_X=peter # other user!


SCRIPT_PATH=$(readlink -f "$BASH_SOURCE")


if [[ "$@" != "$TOKEN_USER_X" ]]; then


###### RUN THIS PART AS the user who started the script


echo "This script is $SCRIPT_PATH"


echo -n "Current user: "
echo $USER


read -p "insert: "
echo "got $REPLY"


su - $USER_X -c "$SCRIPT_PATH $TOKEN_USER_X" # execute code below after else (marked #TOKEN_USER_X)


else
#TOKEN_USER_X -- come here only if script received one parameter TOKEN_USER_X


###### RUN THIS PART AS USER peter


echo
echo "Now this script is $SCRIPT_PATH"


echo -n "Current user: "
echo $USER


read -p "insert: "
echo "got $REPLY"


exit 0
fi


echo
echo "Back to initial user..."
echo -n "Current user: "
echo $USER