¿Cómo sudo sobre sshfs?

35

En mi host local alpha, tengo un directorio fooque se asigna a través de sshfs al host de la bravosiguiente manera:

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

Sin embargo, en el host bravohay otro usuario, delta, al que quiero acceder sudo /bin/su, para poder trabajar bravo:/home/delta. deltano se puede iniciar sesión a través de ssh; por razones que no puedo cambiar, solo puedes pasar a delta una vez que estés en la máquina.

Normalmente me pasaba bravo, luego sudo a delta, pero me pregunto si hay alguna manera de hacerlo cuando tengo el directorio de inicio de Charlie montado a través de ssh.

lado de tierra
fuente
2
Esto puede resolverse mejor con permisos de archivo.
artifex

Respuestas:

36

Esto variará dependiendo del sistema operativo del servidor al que se está conectando. Para centOS 5 agregaría a las opciones de montaje sshfs:

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

Para Ubuntu 9.10 (creo que podría ser 9.04, pero probablemente sea lo mismo para ambos) o Debian agregaría:

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

Para encontrar la ruta correcta para otros sistemas que ejecutan openSSH, ejecute

sudo grep Subsystem /etc/ssh/sshd_config

y busque la ubicación del binario sftp-server.

Es posible que necesite configurar sudo con NOPASS: {ruta de acceso al servidor sftp} o validar previamente ssh user@host sudo -vpara que sudotenga una marca de tiempo actualizada para notty. En mi caso, mis dos comandos fueron:

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
fuente
1
Gracias, este es un 'truco' muy bueno. Acabo de añadir un "-u <some_other_user>" al sudo para mi situación
jor
1
Muy bien, funcionó a la perfección. Mi único punto es que hay / usr / bin / sudo dos veces en el ejemplo, lo que parece innecesario.
xaralis
1
@Craisis Perdón por mostrar una publicación anterior, pero quiero ingresar a un servidor CentOS 6.5 con un usuario básico, pero montar una carpeta que solo tenga acceso de root. ¿Sería esto correcto 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 -vno hace feliz a mi sudo, quiere un poco antes de que me permita sudo. Pensamientos?
w00t
1
@eggo @Sebi @calandoa @xaralis ¿Este comando funciona también si quiero sudo como root en debian 9? Porque si uso: 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"no funciona: \ - solo dice "los hosts remotos se han desconectado"
user3450548
3

Puede usar bindfs + sshfs para acceder a otros archivos de usuario (incluso root).

En primer lugar, monta su 'raíz' o cualquier otro directorio bajo su usuario con uid reasignado.

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

y luego simplemente sshfs en el directorio.

sshfs USER@SERVER:tmproot TARGET

Pero por seguridad es mejor no mapear la raíz completa, /sino solo una parte que necesita. Por ejemplo: puede usar este método para montar cualquier otro directorio de usuario en su, por ejemplo, archivos desde / var / www a ~ / www y reasignar root en su usuario para que tenga acceso completo a él.

Si necesita acceso para preservar uid o tener acceso a múltiples usuarios, entonces crearía un nuevo usuario, por ejemplo "rootfs" con uid = 0 y / bin / false y haría un sshfs normal.

kolorafa
fuente
0

Puede intentarlo (pero no creo que funcione):

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

No entiendo muy bien los sshfs, por lo que es posible que pueda hacer que algo así funcione, pero no podría decir cómo, y me sorprendería un poco.

Otra posibilidad es poner el comando 'sudo / bin / su bravo' en ~ / .ssh / rc, pero eso afectaría a todos sus montajes fs (suponiendo que funcionó, lo que también dudo), así como a su uso normal de ssh .

Perdón por ser un Debbie Downer.

Slartibartfast
fuente
0

Por deducción, creo que esto es imposible de lograr con un simple comando.

Esto se debe a que sshfs llama a ssh sin pasar ningún comando, sino que utiliza SFTP, que es un subsistema de SSH.

Desde la página de manual de sshfs :

En la computadora remota se usa el subsistema SFTP de SSH.

Además , cambiar el usuario actual (o 'su' o 'sudo') no es parte del protocolo SFTP, aunque esto parece ser una característica muy solicitada.

Weboide
fuente
Esto no es imposible. La solución de Craisis funciona.
Jayen
Por supuesto que sí, ya que anula el comando que inicia el subsistema y agrega sudo. Es un buen hallazgo, pero debe configurar sudo sin una contraseña (o usar una marca de tiempo), lo que puede disminuir la seguridad. pero no discutiré ya que OP realmente quería hacer eso.
Weboide
0

Probablemente, la mejor manera es a través de permisos de archivos, como propone @artifex.

Como dice @Weboide, es imposible a través de sshfs.

Pero supongo que podría crear un script simple, llamémoslo sudosshque tomará su $PWD, lo convertirá /home/delta/y ejecutará el comando a través sshy sudoen la máquina remota.

Algo como esto:

#!/usr/bin/env bash

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

Después de eso, puede ejecutar sudossh commandy recordar usar rutas relativas.

Si usa ssh-agent, solo tiene que ingresar su sudocontraseña.

chmeee
fuente
0

Mi solución es terriblemente fea (gracias a unas pocas capas de escape de cadena), pero leerá la ruta sftp-serverdesde /etc/ssh/sshd_configy la ejecutará sudo. Ahora, ¿qué sshd_configpasa si no se encuentra debajo /etc/ssh? ¿Quizás buscar dentro de sshbinario con stringsy 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
fuente