sftp 命令支持子系统选项 (-s),允许远程用户选择远程 sftp-server 可执行文件,并可选择在此过程中升级到 sudo;
sftp -s "/usr/bin/sudo /usr/libexec/openssh/sftp-server" xxx.yyy.zzz.aaa
此命令遵循 ~/.ssh/config 中的 ssh 客户端选项,允许透明地使用 pubkey 以及自定义端口和用户设置。
然而,subsystem
似乎是 sftp 特定的,因此它没有在配置文件中设置,并且似乎必须将其设置为 sftp 的命令行选项。
然而,某些工具包装了 sftp 调用,因此无法设置子系统选项,因此无法进行用户访问。
通常是否有一些配置选项文件可以用来为 openssh sftp 设置此选项?
是否有一些配置文件可以影响 gnome nautilus 调用 sftp 进行文件管理器集成的方式?
更新可能的破解但有效的解决方案是......
因此,事实证明,sftp 没有明显的配置文件用于选项,因此我最终修改了一个通用包装脚本,通过将其放入我的路径中来显式为我选择的主机添加选项;
#!/bin/bash
# Generic shell wrapper that performs an operation
OPERATION=/usr/bin/sftp
args=("$@")
#the final arg should contain a hostname of the form [user@]host[:path]
case "${args[@]: -1}" in
myserver.com)
exec $OPERATION -s "/usr/bin/sudo /usr/libexec/openssh/sftp-server" "$args"
;;
*)
exec $OPERATION "$args"
;;
esac
然而根据你的 sudoers 文件,通常运行 sudo 需要一个 tty,所以你必须将“-t”选项传递给 ssh,你猜怎么着? ssh_config 或 ~/.ssh/config 文件中记录的 ssh 客户端命令没有配置选项。哈哈。
所以我编写了另一个包装脚本来提供......
#!/bin/bash
# Generic shell wrapper that performs an operation
OPERATION=/usr/bin/ssh
args=("$@")
#locating the hostname is not so simple with ssh
exec $OPERATION -tt "$args"
不过,我现在无法让 sftp 使用我的 ~/bin/ssh 包装文件,因为它似乎被硬编码到 sftp 中并由选项“-S”控制
答案1
根据ssh_config(5)
man page,可以在sshd_config
配置文件中配置路径:
Subsystem
Configures an external subsystem (e.g. file transfer daemon).
Arguments should be a subsystem name and a command (with optional
arguments) to execute upon subsystem request.
所以看起来你可以简单地做到这一点:
Subsystem sftp /usr/libexec/openssh/sftp-server -s "/usr/bin/sudo /usr/libexec/openssh/sftp-server"
这个配置显然是在服务器,不在客户端配置中。这是你要找的吗?缺点显然是每一个sftp 连接将尝试以 root 权限运行,因此这将破坏对文件的非 root 访问。