在客户端,ssh(1)、scp(1) 和 sftp(1) 提供了广泛的功能。交互式登录和文件传输只是冰山一角。

  • ssh(1) - 基本的类似登录的客户端程序。
  • sftp(1) - 类似FTP的程序,使用SSH协议进行工作。
  • scp(1) - 类似rcp(1)的文件复制程序。
  • ssh_config(5) - 客户端配置文件

SSH客户端

ssh(1) 是一个程序,提供客户端功能,用于在不安全的网络上进行主机之间的安全加密通信。其主要用途是登录并在远程主机上运行程序。它还可以用来保护远程X11连接,并将任意TCP端口转发,以保护传统协议。ssh部分是为了替代像rsh和telnet这样的不安全工具而开发的,在这方面它已大大成功。rsh和telnet在交互式会话或其他地方已很少见。ssh可以使用常规密码或通过公私钥对进行身份验证。还可以配置更多选项,如使用Kerberos、智能卡或一次性密码。

通过密码认证进行远程登录:

$ ssh fred@somehost.example.org

另一种登录同一账户的方式:

$ ssh -l fred somehost.example.org

当客户端通过远程主机的shell运行时,远程程序可以交互式地运行。或者,它们可以作为参数直接传递给SSH客户端执行。它们甚至可以预先配置在认证密钥或服务器配置中。

在远程机器上运行 uname(1)

$ ssh -l fred somehost.example.org "uname -a"

查看挂载的文件系统及其空间使用情况:

$ ssh -l fred somehost.example.org "mount; df -h"

可以非常详细地配置哪些程序可以由哪些账户运行。有许多选项组合提供额外的功能,例如复用单个连接进行多个会话,或通过中介机器进行传递。通过使用 sudo(8),还可以进一步提高粒度。

SSH客户端环境变量 -- 服务器端

当然,大多数SSH活动的基础围绕着使用shell展开。在成功连接后,OpenSSH会设置几个环境变量。

SSH_CLIENT='192.168.223.17 36673 22'
SSH_CONNECTION='192.168.223.17 36673 192.168.223.229 22'
SSH_TTY=/dev/pts/6
  • SSH_CLIENT 显示客户端系统的地址、客户端系统的输出端口号,以及服务器的输入端口。
  • SSH_CONNECTION 显示客户端的地址、客户端的输出端口、服务器的地址以及服务器的输入端口。
  • SSH_TTY 命名了服务器上用于连接的伪终端设备,简称PTY。有关伪终端的更多信息,请参阅 ptm(4)tty(1)tty(4)

登录会话可以通过在服务器配置中使用 ForceCommand 或在授权密钥文件中使用 Command="..." 来限制为单个程序,并带有一组预定的参数。当发生这种情况时,会设置一个额外的环境变量 SSH_ORIGINAL_COMMAND

SSH_ORIGINAL_COMMAND=echo "hello, world"

如果服务器设置了 ExposeAuthInfo,则 SSH_USER_AUTH 环境变量指向一个临时文件,该文件列出了用于启动当前会话的身份验证方法的详细信息。

SSH_USER_AUTH=/tmp/sshauth.4JmbYfF0bhF6C17

当会话结束时,该文件将被删除。

根据用户的shell设置和系统的自有设置,还会设置其他变量。

SSH 客户端配置选项

GSSAPI(通用安全服务应用程序接口)是由 RFC 2743 定义的标准接口,提供独立模块的认证和安全消息传递功能。Kerberos V 是使用该接口的一个常见服务示例。

配置选项可以作为参数传递给 ssh(1),请参阅 ssh(1) 和 ssh_config(5) 的手册页以获取完整的选项列表。

连接非常详细的输出,GSSAPI 认证:

$ ssh -vv -K -l account host.example.org

部分选项可以在服务器主机上定义,位于用户的授权密钥文件中,并与特定的密钥配合使用。有关具体的子集,请参见 sshd(8)

command="/usr/local/sbin/backup.sh",no-pty ssh-rsa AAAAB3NzaC1yc2EAAAQEAsY6u71N...
command="/usr/games/wump",no-port-forwarding,no-pty ssh-ed25519 AAAAC3NzaC1lZDI1...
environment="gtm_dist=/usr/local/gtm/utf8",environment="gtm_principal_editing=NOINSERT:EDITING" ssh-rsa AAAA8a2s809poloh05yhh...

请注意,一些指令(如设置环境变量)默认是禁用的,必须在服务器配置中命名后才能供客户端使用。用户可以在 ~/.ssh/config 中设置更多配置指令,或由系统管理员在 /etc/ssh/ssh_config 中设置。这些相同的配置指令也可以通过 -o 参数传递。请参见 ssh_config(5) 获取完整的列表和描述。

$ ssh -o "ServerAliveInterval=60" -o "Compression=yes" -l fred server.example.org

客户端主机的系统管理员可以在 /etc/ssh/config 中设置一些全局默认值。这些全局设置中的一些可以通过使用 Match 指令为特定组或用户定向。

例如,如果某个特定的 SSH 服务器通过端口 2022 提供服务,客户端自动尝试该端口可能会更方便。OpenBSD 的某些匿名 CVS 服务器在此端口上接受 SSH 连接。然而,由于 CVS 已经使用了压缩,因此在这种情况下不应使用压缩。可以在 $HOME/.ssh/config 配置文件中指定如下内容,使默认端口为 2022 并且连接时不使用压缩:

