Назад | Перейти на главную страницу

Как выполнить sudo поверх sshfs?

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

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

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

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

Это будет зависеть от ОС сервера, к которому вы подключаетесь. Для 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-server.

Возможно, вам потребуется настроить sudo с помощью NOPASS: {path to sftp-server} или выполнить предварительную проверку с помощью 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"

Вы можете использовать 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.

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

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

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

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

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

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

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

Из sshfs страница руководства:

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

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

Вероятно, лучший способ - через права доступа к файлам, как предлагает @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 пароль.

Мое решение съеживаясь некрасиво (благодаря нескольким слоям экранирования строки), но он прочитает путь к 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\`\"" "$@"