Answers:
简而言之,SCP只能用于传输文件,并且是非交互的(即,必须在命令行上指定所有内容)。SFTP更加精细,并且允许交互式命令执行诸如创建目录,删除目录和文件(当然,所有操作都取决于系统权限)等操作。
ForceCommand internal-sftp
。我想PermitTTY no
也可以阻止scp访问,但允许sftp访问,尽管我每次尝试输入密码时都会输入错误。但是这两件事不应该阻止sftp。资料来源:个人经验。
来自维基百科:
与仅允许文件传输的早期SCP协议相比,SFTP协议允许对远程文件进行一系列操作-更像是远程文件系统协议。与SCP客户端相比,SFTP客户端的其他功能包括恢复中断的传输,目录列表和远程文件删除。[1]由于这些原因,与GUI SCP客户端相比,实现GUI SFTP客户端相对简单。
和
尽管SCP和SFTP在文件传输期间使用相同的SSH加密,并且具有相同的常规开销,但是在传输文件时,SCP通常比SFTP快得多,尤其是在高延迟网络上。发生这种情况是因为SCP实施了一种更高效的传输算法,该算法不需要等待数据包确认。这样可以提高速度,但要以无法中断传输为代价,因此与SFTP不同,SCP传输必须在不终止会话的情况下才能取消。
从纯命令行角度来看:
这两个命令之间的另一个重要区别是,尽管sftp可以获取远程文件,但是sftp不能使用单个命令行将其放置到远程位置,而scp可以同时执行这两个操作。
sftp user@host:/path/to/remote.file [/path/to/local.file]
scp user@host:/path/to/remote.file [/path/to/local.file]
scp /path/to/local.file user@host:[/path/to/remote.file]
sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
两种协议的大多数差异已经在其他答案中说过,更详细地说在https://unix.stackexchange.com/q/8707/19088中
根据curl的文档,另一个区别是SCP协议不是很容易移植,通常只能在Unix系统之间工作。
顺便说一下,curl实现了这两种协议,并且与默认的OpenSSH SFTP客户端实现不同,它对于SFTP和SCP 都是非交互的。
请注意,还有FISH协议,该协议允许您通过SSH传输文件,而无需使用SCP或SFTP。据我所知,FISH不是很流行,目前仅在少数文件管理器(Midnight Commander以及一些基于KDE的文件管理器)和Lftp中实现。