Host anoncvs anoncvs.example.org
        Compression no
        Port 2022

有关客户端和服务器的完整列表及描述,请参见 ssh_config(5)sshd_config(5)

SFTP 客户端

sftp(1) 是一个交互式文件传输程序,它通过加密的 SSH 传输通道执行所有操作。它还可以使用 ssh(1) 的许多功能,如公钥认证和压缩。它也是所使用协议的名称。

SFTP 协议在某些方面类似于现已过时的文件传输协议(FTP),但整个会话(包括登录过程)都是加密的。然而,SFTP 不是 FTPS。后者是通过 SSH/SSL 隧道传输的传统 FTP。相比之下,SFTP 实际上是一个全新的协议。sftp(1) 还可以被配置为在远程主机的特定目录中启动。

$ sftp fred@server.example.org:/var/www

通常,SFTP 用于连接并登录指定主机,然后进入交互式命令模式。请参阅 sftp(1) 的手册页以获取可用的交互式命令,如 getputrename 等。与 ssh(1) 相同的配置选项也适用于 sftp(1)。sftp(1) 接受所有 ssh_config(5) 选项,并且这些可以在运行时作为参数传递。某些选项有明确的快捷方式。

$ sftp -i ~/.ssh/some.key.ed25519 fred@server.example.org:/var/www

其他选项可以通过 -o 参数完整指定:

$ sftp -o "ServerAliveInterval=60" -o "Compression=yes" fred@server.example.org

另一种传输方式是自动发送或接收文件。如果使用非交互式认证方法,则可以通过批处理模式自动完成整个过程。

$ sftp -b session.batch -i ~/.ssh/some_key_rsa fred@server.example.org

批处理仅在非交互式认证时有效。

SCP 客户端

scp(1) 用于在主机之间加密传输文件,使用方式类似于常规的 cp(1)。自 9.0 版本以来,它在底层基于 SFTP 协议,而之前的版本则受到了 Berkeley Software Distribution (BSD) 远程复制协议(RCP)的启发,是它的安全替代品。无论是旧版本还是新版本,都使用 SSH 来加密连接。

scp(1) 客户端与 SFTP 客户端不同,它没有基于任何正式的标准。它的目标是尽可能地模拟旧版 rcp 的行为,并以相同的方式响应。由于需要在连接的两端使用相同的程序并且需要与其他 SSH 实现兼容,功能上的变化可能会破坏这种兼容性,因此新功能更可能会被添加到 sftp(1) 中。如果可能的话,最好倾向于使用 sftp(1)。此外,scp(1) 的新版本实际上已经是 SFTP 协议的前端。

从远程复制到本地:

$ scp myaccount@sftp.example.org:*.txt .

从本地递归复制到远程:

$ scp -r /etc/ myaccount@sftp.example.org:.

作为 SFTP 协议的前端,新版 scp(1) 客户端可以覆盖大部分旧版客户端的行为,但并非完全兼容。在 OpenSSH 8.7 或更高版本的服务器端,已修复了旧版没有波浪符(~)展开的问题。因此,增加了 "expand-path@openssh.com" 协议扩展来支持此功能。另一个可能存在问题的地方是文件名中含有 shell 元字符(如 * 或 ?)时。

请参阅上面的 SFTP 客户端部分。

GUI 客户端

有很多图形化工具支持 SFTP 和 SSH。许多工具最初是作为使用过时协议 FTP 的传输工具开发的,随着时间的推移,它们增加了对 SSH 和 SFTP 的支持。遗憾的是,尽管这些工具已经现代化,但许多仍然保留了 FTP 程序的标签。其他则是更通用的文件管理器,将 SFTP 支持作为网络透明度的一种手段。几乎所有这些工具都提供完整的 SFTP 支持,包括 Kerberos 认证。

以下是一个部分列表,以展示可用选项的范围:

  • Bluefish:网站管理工具和网页编辑器,内置 SFTP 支持。
  • Cyberduck:Mac 的远程文件浏览器,支持多种协议,包括 SFTP。
  • Dolphin:KDE 桌面的高功能文件管理器,支持 SFTP。
  • Fetch:Mac 的可靠 SFTP 客户端,支持 SFTP。
  • Filezilla:FTP 工具,内置 SFTP 支持,跨平台,开源。
  • FireFTP:Mozilla Firefox 的 SFTP 插件。
  • gFTP:多线程文件传输客户端。
  • JuiceSSH:Android/Linux 的 SSH 客户端。
  • Konqueror:KDE 桌面上的文件管理器,支持 SFTP。
  • Nautilus:GNOME 桌面的默认文件管理器,支持 SFTP。
  • PuTTY:Telnet 和 SSH 的开源实现,包括 SFTP 客户端。
  • Remmina:GTK+ 编写的远程桌面客户端,支持多种网络协议,包括 SSH。
  • Thunar:XFCE 桌面的默认文件管理器,支持 SFTP。
  • Yafc:Yet Another FTP 客户端,支持 SFTP。
Last modified: Sunday, 19 January 2025, 9:43 PM