系统管理员必备的SSH命令

学习远程登录、密钥、配置文件、文件传输、隧道、代理和故障排除的基本SSH命令。

系统管理员必备的SSH命令

安全外壳(SSH)是日常远程访问服务器和网络设备的工具。如果您管理Linux系统,您会使用SSH命令登录、复制文件、执行一次性命令、打开隧道以及调试连接故障。

本指南重点介绍在实际管理工作中最可能需要的命令和选项。

建立基本SSH连接

SSH最基本的用途是与远程服务器建立安全的交互式shell会话。基本语法简单明了,允许您指定用户和目标主机。

连接到远程服务器

使用当前本地用户名连接到远程服务器:

ssh 主机名或IP地址

如果远程服务器上的用户名与本地用户名不同,则需要指定它:

ssh 用户名@主机名或IP地址

示例:

ssh [email protected]
ssh [email protected]

指定自定义端口

默认情况下,SSH使用端口22。但出于安全原因或特定网络配置,服务器通常监听不同端口。您可以使用-p标志指定自定义端口:

ssh -p 2222 用户名@主机名或IP地址

提示: 更改默认SSH端口(端口22)是减少自动攻击尝试的常见安全做法,但这并不能替代强身份验证。

SSH密钥认证

虽然密码认证很常见,但密钥认证是SSH推荐且更安全的方法。它使用一对加密密钥:私钥(在本地机器上保密)和公钥(放置在远程服务器上)。

生成SSH密钥对

使用ssh-keygen生成新的密钥对。对于大多数现代OpenSSH设置,Ed25519密钥是很好的默认选择。仅在需要与旧系统或要求使用RSA的策略兼容时才使用RSA。

ssh-keygen -t ed25519 -a 100

此命令生成Ed25519密钥对,并增加用于保护私钥密码的密钥派生轮数。私钥(id_ed25519)和公钥(id_ed25519.pub)通常存储在~/.ssh/中。

将公钥复制到远程服务器

要启用密钥认证,您的公钥必须放置在远程服务器的~/.ssh/authorized_keys文件中。ssh-copy-id实用程序可自动完成此过程:

ssh-copy-id 用户名@主机名或IP地址

此命令会提示您输入一次远程用户的密码,然后复制您的公钥并设置正确的权限。之后,您应该能够无需密码连接(但如果您设置了私钥密码,系统会提示您输入)。

警告: 切勿与任何人共享您的私钥。它应具有严格的文件权限,例如chmod 600 ~/.ssh/id_ed25519

管理SSH连接和配置

远程执行单个命令

SSH不仅用于交互式shell。您可以直接在远程服务器上执行单个命令,并将其输出返回到本地终端。

ssh 用户名@主机名或IP地址 '要执行的命令'

示例:

ssh [email protected] 'ls -l /var/log/'
ssh [email protected] 'sudo apt update && sudo apt upgrade -y'

