我如何对sshfs进行sudo?


35

在我的本地主机上,alpha我有一个目录foo,该目录通过sshfs映射到主机bravo,如下所示:

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

但是,在主机上bravo还有一个我要添加的用户delta sudo /bin/su,以便可以在中进行工作bravo:/home/deltadelta可能无法通过ssh登录;由于我无法更改的原因,您只能在使用计算机时将sudo转换为delta。

通常我会使用ssh进入bravo,然后使用sudo到delta,但是我想知道当通过ssh挂载charlie的主目录时是否有任何办法可以做到这一点。


2
最好使用文件权限解决。
artifex

Answers:


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服务器二进制文件的位置。

您可能需要使用NOPASS:{sftp-server的路径}设置sudo或使用进行预验证,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
谢谢,这是一个非常巧妙的“把戏”。我只是在我的情况下向sudo添加了“ -u <some_other_user>”
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"吗?
Don Rhummy 2014年

1
ssh host sudo -v不会让我的sudo开心-它需要tty才能让我sudo。有什么想法吗?
w00t 2014年

1
@eggo @Sebi @calandoa @xaralis如果我想在Debian 9中以root身份sudo使用,此命令也起作用吗?因为如果我使用: 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)。

首先,您使用重新映射的uid将“ root”或任何其他目录挂载在用户下。

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

然后只需将sshfs放入目录即可。

sshfs USER@SERVER:tmproot TARGET

但是为了安全起见,最好不要映射整个根,/而只映射所需的一部分。例如:您可以使用此方法将任何其他用户目录挂载到您的目录,例如将文件从/ var / www挂载到〜/ www,然后将root重新映射到您的用户,以便您可以完全访问它。

如果您需要访问以保留uid或可以访问多个用户,那么我将创建一个新用户,例如uid = 0和/ bin / false的“ rootfs”并执行普通的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联机帮助页:

在远程计算机上,使用SSH的SFTP子系统。

另外,更改当前用户(或'su'或'sudo')不是SFTP协议的一部分,尽管这似乎是经常请求的功能。


这不是不可能的。Craisis的解决方案有效。
Jayen

当然可以,因为他覆盖了启动子系统并添加sudo的命令。很好的发现,但是您必须在没有密码的情况下设置sudo(或使用时间戳记),这可能会降低安全性。但我不会争论,因为OP确实想这样做。
Weboide 2012年

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

我的解决办法是cringingly丑(感谢串逃逸几层),但它会读取路径sftp-server/etc/ssh/sshd_config并执行它通过sudo。现在如果sshd_config不在下面/etc/ssh怎么办?也许sshstrings和搜索二进制文件grep

#!/bin/sh
sshfs -o sftp_server="/bin/sh -c \"sudo \`sed -n '/Subsystem\\\\\\\\s\\\\+sftp\\\\\\\\s\\\\+/{s///;p}' /etc/ssh/sshd_config\`\"" "$@"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.