Ejecute un script de shell como otro usuario que no tiene contraseña

245

Me gustaría ejecutar un script desde el shell principal de ubuntu como un usuario diferente que no tiene contraseña.

Tengo todos los privilegios de sudo, así que probé esto:

sudo su -c "Your command right here" -s /bin/sh otheruser

Luego tengo que ingresar mi contraseña, pero no estoy seguro de si ese script ahora se está ejecutando realmente con ese usuario.

¿Cómo puedo confirmar que el script realmente se está ejecutando con ese usuario ahora?

rubo77
fuente

Respuestas:

354

Puede hacerlo con suo sudo, sin necesidad de ambos.

sudo -H -u otheruser bash -c 'echo "I am $USER, with uid $UID"' 

Las partes relevantes de man sudo:

-H   The -H (HOME) option requests that the security policy set
     the HOME environment variable to the home directory of the
     target user (root by default) as specified by the password
     database.  Depending on the policy, this may be the default
     behavior.
-u user     The -u (user) option causes sudo to run the specified
      command as a user other than root.  To specify a uid
      instead of a user name, use #uid.  When running commands as
      a uid, many shells require that the '#' be escaped with a
      backslash ('\').  Security policies may restrict uids to
      those listed in the password database.  The sudoers policy
      allows uids that are not in the password database as long
      as the targetpw option is not set.  Other security policies
      may not support this.

susolo puede cambiar de usuario sin proporcionar una contraseña si es root. Ver la respuesta de Caleb

Puede modificar el /etc/pam.d/suarchivo para permitir susin contraseña. Ver esta respuesta .

Si modificó su archivo de autenticación a lo siguiente, cualquier usuario que fuera parte del grupo somegrouppodría suhacerlo otherusersin una contraseña.

auth       sufficient pam_rootok.so
auth       [success=ignore default=1] pam_succeed_if.so user = otheruser
auth       sufficient   pam_succeed_if.so use_uid user ingroup somegroup

Luego prueba desde la terminal

rubo77@local$ su otheruser -c 'echo "hello from $USER"'
hello from otheruser
geirha
fuente
44
¿Puedes agregar cómo hacerlo sutambién?
rubo77
2
Esto me pide una contraseña :-(
IanVaughan
1
@IanVaughan, con la configuración predeterminada (de sudo), se le pedirá una contraseña a menos que la ejecute como root. Puede configurar sudo para "permitir que el usuario A ejecute cmd C como usuario B sin requerir una contraseña". Ver help.ubuntu.com/community/Sudoers
geirha
1
Se me solicita una contraseña cuando ejecuto esto como root. ¿Alguna sugerencia?
Nate
1
@NamGVU tenga en cuenta que el orden es importante. Si sus sudoers tienen una regla más abajo que establece otros permisos para su usuario, o un grupo del que es miembro, eso anulará su regla NOPASSWD.
geirha
100

Si quieres usar su en lugar de sudo, creo que puedes usar algo como esto:

su - <username> -c "<commands>"
  • - simulará un inicio de sesión del usuario especificado
  • -c le dice que desea ejecutar un comando

PD. Desafortunadamente, no puedo instalar ruby ​​usando rvm con este método, pero eso probablemente no esté relacionado.

Caleb
fuente
55
Necesitaba agregar sudoal principio, de lo contrario, me pidió mi contraseña.
IanVaughan
2
Esto definitivamente no funciona sin él sudo. con sudo funciona, por ejemplo: sudo su - www-data -c "touch /tmp/test"creó con éxito un archivo como www-data
rubo77
Para usar "su" necesita la contraseña de root, el punto de "sudo" es evitar eso. Si tiene la contraseña de root usando "su" como se indica arriba, debería funcionar bien.
Samuel Åslund
6

Las respuestas anteriores son realmente útiles para mí, pero para responder la pregunta real ...

¿Cómo puedo afirmar que el script realmente se está ejecutando bajo ese usuario ahora?

Utilizar:

ps -ef | grep <command-name>

La salida debe incluir su script y el usuario real que lo ejecuta. Las personas en sistemas similares a BSD, por ejemplo, MAC pueden encontrar información similar con:

ps aux | grep <command-name>
Samuel Åslund
fuente
Los usuarios de Linux pueden usar ps aux.
Dean Howell
@DeanHowell; Es cierto, pero los usuarios de MAC no pueden usar "ps -ef" y "ps aux" son opciones BSD, solo disponibles como una característica de compatibilidad, mientras que "ps -ef" son opciones estandarizadas de Unix / POSIX.
Samuel Åslund
2

Yo tuve el mismo problema. Simplemente escriba el comando, screen -dmS testscreenesto creará una pantalla separada en su cuenta de usuario que no sea sudo y luego podrá iniciar sesión y verificar si esta pantalla está allí screen -ls.

liima
fuente