掌握 SSH:您的必备命令行指南

学习实用的SSH命令,涵盖登录、密钥、文件传输、端口转发以及可复用的主机配置。

掌握SSH:你的命令行必备指南

安全外壳(SSH)协议为你提供了一种加密方式,用于登录远程系统、运行命令和传输文件。如果你管理服务器,掌握一些SSH命令行技巧能让你的工作更高效、更安全。

本指南涵盖了你最常用的命令:远程登录、密钥认证、scpsftp、本地端口转发以及~/.ssh/config别名配置。

建立安全的远程登录

SSH最常见的用途是安全地连接到远程服务器的终端。基本语法很简单,但有一些关键选项可以增强安全性和可用性。

基本连接语法

标准命令需要指定远程用户和主机地址(IP或域名):

ssh [user]@[host]
# 示例:
ssh [email protected]

指定非标准端口

出于安全考虑,许多管理员会更改默认的SSH端口(端口22)。使用-p标志指定不同的端口号:

ssh -p 2222 [email protected]

执行单个远程命令

SSH不仅限于打开交互式shell。你可以在远程服务器上执行单个命令并将输出返回本地,这对于脚本编写和快速检查非常有用。

# 在远程服务器的/var/log目录下运行'ls -l'
ssh user@host 'ls -l /var/log'

# 检查服务器的运行时间
ssh user@host uptime

使用SSH密钥管理认证

密码认证经常面临暴力破解攻击。SSH密钥使用你机器上的私钥和远程服务器上的公钥,这样服务器可以在不接收密码的情况下验证你的身份。

生成密钥对

如果你还没有密钥对,可以使用ssh-keygen生成一个。最佳实践是使用强密码短语来保护你的私钥。

ssh-keygen -t ed25519 -C "[email protected]"

RSA密钥仍然常见,尤其是在较老的系统上。对于现代OpenSSH设置上的新密钥,Ed25519通常是更简单的默认选择。

将公钥复制到服务器

ssh-copy-id工具是将本地公钥安装到远程用户~/.ssh/authorized_keys文件中的最简单方法。通常你只需输入一次密码,之后的登录就可以使用密钥。

# 将默认公钥复制到服务器并设置常见权限
ssh-copy-id user@host

提示:使用私钥 如果你的私钥不在默认位置(~/.ssh/id_rsa),连接时必须使用-i标志指定其路径:

ssh -i ~/.ssh/my_custom_key user@host

安全文件传输

SSH提供了两种主要的安全文件传输工具:scp(安全复制)和sftp(安全文件传输协议)。

A. 使用安全复制(scp

scp非常适合简单、快速的一次性文件传输,其命令行界面模仿了标准的Unix cp(复制)命令。

将文件从本地传输到远程

# 语法:scp [local_file] [user]@[host]:/[remote_path]
scp deployment.tar.gz user@webserver:/var/www/uploads/

将文件从远程传输到本地

# 语法:scp [user]@[host]:/[remote_file] [local_path]
scp user@dbserver:/var/log/backup.sql .

递归复制目录

使用-r标志复制整个目录结构。

scp -r ~/project_files/ user@buildserver:/home/user/builds/

B. 使用安全文件传输协议(sftp

sftp建立一个交互式会话,类似于传统的FTP客户端,但通过SSH进行安全保护。它更适合浏览远程目录、列出文件以及在单个会话中执行多次传输。

启动sftp会话

sftp user@host

常用sftp会话命令

命令 描述
ls 列出远程文件
lls 列出本地文件
get filename 从远程服务器下载文件
put filename 上传文件到远程服务器
cd /path/ 更改远程目录
lcd /path/ 更改本地目录
quit 退出sftp会话

使用本地端口转发的SSH隧道

SSH隧道(或端口转发)允许你加密非安全协议的连接,或通过跳板主机访问内部网络上的服务。最常见的形式是本地端口转发。

本地端口转发(-L

本地转发将流量从本地机器上的一个端口路由到通过SSH服务器的远程主机上的指定端口。这对于访问不直接暴露在公共互联网上的内部数据库、Web界面或专有服务非常有用。

场景: 你想访问一个私有的内部Web服务器(只能从jumpbox访问)的80端口。

# 语法:ssh -L [local_port]:[destination_host]:[destination_port] [user]@[jumpbox]
ssh -L 8080:internal-web.lan:80 user@jumpbox -N
  • -L 8080:internal-web.lan:80:到达本地机器8080端口的流量通过jumpbox转发到internal-web.lan的80端口。
  • -N:告诉SSH不执行远程命令;仅建立隧道。

一旦连接建立,你可以通过在本地浏览器中访问http://localhost:8080来访问内部站点。

使用SSH配置文件提高效率

手动输入复杂的SSH命令(包括自定义端口、用户名和密钥路径)效率低下。SSH配置文件(~/.ssh/config)允许你为经常访问的服务器定义别名和设置。

配置示例(~/.ssh/config

创建或编辑文件~/.ssh/config,结构如下:

# 服务器1:标准密钥,非标准端口
Host dev-web
    HostName 10.0.0.50
    User deployment_user
    Port 2222
    IdentityFile ~/.ssh/id_rsa_dev

# 服务器2:需要密钥认证的跳板机访问
Host production-db
    HostName 10.0.20.15
    User sysadmin
    IdentityFile ~/.ssh/prod_key
    LocalForward 54320 127.0.0.1:5432

在第二个示例中,ssh production-db会在你的工作站上打开一个本地端口。然后你可以将PostgreSQL客户端指向localhost:54320,SSH会将流量传送到远程主机看到的127.0.0.1:5432

使用别名连接

配置完成后,连接变得异常简单:

# 以deployment_user身份连接到10.0.0.50的2222端口
ssh dev-web

# 连接并自动设置端口转发(如果已配置)
ssh production-db

关键要点

ssh user@host开始,添加基于密钥的认证,并将重复的选项移到~/.ssh/config中。一旦这些基础牢固,使用ssh -L的本地转发就能让你以可控的方式访问私有服务,而无需将它们直接暴露在网络中。