掌握 SSH:您的必备命令行指南
学习实用的SSH命令,涵盖登录、密钥、文件传输、端口转发以及可复用的主机配置。
掌握SSH:你的命令行必备指南
安全外壳(SSH)协议为你提供了一种加密方式,用于登录远程系统、运行命令和传输文件。如果你管理服务器,掌握一些SSH命令行技巧能让你的工作更高效、更安全。
本指南涵盖了你最常用的命令:远程登录、密钥认证、scp、sftp、本地端口转发以及~/.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的本地转发就能让你以可控的方式访问私有服务,而无需将它们直接暴露在网络中。