¿Cómo puedo correr como otro usuario?

20

Este es el código bash que debe ejecutarse. Entonces, primero sustituye al usuario para abrir el proyecto y luego ejecuta todo el código:

su openproject -c "bash -l" 
cd ~/openproject
git checkout Gemfile.lock
git pull

bundle install
RAILS_ENV="production" bundle exec rake db:migrate
RAILS_ENV="production" bundle exec rake db:seed
RAILS_ENV="production" bundle exec rake assets:precompile

He intentado cambiar el script anterior en esto:

su - openproject -c "cd ~openproject/openproject"

su - openproject -c "git checkout stable"

su - openproject -c "git checkout Gemfile.lock"
su - openproject -c "git pull"

su - openproject -c "bundle install"

su - openproject -c "RAILS_ENV="production" bundle exec rake db:migrate"
su - openproject -c "RAILS_ENV="production" bundle exec rake db:seed"
su - openproject -c "RAILS_ENV="production" bundle exec rake assets:precompile"

pero esto no funciona correctamente y en cada paso solicita la contraseña. ¿Cómo se puede mejorar el script traducido para que funcione?

ACTUALIZACIÓN 1:

Después de recibir sugerencias sobre esto, soy el punto donde el código ha sido modificado en:

cd ~openproject/openproject

sudo -u openproject git checkout stable

sudo -u openproject git checkout Gemfile.lock
sudo -u openproject git pull

# the output is good thill here
sudo -u openproject bundle install

sudo -u openproject RAILS_ENV="production" bundle exec rake db:migrate
sudo -u openproject RAILS_ENV="production" bundle exec rake db:seed
sudo -u openproject RAILS_ENV="production" bundle exec rake assets:precompile

La salida está bien hasta la línea que lo indica en el código. A partir de ahí me sale 4 error

sudo: paquete: comando no encontrado

ACTUALIZACIÓN 2:

Después de probar la sugerencia de Dmitry Vasilyanov, descubrí que si inserto el -i se simulará como inicio de sesión del usuario. Sin embargo, esta no es la forma final de hacerlo.

Si ejecuto echo $PATHdespués de iniciar sesión como proyecto abierto, la salida es/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

Si corro echo $PATHdespués de que su openproject -c "bash -l"la salida es/home/openproject/.rvm/gems/ruby-2.1.0/bin:/home/openproject/.rvm/gems/ruby-2.1.0@global/bin:/home/openproject/.rvm/rubies/ruby-2.1.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

bacalao
fuente
Tu quieres sudo, no su.
dawud
Tampoco puedes sudo (significativamente) cd, ya que es un shell incorporado.
MadHatter apoya a Monica el
¿Pero sudo no sustituye a la raíz? Soy root y quiero ejecutar el script como usuario de proyecto abierto, con efectos exactos como si iniciara sesión como usuario de proyecto abierto y comenzara desde el segundo comando (cd ~ / openproject)
1
No, sudose usa para ejecutarse como otro usuario, siendo rootel predeterminado si no se especifica nada, puede ejecutarlo perfectamente sudo -u openproject bundle install.
dawud
Supongo que está recibiendo el bundle: command not founderror porque se establece PATHo GEM_PATHen su .bash_profileo .bashrc, que no se ejecutan en los depósitos sin conectar / no interactivo, por lo que necesita para pasar -ia sudoal inicio de sesión simular, por ejemplo:sudo -iu openproject bundle install
Dmitry Vasilyanov

Respuestas:

19

¿Por qué no creas un script de shell y haces un

su - openproject -c "your_shell_script"

Tenga en cuenta el - antes del proyecto abierto. Eso establecerá las variables de entorno de openproject en lugar de las variables de entorno de su usuario.

YoMismo
fuente
Necesitaba agregar sudoal principio, de lo contrario, me pidió mi contraseña.
IanVaughan
sudotambién le pedirá la contraseña la primera vez que la ejecute, de ahí el consejo de poner sus cosas en un script de shell y ejecutarlas con suosudo
YoMismo
8

Si usas bash puedes hacer here-doc

$ su - user -s/bin/bash -c <<EOF
export X=1
echo $X
EOF

De esa manera, puede ejecutar muchos comandos y mantener el estado dentro de un script.

Lo mismo con sudo

sudo -u user bash <<EOF
your
script
here
EOF
spinus
fuente
Tampoco funciona para mí. ¿Realmente puedes pasar comandos de stdin a su / sudo?
Sparhawk
1
@Sparhawk, gracias por revisar. En el segundo ejemplo, olvidé agregar "bash" (ya actualizado el ejemplo) - funciona. El primer ejemplo no funciona completamente como mencionó, estaba escribiendo desde la memoria caché a largo plazo para poder cometer un error, pero definitivamente tenía que trabajar con stdin (estaba usando Java para ejecutar el subproceso para esa tarea) Trataré de pruébalo más para encontrar la forma correcta.
spinus
1
Necesitaba crear un comando dependiente de varias variables y ejecutarlo como otro usuario. Entonces, la sugerencia de YoMismo no era una opción en mi caso. Luché contra esto durante una hora, lo único que encuentro que funciona es el enfoque EOF (el segundo ejemplo). ¡Gracias!
Jette