如何在配置文件中设置 sftp -s 子系统选项

Tom*_*Tom 11 sftp sudo openssh sshfs

sftp 命令支持一个子系统选项 (-s),它允许远程用户选择远程 sftp-server 可执行文件,并在这个过程中可选地升级到 sudo;

sftp -s "/usr/bin/sudo /usr/libexec/openssh/sftp-server" xxx.yyy.zzz.aaa
Run Code Online (Sandbox Code Playgroud)

此命令遵循 ~/.ssh/config 中的 ssh 客户端选项,允许透明使用公钥和自定义端口和用户设置。

然而,它subsystem似乎是 sftp 特定的,因此它没有在配置文件中设置,它似乎必须设置为 sftp 的命令行选项。

然而,一些工具包装了 sftp 调用,因此无法设置子系统选项,因此卡住了用户访问。

是否有一些配置选项文件我可以用来为openssh sftp设置这个?

是否有一些配置文件会影响 gnome nautilus 调用 sftp 以进行文件管理器集成的方式?


更新可能的hacky-but-functioning解决方案是......

所以事实证明没有明显的配置文件 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
Run Code Online (Sandbox Code Playgroud)

然而,根据你的 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"
Run Code Online (Sandbox Code Playgroud)

虽然,我现在无法让 sftp 使用我的 ~/bin/ssh 包装文件,因为它似乎被硬编码到 sftp 中并由选项“-S”控制

lar*_*sks 2

根据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.
Run Code Online (Sandbox Code Playgroud)

所以看起来你可以简单地做到这一点:

Subsystem sftp /usr/libexec/openssh/sftp-server -s "/usr/bin/sudo /usr/libexec/openssh/sftp-server"
Run Code Online (Sandbox Code Playgroud)

这个配置显然是在服务器上进行的,而不是在客户端配置中。这是您要找的吗?显然,缺点是每个sftp 连接都会尝试以 root 权限运行,因此这会破坏对文件的非 root 访问。