Comment exécuter une commande en tant qu'utilisateur dont la connexion est désactivée?

21

J'essaie d'utiliser la commande su pour exécuter une application en tant qu'autre utilisateur

Dans ce cas, j'essaie d'exécuter irssi

blah@ubuntu: su - [username] irssi
(enter password)

blah@ubuntu:
(nothing happens)

blah@ubuntu: su - [username] -c irssi
(nothing)

J'exécute gksu et définit les mêmes paramètres et cela fonctionne, et ne me demande pas le mot de passe utilisateur. Quelle est la solution? Et comment le résoudre?

Je dois noter que l'utilisateur a été créé comme ceci

adduser --system --disabled-login [username]

si cela fait une différence .... soupir.

user123361
la source
N'oubliez-vous pas -c flag pour lancer irssi? (su -c irssi)
eephyne
essayé aussi ... essayé mille choses ... pourquoi si difficile à exécuter comme WTF c'est exactement comme la page de manuel le veut ... mais rien ne se passe grrrr
user123361
Serait-ce juste qu'il y irssia un problème et que la commande su fonctionne?
Nanne
Est-ce que ´ [nom d'utilisateur] ´ a les droits appropriés pour exécuter irssi?
Doka

Réponses:

28

Cette réponse devrait encore vous aider, même en tenant compte des modifications apportées à la question. En particulier, un compte créé avec --disabled-loginn'a pas de mot de passe défini et aucun autre moyen de se connecter , mais il devrait toujours être possible d'utiliser sudo(expliqué ci-dessous) pour exécuter des commandes ou un shell en tant qu'utilisateur. C'est en fait ainsi que le rootcompte est configuré dans Ubuntu.

Il y a plusieurs problèmes avec la commande su - irssi.

Cette commande tente de démarrer un shell appartenant à un utilisateur nomméirssi .

Il échouera si:

  • Il n'y a aucun irssiutilisateur.
  • Le irssicompte de l'utilisateur est désactivé.
  • Le irssicompte de l'utilisateur est désactivé pour la connexion interactive. Parfois, un compte est autorisé à utiliser des services comme FTP mais interdit de se connecter normalement en définissant son shell sur quelque chose qui se ferme immédiatement, comme /bin/false. Ensuite, une connexion se termine immédiatement, sans message.
  • Le mot de passe que vous entrez n'est pas correct pour l' irssiutilisateur.

Le -drapeau fait en sorte que le shell simule un shell de connexion initial - c'est-à-dire, c'est vraiment très similaire à la connexion en tant que irssi. Sans l' -indicateur, si la sucommande réussissait, vous obtiendriez toujours un shell appartenant à irssi, mais les variables d'environnement telles que HOMEseraient inchangées.

Si vous souhaitez plutôt exécuter un programme appelé irssi , vous devez invoquer sudifféremment:

su username - -c irssi

Si vous omettez , c'est la même chose que --it tente d'exécuter la commande en tant que root.-c username-c root

Vous pouvez également démarrer un shell, puis exécuter la commande :

  1. Démarrez le shell avec .su username -
  2. Dans le shell, exécutez la commande ( irssi).
  3. Si vous avez terminé, quittez le shell en exécutant exit.

Exécution de commandes en tant que root

Si vous voulez exécuter en irssitant que root, ce sun'est pas la façon de le faire. Les connexions root sont désactivées par défaut sur Ubuntu, et il n'y a que rarement de raison de les réactiver . Si vous avez activé la rootconnexion, vous devriez pouvoir l'utiliser supour devenir root. La raison pour laquelle il n'est pas nécessaire d'activer le rootcompte est que, que vous le fassiez ou non, vous pouvez toujours exécuter des commandes comme rootavec sudo.

Lorsque vous exécutez des commandes avec sudo, vous entrez votre mot de passe, pas le mot de passe de l'utilisateur sous l'identité duquel vous souhaitez exécuter la commande. Seuls les administrateurs peuvent exécuter des commandes arbitraires comme rootavec sudo(à moins que vous ne vous reconfiguriez sudopour autoriser les autres à le faire, bien sûr). Ainsi, un utilisateur qui n'est pas autorisé à administrer le système n'est pas autorisé à exécuter des commandes comme rootavec son propre mot de passe.

Pour fonctionner irssicomme rootavec sudo:

sudo irssi

Et vous saisiriez votre mot de passe à l'invite, pas rootle s.

Excepté le mot de passe que vous entrez, cela fait la même chose que:

su -c irssi

Sauf que la sudoversion peut réussir car elle ne nécessite pas l' rootactivation du compte.

Comme avec su, vous pouvez utiliser sudopour exécuter des commandes en tant qu'autre non rootutilisateur . Pour fonctionner irssicomme usernameavec sudo:

sudo -u username irssi

Si vous voulez vous sudo comporter comme su -par rapport à -HOME c'est-à-dire, vous voulez utiliser les HOMEvariables d'environnement de l'utilisateur cible , vous pouvez exécuter sudoavec l' -Hindicateur:

sudo -H irssi
sudo -H -u username irssi

Vous pouvez démarrer un shell entier avec sudo, comme vous pouvez avec su. Sauf pour le mot de passe que vous avez entré, cette commande a le même effet que su:

sudo -s

Et cette commande a le même effet que su -:

sudo -i

(Le ireprésente le shell de connexion initial .)

Vous pouvez également démarrer un shell en tant qu'autre utilisateur:

sudo -u username -s
sudo -u username -i

Lectures complémentaires sur sudo

Pour en savoir plussudo , consultez:

Pourquoi a-t-il gksufonctionné alors suque non?

gksuprobablement travaillé en courantsudo .

gksuest une interface pour les deux su et sudo. Dans Ubuntu, il utilise par défaut sudo(car dans Ubuntu, il sun'est généralement pas utilisé pour devenir root, et n'est qu'un moyen secondaire de devenir d'autres non- rootutilisateurs).

Vous pouvez l' gksuutiliser sucomme interface en exécutant gksu --su-mode.

Vous pouvez savoir s'il gksuest en sumode ou en sudomode et (si vous le souhaitez) modifier ce paramètre en exécutant gksu-properties. Il s'agit d'un paramètre par utilisateur.

Lorsqu'il gksuest en sudomode, il se comporte de la même manière que gksudo.

Lectures complémentaires sur gksu


Analyse post-solution

Vous avez finalement découvert que vous pouviez exécuter la commande nécessaire avec:

sudo -u username irssi

(Parmi les techniques énumérées ci-dessus.)

En fin de compte, vous avez rapporté deux informations, qui sont suffisantes pour expliquer pourquoi d'autres techniques avaient échoué, mais qui avaient réussi:

  1. Le usernamecompte a été créé avec le --disabled-logindrapeau, ce qui fait qu'il n'a pas de mot de passe (et aucun autre moyen de se connecter). Ne pas avoir de mot de passe ne signifie pas qu'il est possible de se connecter avec un mot de passe vierge . Cela signifie qu'aucun mot de passe n'est suffisant pour s'authentifier. En combinaison avec l'élimination d'autres moyens d'authentification, ce moyen usernamene peut pas du tout s'authentifier.

    Ainsi, toutes les susolutions basées sur le marché sont disponibles. sudopeut fonctionner, car avec sudovous ne vous authentifiez pas en tant qu'utilisateur que vous êtes sur le point d'emprunter l'identité. Au lieu de cela, vous devez être autorisé à vous faire passer pour eux, et vous vous authentifiez en tant que vous-même (c'est-à-dire, entrez votre propre mot de passe, pas le leur).

    Il est possible de définir un mot de passe sur le compte, ce qui supprime cette barrière à la connexion:

    sudo passwd username

    Cependant, il peut y avoir une bonne raison pour laquelle l'utilisateur n'est pas autorisé à se connecter. Par exemple, si cet utilisateur était autorisé à se connecter et à se connecter graphiquement, de mauvais problèmes surgiraient du fait que l'environnement ou les privilèges de l'utilisateur seraient mal adaptés à l'exécution des applications X11 ? Si cet utilisateur pouvait se connecter, cela permettrait-il de se connecter à distance en tant que cet utilisateur (pour les machines sur lesquelles vous avez exposé des services réseau)?

    Si jamais vous souhaitez le désactiver à nouveau:

    sudo passwd -dl username

    Connexes: réactiver le rootcompte après l'avoir temporairement activé.

  2. Le usernamecompte a /bin/falsecomme shell de connexion.

    Lorsqu'un shell comme bashfonctionne comme shell de connexion, il configure votre environnement et vous donne une invite interactive pour contrôler la machine.

    Lors de l' /bin/falseexécution, en revanche, il ne fait rien et signale un échec . ( /bin/truene fait rien et signale le succès.)

    Les commandes falseet truesont utiles dans les scripts et à diverses fins de test, mais aussi pour désactiver un compte de sorte que lorsque quelqu'un se connecte, sa session de connexion se termine immédiatement. De cette façon, un mot de passe (ou d'autres moyens d'authentification) peut être activé, et les gens peuvent se connecter, mais pas pour accéder au shell . Par exemple, s'il existe un serveur FTP, ils pourraient toujours accéder à leur compte via FTP. S'il y a un serveur SSH, ils ne pourraient pas obtenir un shell via SSH, mais ils pourraient toujours utiliser sftpet scptransférer des fichiers.

    Depuis usernamele shell de connexion « était non fonctionnel, commandes telles que , , et ne pouvait pas travailler.su usernamesu - usernamesudo -u username -ssudo -u username -i

    Mais les commandes qui ne donnent pas de shell, comme ou pourraient encore fonctionner.sudo -u username commandsu username -c 'command'

    Puisque les commandes peuvent être exécutées, vous pouvez changer le shell de connexion de l'utilisateur en quelque chose de fonctionnel:

    sudo chsh -s /bin/bash username

    Cependant, cela doit également être fait avec prudence, car il peut y avoir une bonne raison de désactiver les connexions interactives pour l'utilisateur.

Ici, les usernamedeux avaient désactivé le mot de passe et le shell "désactivé". L'absence de mot de passe fonctionnel a empêché toutes les susolutions basées sur le travail, tandis que l'absence d'un shell de connexion interactif fonctionnel a empêché toutes les solutions de génération de shell de fonctionner (sauf l'appel manuel d'un shell, par exemple ).sudo -u username bash

sudo -u username command c'est ce qui restait.

Eliah Kagan
la source
Désolé pour les nombreuses modifications pendant que vous travailliez sur votre réponse. Sensationnel. Merci. Quand je fais cat / etc / passwd, l'utilisateur que j'ai configuré a / bin / false à la fin - est-ce donc la cause de l'échec? une idée de comment résoudre ce problème?
user123361
Pour une raison quelconque, l'utilisation de sudo -u nom d'utilisateur irssi fonctionne. Merci pour votre réponse longue et bien expliquée!
user123361
@db Je suis content que cela ait fonctionné! (Btw, pas besoin de s'excuser pour l'édition, l'édition est très, très bonne, et votre question sera probablement utile pour plus de gens aussi à cause des modifications.) Quant à vos autres questions, j'ai édité ma réponse à inclure une section d'analyse à la fin.
Eliah Kagan