Как мне 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.