Как мне sudo через sshfs?


35

На моем локальном хосте у alphaменя есть каталог, fooкоторый отображается через sshfs на хост bravo:

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

Однако на хосте bravoесть еще один пользователь, delta, с которым я хочу sudo /bin/suработать, чтобы я мог выполнять работу bravo:/home/delta. deltaне может войти в систему через ssh; по причинам, которые я не могу изменить, вы можете перейти в delta только после того, как окажетесь на машине.

Обычно я в ssh bravo, затем sudo в delta, но мне интересно, есть ли способ сделать это, когда я установил домашний каталог Чарли через ssh.


2
Это может быть лучше всего решено с разрешениями файла.
— artifex

Ответы:


36

Это зависит от ОС сервера, к которому вы подключаетесь. Для centOS 5 вы бы добавили в опции монтирования sshfs:

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

Для Ubuntu 9.10 (я думаю, это может быть 9.04, но, вероятно, это то же самое для обоих) или Debian, который вы добавите:

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

Чтобы найти правильный путь для других систем, работающих с openSSH, запустите

sudo grep Subsystem /etc/ssh/sshd_config

и найдите местоположение двоичного файла sftp-сервера.

Вам может потребоваться настроить sudo с помощью NOPASS: {путь к sftp-серверу} или предварительно проверить его, ssh user@host sudo -vчтобы у sudoнего была обновленная отметка времени для notty. В моем случае две мои команды были:

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
Спасибо, это очень аккуратный трюк. Я просто добавил "-u <some_other_user>" в sudo для моей ситуации
— jor

1
Очень хорошо, работал без нареканий. Единственное, что я хочу сказать, это то, что в этом примере дважды используется / usr / bin / sudo, что кажется ненужным.
— xaralis

1
@Craisis Извините, что поднял старый пост, но я хочу подключиться по ssh к серверу CentOS 6.5 с обычным пользователем, но смонтировать папку только с правами root. Будет ли это правильно: sshfs basicuser@remotehost:remote_path local_mount_path -o sftp_server="/usr/bin/sudo -u root /usr/libexec/openssh/sftp-server"?
— Дон Румми

1
ssh host sudo -vне делает мое sudo счастливым - он хочет tty, прежде чем это позволит мне sudo. Мысли?
— w00t

1
@eggo @Sebi @calandoa @xaralis Эта команда также работает, если я хочу использовать sudo как root в debian 9? Потому что, если я использую: 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"он не работает: \ - он просто говорит "удаленные хосты отключены"
— user3450548

3

Вы можете использовать bindfs + sshfs для доступа к другим пользовательским файлам (даже root).

Сначала вы монтируете свой «root» или любой другой каталог под вашим пользователем с переназначенным uid.

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

а затем просто sshfs в каталог.

sshfs USER@SERVER:tmproot TARGET

Но для безопасности лучше не отображать весь корень, /а только ту его часть, которая вам нужна. Например: Вы можете использовать этот метод для монтирования любого другого пользовательского каталога в ваш, например, файлы из / var / www в ~ / www и переназначить root для вашего пользователя, чтобы у вас был полный доступ к нему.

Если вам нужен доступ, чтобы сохранить uid или иметь доступ к нескольким пользователям, я бы создал нового пользователя, например, «rootfs» с uid = 0 и / bin / false, и сделал бы обычный sshfs.


0

Вы можете попробовать (но я не думаю, что это сработает):

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

Я не очень хорошо понимаю sshfs, так что вы могли бы заставить что-то подобное работать, но я не мог сказать как, и я был бы немного удивлен.

Другая возможность - поместить команду 'sudo / bin / su bravo' в ~ / .ssh / rc, но это повлияет на все ваши монтирования fs (если это работает, что я тоже сомневаюсь), а также на ваше обычное использование ssh ,

Извините за то, что был дебютером.


0

С помощью дедукции я думаю, что это невозможно достичь с помощью простой команды.

Это потому, что sshfs вызывает ssh без передачи каких-либо команд, а вместо этого использует SFTP, который является подсистемой SSH.

Из справочной страницы sshfs :

На удаленном компьютере используется подсистема SFTP SSH.

Кроме того , изменение текущего пользователя (или «su», или «sudo») не является частью протокола SFTP, хотя это кажется очень часто запрашиваемой функцией.


это не невозможно. Решение Крейсиса работает.
— Jayen

Конечно, да, так как он переопределяет команду, которая запускает подсистему и добавляет sudo. Хороший поиск, но вы должны настроить sudo без пароля (или использовать временную метку), что может снизить безопасность. но я не буду спорить, так как ОП действительно хотел это сделать.
— Weboide

0

Вероятно, лучший способ - через права доступа к файлам, как предлагает @artifex.

Как говорит @Weboide, это невозможно через sshfs.

Но я думаю, вы могли бы создать простой сценарий, давайте назовем его sudossh, который возьмет ваш $PWD, преобразует его /home/delta/и запускает команду через sshи sudoна удаленной машине.

Что-то вроде этого:

#!/usr/bin/env bash

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

После этого вы можете выполнить sudossh commandи не забудьте использовать относительные пути.

Если вы используете ssh-agent, вам просто нужно ввести sudoпароль.


0

Мое решение подобострастно уродливые (благодаря нескольким слоям строки отводящей), но он будет читать путь sftp-serverот /etc/ssh/sshd_configи выполнить его с помощью sudo. Что теперь, если sshd_configне находится под /etc/ssh? Может быть, искать внутри sshдвоичного файла с stringsи grep?

#!/bin/sh
sshfs -o sftp_server="/bin/sh -c \"sudo \`sed -n '/Subsystem\\\\\\\\s\\\\+sftp\\\\\\\\s\\\\+/{s///;p}' /etc/ssh/sshd_config\`\"" "$@"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.