使用SSH配置文件(~/.ssh/config

对于频繁连接,在~/.ssh/config中定义主机可以节省时间并简化命令。此文件允许您设置别名、指定用户、端口、私钥和其他连接选项。

示例~/.ssh/config条目:

Host webserver
    Hostname 192.168.1.100
    User admin
    Port 2222
    IdentityFile ~/.ssh/id_rsa_web
    IdentitiesOnly yes

Host devbox
    Hostname dev.mydomain.com
    User developer
    Port 22
    IdentityFile ~/.ssh/id_rsa_dev

配置后,您只需使用别名即可连接:

ssh webserver
ssh devbox

最佳实践: 对重复连接使用~/.ssh/config文件。它提高了可读性,减少了输入错误,并将连接选项集中在一处。避免全局启用代理转发;仅对真正需要的主机启用。

使用SSH进行安全文件传输

SSH提供了两种主要的安全文件传输工具:scpsftp

scp(安全复制协议)

scp用于在本地和远程主机之间复制文件和目录。它使用与SSH相同的身份验证和安全机制。

将文件从本地复制到远程

scp /本地/文件/路径 用户名@主机名或IP地址:/远程/目录/路径/

示例:

scp my_app.tar.gz admin@webserver:/var/www/html/

将文件从远程复制到本地

scp 用户名@主机名或IP地址:/远程/文件/路径 /本地/目录/路径/

示例:

scp admin@webserver:/var/log/nginx/access.log ~/logs/

递归复制目录

对目录使用-r标志:

scp -r /本地/目录/路径 用户名@主机名或IP地址:/远程/父目录/路径/

保留文件属性

要保留修改时间、访问时间和模式,请使用-p标志:

scp -p 本地文件 用户@远程主机:/远程路径/

sftp(SSH文件传输协议)

sftp提供交互式文件传输程序,类似于FTP但由SSH保护。它非常适合管理多个文件或执行复杂的目录操作。

连接到SFTP服务器

sftp 用户名@主机名或IP地址

连接后,您将看到sftp>提示符。常用命令包括:

  • ls:列出远程目录内容
  • lls:列出本地目录内容
  • cd 远程目录:更改远程目录
  • lcd 本地目录:更改本地目录
  • get 远程文件:下载文件
  • put 本地文件:上传文件
  • mget 远程文件:下载多个文件(支持通配符)
  • mput 本地文件:上传多个文件(支持通配符)
  • exitbye:退出SFTP会话

示例SFTP会话:

sftp [email protected]
Connected to 192.168.1.100.
sftp> ls
config.ini  data/  logs/  public_html/
sftp> cd public_html
sftp> get index.html
Fetching /public_html/index.html to index.html
sftp> put new_page.html
Uploading new_page.html to /public_html/new_page.html
sftp> bye

SSH隧道和端口转发

SSH隧道(或端口转发)允许您在本地和远程端口之间创建安全连接,从而可以访问可能被防火墙阻止或无法直接访问的服务。

本地端口转发(-L

本地转发允许您从本地机器访问远程网络(或远程服务器本身)上的服务,就像它在本地运行一样。

ssh -L [本地端口]:[远程主机]:[远程端口] 用户名@SSH服务器

示例: 通过跳板机ssh_server,从本地机器的端口9000访问私有网络上的数据库服务器(端口3306)。

ssh -L 9000:db.private.net:3306 [email protected]

现在,您可以连接到本地机器上的localhost:9000,连接将通过jumphost.com安全转发到db.private.net:3306

远程端口转发(-R

远程转发使本地机器(或本地网络)上的服务可以从远程服务器访问,并且可能对远程服务器网络上的客户端也可访问。

ssh -R [远程端口]:[本地主机]:[本地端口] 用户名@SSH服务器

示例: 使本地Web服务器(端口8000)在ssh_server上通过端口8080可访问。

ssh -R 8080:localhost:8000 admin@remote_server.com

现在,remote_server.com上的任何人都可以通过连接到remote_server.com上的localhost:8080来访问您的本地Web服务器。

动态端口转发(-D

动态端口转发创建一个SOCKS代理,允许您通过SSH隧道路由所有流量(或特定应用程序的流量)。这对于绕过防火墙或保护浏览非常有用。

ssh -D [本地端口] 用户名@SSH服务器

示例: 在本地机器的端口1080上通过ssh_server创建一个SOCKS代理。

ssh -D 1080 [email protected]

将您的浏览器或应用程序配置为使用localhost:1080作为SOCKS5代理,其所有网络流量将通过jumphost.com进行隧道传输。

高级SSH用法和技巧

在后台运行命令

对于应运行并分离的非交互式命令,您可以使用-f标志(在命令执行前进入后台)和-N(不执行远程命令)。

ssh -f -N -L 9000:db.private.net:3306 [email protected]

这会在后台设置本地端口转发。

SSH代理和ssh-add

ssh-agent是一个将私钥保存在内存中的程序,因此每个会话只需输入一次密码。ssh-add将密钥添加到代理。

# 启动代理(如果尚未运行)
eval "$(ssh-agent -s)"
# 将密钥添加到代理
ssh-add ~/.ssh/id_ed25519
ssh-add ~/.ssh/id_ed25519_web # 特定密钥

代理转发允许您从跳板机向另一台服务器进行身份验证,而无需将私钥复制到跳板机。请谨慎使用:如果跳板机被攻破,它可能在您的会话处于活动状态时使用您转发的代理。当您只需要通过堡垒机时,优先使用ProxyJump

ssh -J [email protected] [email protected]

持久SSH连接(ControlMaster)

为了更快的连接和减少开销,~/.ssh/config中的ControlMaster允许多个SSH会话共享单个网络连接。

Host *
    ControlMaster auto
    ControlPath ~/.ssh/control/%C
    ControlPersist 4h

此配置为第一个连接创建一个控制套接字(ControlMaster auto),后续到同一主机的连接将重用此套接字最多4小时(ControlPersist 4h)。

排查SSH问题

  • 权限被拒绝:检查私钥(chmod 600 ~/.ssh/id_ed25519)、公钥(chmod 644 ~/.ssh/id_ed25519.pub)和.ssh目录(chmod 700 ~/.ssh)的文件权限。在服务器上,确保~/.ssh/authorized_keys具有chmod 600~/.ssh具有chmod 700
  • 连接超时:服务器可能已关闭,防火墙阻止了端口22(或自定义端口),或IP地址不正确。
  • 详细输出:使用-v-vv-vvv标志与ssh一起获取详细的调试信息。
    ssh -vvv [email protected]
    

要点

保持您的日常SSH工作流程简单:使用密钥认证,在~/.ssh/config中存储重复选项,使用scpsftp复制文件,并在需要时使用-L-R-D-J访问私有服务。当连接失败时,ssh -vvv通常是查看问题是DNS、路由、身份验证还是服务器策略的最快方法。