如何在Linux上设置openSSH SFTP服务器?


10

我想将sftp-server配置为共享目录,但是我不知道如何修改/etc/ssh/sshd_config

我的要求是:

1)登录名不得使用证书,而只能使用密码(即授权使用密码方法)

2)我要使用用户ftp登录,密码:foo并共享目录/ home / ftp。

3)我有一个应用程序,该应用程序有时需要从服务器下载文件,而无需使用完整的运行客户端登录。

到目前为止,我在/ etc / ssh / sshd_config中添加了以下几行:

Protocol 2
Subsystem sftp /usr/libexec/sftp-server
Match User ftp
   ForceCommand internal-sftp
   ChrootDirectory /home/ftp

其他所有评论。

/home/ftp 目前是一个空目录。

如果我尝试使用根凭据下载文件,则Access可以工作,但是如果我使用ftp凭据,则访问不起作用。我需要设置一个登录shell吗?我是否需要以某种方式填充/ home / ftp?

编辑:这是我的sshd日志:

subsystem request for sftp
debug1: subsystem: exec() internal-sftp
debug1: Forced command (config) 'internal-sftp '
debug2: fd 3 setting TCP_NODELAY
debug2: fd 9 setting O_NONBLOCK
debug2: fd 8 setting O_NONBLOCK
debug1: Received SIGCHLD.
debug1: session_by_pid: pid 17613
debug1: session_exit_message: session 0 channel 0 pid 17613
debug2: channel 0: request exit-status confirm 0
debug1: session_exit_message: release channel 0
debug2: channel 0: write failed
debug2: channel 0: close_write
debug2: channel 0: send eow
debug2: channel 0: output open -> closed
debug2: channel 0: read<=0 rfd 9 len 0
debug2: channel 0: read failed
debug2: channel 0: close_read
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug2: channel 0: input drain -> closed
debug2: channel 0: send close
debug2: notify_done: reading
debug3: channel 0: will not send data after close
debug3: channel 0: will not send data after close
User child is on pid 17611
debug3: mm_request_receive entering

*客户端挂在这里(直到发生超时)*

再次请注意,如果我以“ root”身份登录,则文件将正确下载。如果我注释掉配置文件的最后三行(即该Match行及其后的2行),它也可以正确下载。


您是否尝试仅指定匹配选项之一?当您使用真实的SFTP客户端时会发生什么?您仍然可以使用普通的SSH客户端(例如sshWindows上的或PuTTY)进行连接吗?您正在使用哪个版本的OpenSSH?
丹尼尔·贝克

Answers:


7

您需要确保该文件/home/ftp归所有者所有,root并且该组和其他人没有写权限,例如chmod 0755。您需要添加子目录ftp以添加文件。


您还需要internal-sftp子系统,否则需要在以下位置提供适当的chroot环境/home/ftp

Subsystem sftp internal-sftp

要禁止所有非密码类型的登录,请输入

ChallengeResponseAuthentication no
GSSAPIAuthentication no
PubkeyAuthentication no

这些默认情况下处于激活状态。


将您的Subsystem行替换为您的Subsystem行(并设置目录权限)会使我的错误字符串消失,但是我的客户端程序“挂起”并且没有下载我需要的文件(我可以使用根凭据下载它)。有什么办法可以使sshd输出更加详细?
Emiliano

尝试仅依次添加一个配置项,然后测试是否可以连接以确定哪个选项有问题,或者是否可能是这些选项的组合。您应该在中有一些输出/var/log/secure,至少在我的系统上是这样。
丹尼尔·贝克

我已经使用LogLevel指令提高了登录级别。我可以阅读中的字符串/var/log/messages。我有以下内容:Failed none for ftp [...]后跟Accepted password for ftp [...]User child is on pid 7658。客户端挂起然后超时
Emiliano

@happy_emi考虑将这些信息添加到您的问题中。
丹尼尔·贝克

看来这是目录权限的问题。sshd_config很好
Emiliano
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.