Comment puis-je sudo sur sshfs?


35

Sur mon hôte local, alphaj'ai un répertoire foomappé via sshfs pour héberger bravocomme suit:

$ sshfs charlie@bravo:/home/charlie ~/foo

Cependant, sur l'hôte, bravoil existe un autre utilisateur, delta, que je souhaite utiliser pour sudo /bin/supouvoir travailler bravo:/home/delta. deltane peut pas être connecté via ssh; pour des raisons que je ne peux pas changer, vous ne pouvez vous déplacer que lorsque vous êtes sur la machine.

Normalement, je ferais une entrée ssh bravo, puis un delta au sudo, mais je me demandais si je pouvais le faire si j'ai le répertoire personnel de charlie monté via ssh.


2
Cela peut être mieux résolu avec les autorisations de fichiers.
artifex

Réponses:


36

Cela varie en fonction du système d'exploitation du serveur auquel vous vous connectez. Pour centOS 5, vous ajouteriez aux options de montage sshfs:

-o sftp_server="/usr/bin/sudo /usr/libexec/openssh/sftp-server"

Pour Ubuntu 9.10 (je pense, pourrait être 9.04, mais c'est probablement la même chose pour les deux) ou Debian, vous ajouteriez:

-o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server".

Pour trouver le chemin correct pour les autres systèmes exécutant openSSH, exécutez

sudo grep Subsystem /etc/ssh/sshd_config

et recherchez l’emplacement du fichier binaire sftp-server.

Vous pourriez avoir besoin de configurer sudo nopass: {chemin de sftp-server} ou prevalidate avec de ssh user@host sudo -vtelle sorte que sudoa un horodatage mis à jour pour notty. Dans mon cas, mes deux commandes étaient:

ssh login_user@host sudo -v
sshfs login_user@host:remote_path local_path -o sftp_server="/usr/bin/sudo -u as_user /usr/lib/ssh/sftp-server"

1
Merci, c'est un "truc" très soigné. Je viens d' ajouter un « -u <some_other_user> » à ma situation sudo
Jor

1
Très bien, a fonctionné sans faille. Mon seul point est qu'il y a deux fois / usr / bin / sudo dans l'exemple, ce qui semble inutile.
xaralis

1
@ Craisis Désolé de mettre à jour l'ancien message, mais je souhaite utiliser ssh sur un serveur CentOS 6.5 avec un utilisateur de base, mais monter un dossier uniquement accessible en tant qu'utilisateur root. Cela serait-il correct sshfs basicuser@remotehost:remote_path local_mount_path -o sftp_server="/usr/bin/sudo -u root /usr/libexec/openssh/sftp-server"?
Don Rhummy

1
ssh host sudo -vne fait pas mon sudo heureux - il veut un tty avant de me laisser sudo. Pensées?
w00t

1
@eggo @Sebi @calandoa @xaralis Cette commande fonctionne-t-elle aussi si je veux utiliser sudo en tant que root dans debian 9? Parce que si j'utilise: ssh -t myuser@host sudo -v sshfs myuser@host:remote_path local_path -o sftp_server="/usr/bin/sudo -u root /usr/lib/openssh/sftp-server"ça ne marche pas: \ - ça dit juste "les hôtes distants se sont déconnectés"
user3450548

3

Vous pouvez utiliser bindfs + sshfs pour accéder à d'autres fichiers utilisateur (même root).

Tout d'abord, vous montez votre répertoire 'root' ou tout autre répertoire sous votre utilisateur avec un uid remappé.

ssh -t USER@SERVER "mkdir ~/tmproot; sudo bindfs --map=root/USER / ~/tmproot"

et ensuite simplement sshfs dans le répertoire.

sshfs USER@SERVER:tmproot TARGET

Mais pour des raisons de sécurité, il est préférable de ne pas mapper la totalité de la racine, /mais seulement la partie dont vous avez besoin. Par exemple: Vous pouvez utiliser cette méthode pour monter tout autre répertoire utilisateur sur votre, par exemple, les fichiers de / var / www dans ~ / www et remapper la racine sur votre utilisateur afin d’y avoir un accès complet.

Si vous avez besoin d'un accès pour conserver votre identifiant utilisateur ou pour avoir accès à plusieurs utilisateurs, je créerais un nouvel utilisateur, par exemple "rootfs" avec uid = 0 et / bin / false, et effectuerais un sshfs normal.


0

Vous pourriez essayer (mais je ne pense pas que cela fonctionnera):

sshfs -o ssh_command='ssh sudo /bin/su bravo' charlie@bravo:/home/charlie ~/foo

Je ne comprends pas très bien sshfs, alors vous pourrez peut-être faire fonctionner quelque chose comme ça, mais je ne saurais dire comment, et je serais un peu surpris.

Une autre possibilité est de mettre la commande 'sudo / bin / su bravo' dans ~ / .ssh / rc, mais cela affecterait tous vos montages fs (en supposant que cela fonctionne, ce dont je doute également) ainsi que votre utilisation normale de ssh .

Désolé d'être un debbie downer.


0

Par déduction, je pense que cela est impossible à réaliser avec une simple commande.

Cela est dû au fait que sshfs appelle ssh sans passer de commande mais utilise plutôt SFTP, qui est un sous-système de SSH.

Depuis la page de manuel sshfs :

Sur l'ordinateur distant, le sous-système SFTP de SSH est utilisé.

De plus , la modification de l'utilisateur actuel (ou «su» ou «sudo») ne fait pas partie du protocole SFTP, bien que cela semble être une fonctionnalité très souvent demandée.


ce n'est pas impossible. La solution de Craisis fonctionne.
Jayen

Bien sûr que oui, puisqu'il remplace la commande qui démarre le sous-système et ajoute sudo. Bonne recherche, mais vous devez configurer sudo sans mot de passe (ou utiliser un horodatage), ce qui peut réduire la sécurité. mais je ne discuterai pas puisque OP voulait vraiment faire cela.
Weboide

0

Le meilleur moyen consiste probablement à utiliser les autorisations de fichiers, comme le propose @artifex.

Comme @Weboide le dit, c'est impossible avec sshfs.

Mais je suppose que vous pouvez créer un script simple, appelons-le sudosshqui va vous permettre de le $PWDconvertir, /home/delta/puis exécutez la commande via sshet sudosur la machine distante.

Quelque chose comme ça:

#!/usr/bin/env bash

ssh -t charlie@bravo "cd `pwd | sed 's/user\/foo/delta/'`; sudo -u delta $*"

Après cela, vous pouvez exécuter sudossh commandet vous rappeler d'utiliser des chemins relatifs.

Si vous utilisez ssh-agent, il vous suffit de saisir votre sudomot de passe.


0

Ma solution est cruellement moche (grâce à quelques couches de chaîne échappées), mais elle lira le chemin de sftp-serverfrom /etc/ssh/sshd_configet l'exécutera sudo. Maintenant, si ce sshd_confign'est pas situé sous /etc/ssh? Peut-être chercher dans le sshbinaire avec stringset grep?

#!/bin/sh
sshfs -o sftp_server="/bin/sh -c \"sudo \`sed -n '/Subsystem\\\\\\\\s\\\\+sftp\\\\\\\\s\\\\+/{s///;p}' /etc/ssh/sshd_config\`\"" "$@"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.