Wie mache ich sudo über sshfs?

35

Auf meinem lokalen Host habe alphaich ein Verzeichnis foo, das über sshfs dem Host bravowie folgt zugeordnet ist:

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

Doch auf dem Host bravoist es ein anderer Benutzer, Delta, das möchte ich sudo /bin/suals, so dass ich die Arbeit in tun kann bravo:/home/delta. deltadarf nicht über ssh eingeloggt sein; Aus Gründen, die ich nicht ändern kann, können Sie nur dann zu Delta wechseln, wenn Sie auf dem Computer sind.

Normalerweise würde ich in ssh bravo, dann in sudo in delta, aber ich frage mich, ob ich das auf irgendeine Weise tun kann, wenn ich Charlie's Heimverzeichnis über ssh habe.

dirtside
quelle
2
Dies lässt sich am besten mit Dateiberechtigungen lösen.
Artifex

Antworten:

36

Dies hängt vom Betriebssystem des Servers ab, zu dem Sie eine Verbindung herstellen. Für centOS 5 würden Sie zu den Mount-Optionen von sshfs hinzufügen:

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

Für Ubuntu 9.10 (ich denke, es könnte 9.04 sein, aber es ist wahrscheinlich für beide dasselbe) oder Debian würden Sie hinzufügen:

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

Um den richtigen Pfad für andere Systeme zu finden, auf denen openSSH ausgeführt wird, führen Sie Folgendes aus

sudo grep Subsystem /etc/ssh/sshd_config

und suchen Sie nach dem Speicherort der SFTP-Server-Binärdatei.

Möglicherweise müssen Sie sudo mit NOPASS einrichten: {Pfad zum SFTP-Server} oder mit vorab validieren, ssh user@host sudo -vdamit sudoein aktualisierter Zeitstempel für angezeigt wird notty. In meinem Fall waren meine zwei Befehle:

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"
Craisis
quelle
1
Danke, das ist ein sehr ordentlicher "Trick". Ich habe dem Sudo gerade ein "-u <some_other_user>" für meine Situation hinzugefügt
jor
1
Sehr gut, hat einwandfrei funktioniert. Mein einziger Punkt ist, dass es im Beispiel zweimal / usr / bin / sudo gibt, was unnötig erscheint.
Xaralis
1
@Craisis Es tut mir leid, dass ich einen alten Beitrag aufgerufen habe, aber ich möchte ssh auf einen CentOS 6.5-Server mit einem einfachen Benutzer übertragen, aber einen Ordner bereitstellen, der nur Root-Zugriff hat. Wäre das richtig 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 -vmacht mein sudo nicht glücklich - es will ein tty, bevor es mich sudo lässt. Gedanken?
30.
1
@eggo @Sebi @calandoa @xaralis Funktioniert dieser Befehl auch, wenn ich als root in Debian 9 sudo möchte? Denn wenn ich benutze: 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"es funktioniert nicht: \ - es heißt nur "Remote-Hosts hat getrennt"
user3450548
3

Sie können bindfs + sshfs verwenden, um auf andere Benutzerdateien (sogar root) zuzugreifen.

Zuerst mounten Sie Ihr 'root' oder ein anderes Verzeichnis unter Ihrem Benutzer mit der neu zugewiesenen UID.

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

und dann einfach sshfs ins verzeichnis.

sshfs USER@SERVER:tmproot TARGET

Aus Sicherheitsgründen ist es jedoch besser, nicht die gesamte Root abzubilden, /sondern nur einen Teil, den Sie benötigen. Beispiel: Sie können diese Methode verwenden, um ein beliebiges anderes Benutzerverzeichnis in Ihre zu mounten, z. B. Dateien aus / var / www in ~ / www, und das Stammverzeichnis Ihrem Benutzer neu zuzuordnen, sodass Sie vollen Zugriff darauf haben.

Wenn Sie Zugriff benötigen, um UID beizubehalten oder Zugriff auf mehrere Benutzer zu haben, dann würde ich einen neuen Benutzer zum Beispiel "rootfs" mit UID = 0 und / bin / false erstellen und ein normales sshfs ausführen.

Kolorafa
quelle
0

Sie könnten es versuchen (aber ich glaube nicht, dass es funktionieren wird):

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

Ich verstehe sshfs nicht sehr gut, so dass Sie möglicherweise in der Lage sind, so etwas zum Laufen zu bringen, aber ich konnte nicht sagen, wie und ich wäre ein wenig überrascht.

Eine andere Möglichkeit besteht darin, das Kommando 'sudo / bin / su bravo' in ~ / .ssh / rc zu setzen, aber das würde sich auf alle Ihre fs-Mountings auswirken (vorausgesetzt, es hat funktioniert, was ich auch bezweifle) sowie auf Ihre normale Verwendung von ssh .

Tut mir leid, dass ich ein Schwächling bin.

Slartibartfast
quelle
0

Ich halte es für unmöglich , dies mit einem einfachen Befehl zu erreichen.

Dies liegt daran, dass sshfs ssh aufruft, ohne einen Befehl zu übergeben, sondern stattdessen SFTP verwendet, ein Subsystem von SSH.

Aus der sshfs- Manpage:

Auf dem Remote-Computer wird das SFTP-Subsystem von SSH verwendet.

Außerdem gehört das Ändern des aktuellen Benutzers (oder 'su' oder 'sudo') nicht zum SFTP-Protokoll, obwohl dies eine sehr häufig angeforderte Funktion zu sein scheint.

Weboide
quelle
das ist nicht unmöglich. Craisis 'Lösung funktioniert.
Jayen
Natürlich ja, da er den Befehl überschreibt, der das Subsystem startet und sudo hinzufügt. Gutes Ergebnis, aber Sie müssen sudo ohne Kennwort einrichten (oder einen Zeitstempel verwenden), was die Sicherheit beeinträchtigen kann. aber ich werde nicht streiten, da OP das wirklich tun wollte.
Weboide
0

Wahrscheinlich ist der beste Weg, durch Dateiberechtigungen, wie @artifex vorschlägt.

Wie @Weboide sagt, ist dies mit sshfs nicht möglich.

Aber ich denke , man könnte ein einfaches Skript erstellen, nennen wir es , sudosshdass Ihr dauern wird $PWD, wandelt es in /home/delta/und den Befehl durchlaufen sshund sudoauf dem entfernten Rechner.

Etwas wie das:

#!/usr/bin/env bash

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

Danach können Sie ausführen sudossh commandund sich daran erinnern, relative Pfade zu verwenden.

Wenn Sie ssh-agent verwenden, müssen Sie nur Ihr sudoPasswort eingeben.

chmeee
quelle
0

Meine Lösung ist erschreckend hässlich (dank ein paar Schichten von Strings), aber sie liest den Pfad sftp-servervon /etc/ssh/sshd_configund führt ihn durch sudo. Was sshd_configist nun, wenn sich nicht darunter befindet /etc/ssh? Vielleicht suche ich in sshbinär mit stringsund grep?

#!/bin/sh
sshfs -o sftp_server="/bin/sh -c \"sudo \`sed -n '/Subsystem\\\\\\\\s\\\\+sftp\\\\\\\\s\\\\+/{s///;p}' /etc/ssh/sshd_config\`\"" "$@"
André von Kugland
quelle