На моем локальном хосте 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\`\"" "$@"