Como eu sudo sobre sshfs?

35

No meu host local alpha, tenho um diretório fooque é mapeado via sshfs para hospedar da bravoseguinte maneira:

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

No entanto, no host, bravoexiste outro usuário, delta, no qual eu quero sudo /bin/su, para que eu possa trabalhar bravo:/home/delta. deltapode não estar logado via ssh; por razões que não posso alterar, você só pode executar o deldo quando estiver na máquina.

Normalmente eu ssh bravo, então sudo to delta, mas estou me perguntando se há alguma maneira de fazer isso quando eu tiver o dir home de charlie montado via ssh.

dirtside
fonte
2
Isso pode ser melhor resolvido com permissões de arquivo.
Artifex

Respostas:

36

Isso variará dependendo do sistema operacional do servidor ao qual você está se conectando. Para o centOS 5, você adicionaria às opções de montagem sshfs:

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

Para o Ubuntu 9.10 (acho que pode ser o 9.04, mas provavelmente é o mesmo para ambos) ou o Debian você adicionaria:

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

Para encontrar o caminho correto para outros sistemas executando o openSSH, execute

sudo grep Subsystem /etc/ssh/sshd_config

e procure a localização do binário do servidor sftp.

Pode ser necessário configurar o sudo com o NOPASS: {caminho para o servidor sftp} ou prevalecer com, ssh user@host sudo -vpara que haja sudoum registro de data e hora atualizado para notty. No meu caso, meus dois comandos foram:

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
fonte
1
Obrigado, este é um 'truque' muito elegante. Acabei de adicionar um "-u <some_other_user>" ao sudo para a minha situação
jor
1
Muito bom, funcionou perfeitamente. Meu único argumento é que há / usr / bin / sudo duas vezes no exemplo, o que parece desnecessário.
Xaralis
1
@Craisis Desculpe abrir a postagem antiga, mas eu quero ssh em um servidor CentOS 6.5 com um usuário básico, mas monte uma pasta que seja apenas de acesso root. Isso seria correto sshfs basicuser@remotehost:remote_path local_mount_path -o sftp_server="/usr/bin/sudo -u root /usr/libexec/openssh/sftp-server":?
Don Rhummy 30/01
1
ssh host sudo -vnão deixa meu sudo feliz - ele quer um tty antes de me deixar sudo. Pensamentos?
w00t 30/05
1
@eggo @Sebi @calandoa @xaralis Esse comando também funciona se eu quiser sudo como root no debian 9? Porque se eu usar: 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"ele não funciona: \ - diz apenas "hosts remotos foram desconectados" #
user3450548
3

Você pode usar o bindfs + sshfs para acessar outros arquivos do usuário (inclusive o root).

Primeiramente você monta seu 'root' ou qualquer outro diretório no seu usuário com uid remapeado.

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

e então simplesmente sshfs no diretório

sshfs USER@SERVER:tmproot TARGET

Mas, por segurança, é melhor não mapear a raiz inteira, /mas apenas a parte necessária. Por exemplo: Você pode usar este método para montar qualquer outro diretório de usuário no seu, por exemplo, arquivos de / var / www em ~ / www e remapear a raiz para o usuário, para ter acesso total a ele.

Se você precisa de acesso para preservar o uid ou ter acesso a vários usuários, eu criaria um novo usuário, por exemplo "rootfs" com uid = 0 e / bin / false e faria um sshfs normal.

Kolorafa
fonte
0

Você pode tentar (mas acho que não vai funcionar):

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

Como não entendo muito bem o sshfs, é possível que algo assim funcione, mas não sei dizer como e ficaria um pouco surpreso.

Outra possibilidade é colocar o comando 'sudo / bin / su bravo' em ~ / .ssh / rc, mas isso afetaria todas as suas montagens fs (supondo que funcionasse, o que também duvido), bem como o uso normal do ssh .

Desculpe por ser um debbie downer.

Slartibartfast
fonte
0

Por dedução, acho que isso é impossível de ser alcançado com um simples comando.

Isso ocorre porque o sshfs chama ssh sem passar nenhum comando, mas usa o SFTP, que é um subsistema do SSH.

Na página de manual do sshfs :

No computador remoto, o subsistema SFTP do SSH é usado.

Além disso , alterar o usuário atual (ou 'su' ou 'sudo') não faz parte do protocolo SFTP, embora isso pareça um recurso solicitado com muita frequência.

Weboide
fonte
isso não é impossível. A solução de Craisis funciona.
Jayen
Claro que sim, pois ele substitui o comando que inicia o subsistema e adiciona o sudo. Boa descoberta, mas você precisa configurar o sudo sem uma senha (ou usar um carimbo de data / hora), o que pode diminuir a segurança. mas não vou discutir, já que a OP realmente queria fazer isso.
Weboide 6/01/12
0

Provavelmente, a melhor maneira é através de permissões de arquivo, como o @artifex propõe.

Como o @Weboide diz, é impossível através do sshfs.

Mas eu acho que você poderia criar um script simples, vamos chamá-lo de sudosshque terá o seu $PWD, convertê-lo para /home/delta/e execute o comando através de sshe sudona máquina remota.

Algo assim:

#!/usr/bin/env bash

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

Depois disso, você pode executar sudossh commande lembre-se de usar caminhos relativos.

Se você usa o ssh-agent, basta digitar sua sudosenha.

chmeee
fonte
0

Minha solução é assustadoramente feia (graças a algumas camadas de string escapando), mas ela lê o caminho para sftp-serverpartir /etc/ssh/sshd_confige o executa sudo. Agora, e se sshd_confignão estiver localizado abaixo /etc/ssh? Talvez pesquise dentro de sshbinário com stringse 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
fonte