sirve scripts script resueltos que programas programacion pasar parametros para ejercicios ejemplos comandos bash su

scripts - ¿Cómo ejecutar un grupo de comandos como otro usuario en Bash?



scripts bash ejemplos (3)

No soy tan bueno con bash-foo, así que es inevitable que sea una forma más elegante, pero he abordado este problema en el pasado mediante el uso de varios scripts y un "controlador"

P.ej

Conductor

#!/bin/bash set -e su root script1 su somebody script2

Script1

#!/bin/bash set -e root_command -p param1 # run as root

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''

Ya hay algunas preguntas existentes aquí sobre ejecutar comandos como otro usuario. Sin embargo, las preguntas y respuestas se centran en un único comando en lugar de un largo grupo de comandos.

Por ejemplo, considere la siguiente secuencia de comandos:

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

Hay un par de puntos importantes a tener en cuenta aquí:

  • Los últimos tres comandos se deben ejecutar como otro usuario que use su o sudo . En el ejemplo, había tres comandos, pero supongamos que hubiera muchos más ...

  • Los comandos mismos hacen uso de comillas simples y dobles.

El segundo punto anterior impide el uso de la siguiente sintaxis:

su somebody -c "command"

... ya que los comandos mismos contienen comillas.

¿Cuál es la forma correcta de "agrupar" los comandos y ejecutarlos en otra cuenta de usuario?


Prueba esto:

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

<< introduce un aquí-doc . El siguiente token es el delimitador, y todo hasta una línea que comienza con el delimitador se alimenta como entrada estándar al comando. Al poner el delimitador en comillas simples, se evita la sustitución de variables dentro de 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