如何通过 sshfs 使用 sudo?

如何通过 sshfs 使用 sudo?

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

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

但是,在主机上bravo有另一个用户 delta,我想sudo /bin/su以该身份进行操作,这样我就可以进行工作bravo:/home/deltadelta可能无法通过 ssh 登录;由于我无法改变的原因,您只能在进入机器后使用 sudo 切换到 delta。

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

答案1

这将根据您连接的服务器的操作系统而有所不同。对于 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 二进制文件的位置。

您可能需要使用 NOPASS:{path to 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"

答案2

您可以使用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,并将根目录重新映射到您的用户,这样您就可以完全访问它。

如果您需要访问权限来保留 uid 或有权访问多个用户,那么我将创建一个新用户,例如“rootfs”,uid=0 和 /bin/false,并执行正常的 sshfs。

答案3

通过推论,我认为这是不可能的用一个简单的命令来实现。

这是因为sshfs 调用 ssh 而不传递任何命令,而是使用 SSH 的子系统 SFTP。

来自SSHFS手册页:

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

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

答案4

可能最好的方法是通过文件权限,正如@artifex 所建议的那样。

正如@Weboide 所说,通过 sshfs 是不可能的。

但我想您可以创建一个简单的脚本,我们将其称为,sudossh它将接受您的$PWD,将其转换为并在远程机器上/home/delta/运行命令。sshsudo

像这样:

#!/usr/bin/env bash

ssh -t charlie@bravo "cd `pwd | sed 's/user\/foo/delta/'`; sudo -u delta $*"

之后您可以执行sudossh command并记住使用相对路径。

如果您使用 ssh-agent,则只需输入您的sudo密码。

相关内容