在我的本地主机上,我有一个通过 sshfs 映射到主机的alpha
目录,如下所示:foo
bravo
$ sshfs charlie@bravo:/home/charlie ~/foo
但是,在主机上bravo
有另一个用户 delta,我想sudo /bin/su
以该身份进行操作,这样我就可以进行工作bravo:/home/delta
。delta
可能无法通过 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/
运行命令。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
密码。