Як зробити судо над sshfs?


35

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

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

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

Як правило, я сш в bravo, потім судо до дельти, але мені цікаво, чи є я, як це зробити, коли у мене встановиться домашній директор Чарлі через 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>" до судо для моєї ситуації
jor

1
Дуже добре, працював бездоганно. Єдине, що у прикладі є / usr / bin / sudo двічі, що здається непотрібним.
xaralis

1
@Craisis Вибачте, що з'явилася стара публікація, але я хочу перейти на сервер CentOS 6.5 з базовим користувачем, але змонтуйте папку, яка має лише кореневий доступ. Чи було б це правильно 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це не робить моє судо щасливим - воно хоче, щоб він міг отримати його. Думки?
w00t

1
@eggo @Sebi @calandoa @xaralis Чи працює ця команда також, якщо я хочу судо як 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"він не працює: \ - він просто говорить "віддалені хости відключилися"
користувач3450548

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 та перезавантажувати корінь у свого користувача, щоб у вас був повний доступ до нього.

Якщо вам потрібен доступ для збереження 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, хоча це здається дуже часто запитуваною функцією.


це не неможливо. Рішення Craisis працює.
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-агент, вам просто потрібно ввести свій 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.