SSH(Secure Shell,安全外壳协议)是远程服务器管理的核心工具,其核心价值在于通过加密传输保障远程连接的安全性,避免数据被监听、篡改或伪造。无论是服务器日常登录、命令执行,还是文件传输、批量运维,SSH相关命令都不可或缺。本文将从基础命令、密钥认证、免密登录、文件传输、服务端配置等维度,结合实操细节(如密钥登录失败排查、用户密码设置等),全面解析SSH的使用方法,助力新手快速上手、老手规范运维。
一、SSH基础命令:远程登录的核心操作
ssh 是SSH协议的核心客户端命令,用于建立本地客户端与远程服务器的加密连接,并实现远程登录。其所有数据传输(包括密码、指令、返回结果)均采用“非对称加密+对称加密”的组合方式,从根本上保障传输安全,是远程管理的首选方式。
1. 基本语法与默认登录
SSH默认使用22号端口,若远程服务器未修改SSH默认端口,可直接通过简化命令登录;登录前需确保远程服务器已创建目标用户,且已为该用户设置密码(若未设置密码,将无法完成密码认证登录,需先在远程服务器执行passwd 用户名命令设置密码)。
基本格式:ssh [选项] 远程用户@远程主机(远程主机可填写IP地址或域名)
# 示例:使用root用户登录IP为192.168.1.100的服务器(默认22端口)
ssh root@192.168.1.100
执行上述命令后,终端会提示“Enter password for root@192.168.1.100:”,输入该远程用户(root)对应的正确密码(输入时密码不显示,避免泄露),验证通过后即可进入远程服务器的命令行界面,后续即可执行各类远程操作。
2. 常用核心选项:适配不同场景需求
实际运维中,默认登录方式往往无法满足复杂场景(如非默认端口、密钥认证、端口转发等),以下是ssh命令最常用的核心选项,结合场景示例详细说明:
(1)-p:指定非默认端口
为提升服务器安全性,多数生产环境会修改SSH默认端口(如改为2222、5888等),此时必须通过-p选项指定修改后的端口,否则会因端口不匹配导致连接失败。
示例:远程服务器SSH端口改为2222,使用root用户登录
ssh -p 2222 root@192.168.1.100
(2)-i:指定身份验证密钥
当采用密钥认证方式登录时,需通过-i选项指定本地私钥文件的绝对路径,替代密码完成身份验证。需注意:若未将本地公钥上传至远程服务器对应位置,或公钥配置异常,即使指定私钥也无法登录(具体排查方法见后续“常见问题”部分)。
示例:使用自定义私钥my_ssh_key登录远程服务器
ssh -i ~/.ssh/my_ssh_key root@192.168.1.100
(3)-o:自定义连接参数
用于覆盖系统默认配置(/etc/ssh/ssh_config)或用户自定义配置(~/.ssh/config),适用于首次连接、连接超时等特殊场景,避免频繁修改配置文件。
示例1(跳过主机指纹确认):首次连接远程服务器时,终端会提示确认主机指纹(如“Are you sure you want to continue connecting (yes/no/[fingerprint])?”),输入yes才能继续,使用以下命令可直接跳过该步骤(适合脚本自动化登录):
ssh -o StrictHostKeyChecking=no root@192.168.1.100
示例2(设置连接超时):当网络不稳定或服务器负载较高时,可设置连接超时时间(单位:秒),避免长期等待无响应,如下设置10秒超时:
ssh -o ConnectTimeout=10 root@192.168.1.100
(4)-t:强制分配伪终端
当通过SSH远程执行需要交互的命令(如sudo切换权限、top查看系统负载、vim编辑文件)时,若不分配伪终端,会出现无法输入、命令执行失败等问题,-t选项可强制分配伪终端,保障交互正常。
示例:远程重启nginx服务(需sudo权限,需交互输入密码)
ssh -t root@192.168.1.100 sudo systemctl restart nginx
(5)-L/-R:端口转发(穿透防火墙)
适用于内网服务访问、防火墙穿透等场景,通过本地端口与远程端口的映射,实现“间接访问”内网服务或让远程主机访问本地服务,是运维中常用的反向代理核心用法。
① 本地端口转发(访问远程内网服务):通过远程服务器作为跳板,访问其所在内网的其他服务(如远程服务器内网有10.0.0.5的web服务,本地无法直接访问,可通过以下命令映射)。
格式:ssh -L 本地端口:远程内网主机:远程内网端口 远程服务器用户@远程服务器IP
# 示例:本地8080端口映射远程内网10.0.0.5的80端口,访问本地localhost:8080即可访问远程内网web服务
ssh -L 8080:10.0.0.5:80 root@192.168.1.100
② 远程端口转发(让远程访问本地服务):将本地服务映射到远程服务器的某个端口,供远程主机访问(如本地有web服务,远程主机无法直接访问本地,可映射到远程服务器的8888端口)。
格式:ssh -R 远程端口:本地主机:本地端口 远程服务器用户@远程服务器IP
# 示例:本地80端口服务映射到远程192.168.1.100的8888端口,远程访问192.168.1.100:8888即可访问本地web服务
ssh -R 8888:localhost:80 root@192.168.1.100
3. 免交互执行远程命令:提升运维效率
无需登录远程服务器,直接在本地终端执行远程命令并返回结果,适合批量运维、脚本自动化(如批量查看多台服务器系统信息、批量执行备份命令),无需频繁登录退出。
基本格式:ssh 远程用户@远程主机 "命令1; 命令2"(多个命令用分号分隔,若命令含空格需加引号)
# 示例1:查看远程服务器的内核版本和系统版本(两个命令同时执行)
ssh root@192.168.1.100 "uname -r; cat /etc/os-release"
# 示例2:远程创建备份目录,再将本地备份文件上传(结合后续scp命令,免交互完成备份)
ssh root@192.168.1.100 "mkdir -p /data/backup" && scp backup.tar.gz root@192.168.1.100:/data/backup
注意:若远程命令需要sudo权限,需确保远程用户有sudo免密权限(或在命令中添加-t选项,手动输入sudo密码),否则命令会执行失败。
二、SSH密钥认证:生产环境首选的安全方式
SSH支持两种身份认证方式:密码认证和密钥认证。其中,密码认证虽简单易操作,但安全性极低,易被暴力破解(攻击者通过工具批量尝试密码);密钥认证基于非对称加密算法,安全性极高,是生产环境远程登录的首选方式。
密钥认证的核心逻辑:生成一对“公钥-私钥”,私钥保存在本地客户端(绝对保密,不可泄露),公钥可公开,需上传至远程服务器的指定文件中。登录时,客户端使用私钥加密信息,远程服务器使用公钥解密,验证通过即可完成登录,无需输入密码(免密登录的核心原理)。
以下将详细介绍密钥对的生成、私钥缓存、密钥管理等核心命令,同时补充密钥登录失败的常见细节(如公钥未配置、权限异常等)。
1. ssh-keygen:生成SSH密钥对
ssh-keygen 是生成SSH密钥对的核心命令,支持RSA、ED25519等多种加密算法。其中,ED25519是较新的算法,安全性优于传统RSA,且密钥长度更短(256位即可达到RSA 2048位的安全性),推荐优先使用;若远程服务器版本较旧(不支持ED25519算法),可改用RSA算法(2048位及以上)。
(1)基本用法(生成默认密钥对)
ssh-keygen -t ed25519 -C "your_email@example.com"
参数说明:
-
-t ed25519:指定密钥加密算法为ED25519(推荐);若服务器不支持,替换为
-t rsa -b 2048(-b指定密钥长度,2048位及以上更安全); -
-C:添加备注信息(通常填写邮箱或密钥用途,如“prod_server_login”,用于区分多组密钥,避免混淆)。
执行上述命令后,终端会出现三次交互提示,按需求配置即可:
-
“Enter file in which to save the key (/root/.ssh/id_ed25519): ”:指定密钥保存路径和文件名,默认保存在
~/.ssh/目录下(~代表当前用户的家目录),默认文件名为id_ed25519(私钥)和id_ed25519.pub(公钥);无需自定义路径可直接按回车,使用默认配置。 -
“Enter passphrase (empty for no passphrase): ”:设置私钥密码(推荐设置,即使私钥意外泄露,攻击者也需输入私钥密码才能使用,进一步提升安全性);若无需私钥密码(方便登录,但安全性降低),直接按回车。
-
“Enter same passphrase again: ”:重复输入上述私钥密码,确认无误后,密钥对生成完成。
生成成功后,进入~/.ssh/目录,可看到两个密钥文件:
-
私钥:
id_ed25519(无后缀,权限需设置为600,否则SSH会拒绝使用,后续会说明); -
公钥:
id_ed25519.pub(带.pub后缀,可公开,需上传至远程服务器)。
(2)自定义密钥文件名与路径
若需要同时管理多台远程服务器(如生产环境、测试环境、开发环境),建议为每台服务器生成独立的密钥对,避免密钥混淆导致登录失败。此时可通过-f选项自定义密钥的保存路径和文件名。
# 示例:生成用于生产环境服务器的密钥对,文件名改为server_prod_key,备注为prod_server
ssh-keygen -t ed25519 -f ~/.ssh/server_prod_key -C "prod_server"
执行后,会在~/.ssh/目录下生成两个文件:server_prod_key(私钥)和server_prod_key.pub(公钥),后续登录生产环境服务器时,指定该私钥即可。
2. ssh-agent:私钥缓存代理(避免重复输入私钥密码)
若为私钥设置了密码,每次使用密钥认证登录远程服务器时,都需要输入私钥密码,频繁登录多台服务器或多次登录同一服务器时,会非常繁琐。ssh-agent 是一个后台进程,用于缓存已解锁的私钥,只需在首次使用时输入一次私钥密码,后续登录时自动复用缓存的私钥,无需重复输入密码,大幅提升运维效率。
(1)启动ssh-agent
ssh-agent 的启动命令因终端类型略有差异,以下是Linux/macOS系统的常用启动方式(Windows系统可通过Git Bash或WSL终端执行类似命令):
# Linux/macOS(sh/bash/zsh终端,最常用)
eval "$(ssh-agent -s)"
# 若使用csh/tcsh终端,需执行以下命令
eval `ssh-agent -c`
参数说明:
-
-s:输出sh/bash兼容的环境变量(默认选项,适配绝大多数终端);
-
-c:输出csh兼容的环境变量,仅适配csh/tcsh终端。
启动成功后,终端会输出SSH_AGENT_PID(ssh-agent进程ID)和SSH_AUTH_SOCK(代理套接字路径),eval命令会自动将这些环境变量注入当前终端,让后续的ssh-add等命令能找到ssh-agent进程,正常实现私钥缓存。
(2)验证ssh-agent是否启动成功
启动后,可通过以下命令验证进程是否正常运行:
# 查看ssh-agent进程(过滤掉grep自身进程)
ps aux | grep ssh-agent | grep -v grep
# 查看ssh-agent相关环境变量(有输出即代表启动成功)
echo $SSH_AGENT_PID
echo $SSH_AUTH_SOCK
若执行后无进程输出或环境变量为空,说明启动失败,可重新执行启动命令,或检查终端是否兼容。
(3)关闭ssh-agent
若无需继续使用私钥缓存,或需要更换私钥,可关闭ssh-agent进程,关闭后缓存的私钥会全部失效,下次使用需重新启动并添加私钥:
ssh-agent -k
执行后,终端会提示“Agent pid XXXX killed”(XXXX为ssh-agent进程ID),代表进程已成功终止。
3. ssh-add:管理agent中的私钥
ssh-add 是与ssh-agent配合使用的核心命令,用于将本地私钥添加到ssh-agent的缓存中,同时支持查看、删除缓存的私钥,以及设置私钥缓存超时时间,进一步提升安全性。
(1)添加私钥到缓存
启动ssh-agent后,需将本地私钥添加到缓存中,才能实现后续免重复输入私钥密码的功能:
# 添加默认私钥(~/.ssh/id_ed25519 或 ~/.ssh/id_rsa,无需指定路径)
ssh-add
# 添加自定义私钥(需指定私钥绝对路径,如前面生成的生产环境私钥)
ssh-add ~/.ssh/server_prod_key
若私钥设置了密码,执行上述命令后,终端会提示“Enter passphrase for ~/.ssh/server_prod_key: ”,输入正确的私钥密码后,私钥即被成功缓存到ssh-agent中,后续登录时无需再输入该密码。
注意:若私钥权限过高(如644、755),执行ssh-add时会提示“Permissions are too open”,导致无法添加私钥,此时需先修改私钥权限(chmod 600 私钥路径),再执行添加命令。
(2)查看缓存的私钥
可通过ssh-add的选项,查看当前ssh-agent中缓存的所有私钥,便于确认私钥是否添加成功:
# 列出缓存私钥的指纹(简洁模式,显示密钥算法、密钥长度、指纹和备注,便于区分多组密钥)
ssh-add -l
# 列出缓存私钥对应的公钥内容(详细模式,可查看完整公钥,用于验证公钥是否正确)
ssh-add -L
(3)删除缓存的私钥
当需要更换私钥,或不再使用某台服务器的私钥时,可删除ssh-agent中缓存的对应私钥,避免误使用:
# 删除指定私钥(需指定私钥绝对路径)
ssh-add -d ~/.ssh/server_prod_key
# 删除所有缓存的私钥(一键清空,适合更换多组私钥场景)
ssh-add -D
(4)设置私钥缓存超时时间
为进一步提升安全性,可设置私钥缓存的超时时间,超时后私钥会自动从ssh-agent中失效,需重新输入私钥密码添加,避免长时间缓存导致的安全风险(如本地电脑被他人操作)。
# 示例:设置私钥缓存1小时(3600秒)后失效,超时后需重新添加
ssh-add -t 3600 ~/.ssh/server_prod_key
参数-t后跟随超时时间(单位:秒),可根据实际需求调整(如生产环境可设置30分钟,即1800秒)。
三、SSH免密登录:实操配置与细节排查
生成密钥对、启动ssh-agent并添加私钥后,还需将本地公钥上传至远程服务器的指定文件中,才能实现真正的免密登录(无需输入远程用户密码,也无需重复输入私钥密码)。
核心注意点:远程服务器的公钥存储文件(~/.ssh/authorized_keys)和~/.ssh/目录的权限有严格要求,权限过高或过低都会导致密钥认证失败;同时,若远程用户未设置密码,虽不影响密钥认证,但建议为用户设置密码(避免极端情况下无法登录)。
手动复制公钥容易出现权限错误、格式错误(如公钥复制不完整、多换行),推荐使用ssh-copy-id命令,可一键完成公钥复制,并自动配置正确的权限,是实现免密登录的最便捷方式。
1. 基本用法(复制默认公钥)
若使用默认生成的公钥(~/.ssh/id_ed25519.pub或~/.ssh/id_rsa.pub),可直接执行以下命令,一键上传公钥到远程服务器:
ssh-copy-id root@192.168.1.100
执行流程与注意事项:
-
终端会提示“root@192.168.1.100’s password: ”,此处需输入远程服务器root用户的密码(这是最后一次输入该密码,后续即可免密登录);若远程用户未设置密码,会提示“Permission denied”,需先在远程服务器执行
passwd 用户名设置密码,再重新执行该命令。 -
密码验证通过后,
ssh-copy-id会自动读取本地默认公钥的内容,无需手动输入。 -
自动在远程服务器的
~/.ssh/目录下创建authorized_keys文件(若该文件已存在,会将本地公钥追加到文件末尾,不会覆盖原有公钥,支持多台客户端免密登录同一服务器)。 -
自动配置权限:将远程服务器的
~/.ssh/目录权限设置为700(仅当前用户可读写执行,其他用户无权限),将authorized_keys文件权限设置为600(仅当前用户可读写,其他用户无权限)——这是SSH密钥认证的必要条件,若权限不正确,SSH会拒绝使用密钥认证,导致免密登录失败。
执行成功后,终端会提示“Number of key(s) added: 1”,代表公钥已成功上传,此时执行ssh root@192.168.1.100,即可直接免密登录远程服务器。
2. 复制指定公钥(多密钥场景)
若使用自定义密钥对(如前面生成的server_prod_key.pub),需通过-i参数指定公钥文件的绝对路径,避免上传默认公钥导致登录失败:
# 示例:上传自定义公钥server_prod_key.pub到远程服务器
ssh-copy-id -i ~/.ssh/server_prod_key.pub root@192.168.1.100
关键注意点:-i参数后必须跟随公钥文件(带.pub后缀),不可指定私钥(若指定私钥,会提示“invalid key”);若私钥已添加到ssh-agent缓存,上传公钥后,后续可直接使用ssh -i ~/.ssh/server_prod_key root@192.168.1.100免密登录。
3. 远程SSH端口非默认时(需指定端口)
若远程服务器已修改SSH端口(如改为2222),使用ssh-copy-id上传公钥时,需通过-p参数指定修改后的端口,否则会因端口不匹配导致连接失败:
# 示例:远程端口为2222,上传自定义公钥
ssh-copy-id -p 2222 -i ~/.ssh/server_prod_key.pub root@192.168.1.100
执行后,同样需要输入远程用户的密码,验证通过后即可完成公钥上传,后续登录时需指定对应端口和私钥。
4. 手动复制公钥(备用方案)
若远程服务器不支持ssh-copy-id命令(如部分老旧系统、嵌入式设备),可手动复制本地公钥内容到远程服务器的authorized_keys文件中,需注意格式和权限,避免出错:
# 本地读取公钥内容,通过ssh命令传输到远程服务器,并配置正确权限
cat ~/.ssh/id_ed25519.pub | ssh -p 2222 root@192.168.1.100 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh"
命令解析:
-
cat ~/.ssh/id_ed25519.pub:读取本地公钥内容; -
|:管道符,将公钥内容传递给后面的ssh命令; -
ssh -p 2222 root@192.168.1.100:连接远程服务器(指定非默认端口2222); -
mkdir -p ~/.ssh:若远程服务器~/.ssh/目录不存在,自动创建(-p参数避免目录已存在时提示错误); -
cat >> ~/.ssh/authorized_keys:将本地公钥内容追加到远程authorized_keys文件末尾(>>是追加,>是覆盖,避免覆盖原有公钥); -
chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh:手动配置正确权限,确保密钥认证正常。
手动复制完成后,建议登录远程服务器,查看authorized_keys文件内容,确认公钥已完整添加(公钥应为一行完整内容,无换行、无缺失),避免因复制不完整导致登录失败。
四、SSH文件传输:安全高效的远程文件操作
除了远程登录和命令执行,SSH还支持加密的文件传输,核心工具为scp(Secure Copy,基于SSH的文件复制)和sftp(Secure FTP,基于SSH的文件传输协议)。两者均通过SSH加密通道传输数据,安全性远高于传统FTP(传统FTP传输数据未加密,易被监听窃取),适用于不同的文件传输场景。
1. scp:简单高效的文件/目录复制
scp 用法与Linux本地cp命令类似,操作简单、传输高效,支持“本地→远程”“远程→本地”“远程→远程”三种传输方向,且支持递归复制目录(无需额外工具),适合单文件、多文件或目录的快速传输。
关键注意点:scp指定端口时,使用大写-P(与ssh命令的小写-p区分),若使用小写-p,会被识别为“保留文件属性”的参数,导致端口指定失效,连接失败。
(1)本地文件传输到远程
将本地电脑的文件,传输到远程服务器的指定目录下,适合本地备份文件上传、脚本上传等场景。
基本格式:scp [选项] 本地文件路径 远程用户@远程主机:远程目录路径
# 示例1:将本地备份文件backup.tar.gz,传输到远程192.168.1.100的/data/backup目录(远程端口2222)
scp -P 2222 ~/local_file/backup.tar.gz root@192.168.1.100:/data/backup/
# 示例2:传输本地目录到远程(添加-r参数,递归复制整个目录,包括子目录和文件)
scp -r -P 2222 ~/local_dir root@192.168.1.100:/data/
(2)远程文件传输到本地
将远程服务器的文件或目录,下载到本地电脑的指定目录下,适合远程日志下载、备份文件下载等场景。
基本格式:scp [选项] 远程用户@远程主机:远程文件路径 本地目录路径
# 示例1:将远程/data/backup目录下的remote_file.tar.gz,下载到本地~/local_backup目录
scp -P 2222 root@192.168.1.100:/data/backup/remote_file.tar.gz ~/local_backup/
# 示例2:下载远程目录到本地(添加-r参数,递归下载)
scp -r -P 2222 root@192.168.1.100:/data/remote_dir ~/local_dir/
(3)常用优化选项:提升传输效率与安全性
结合实际运维场景,scp的以下选项可大幅提升传输体验,解决大文件传输、免密传输等需求:
-
-v:显示详细传输日志,用于排查传输失败(如连接超时、权限不足、端口错误等);
-
-C:传输时自动压缩数据,提升大文件、多文件的传输速度(压缩和解压过程自动完成,不影响文件本身);
-
-i:指定本地私钥文件路径,实现免密传输(无需输入远程用户密码,前提是公钥已上传至远程服务器)。
# 示例:免密、压缩传输大文件(ISO镜像),指定私钥和非默认端口
scp -C -i ~/.ssh/server_prod_key -P 2222 large_file.iso root@192.168.1.100:/data/
2. sftp:交互式文件传输(适合多文件交互操作)
sftp 提供交互式的文件传输界面,支持文件上传、下载、删除、重命名、创建目录等多种操作,适合需要多次交互的文件管理场景(如批量上传/下载多个零散文件、远程修改文件名、查看远程文件详情等),操作方式与传统FTP类似,但安全性更高。
(1)连接远程服务器
基本格式:sftp [选项] 远程用户@远程主机,指定端口时同样使用大写-P。
# 示例:连接远程192.168.1.100(端口2222),使用root用户登录
sftp -P 2222 root@192.168.1.100
连接成功后,终端提示符会变为sftp>,代表进入交互式传输模式,后续即可执行各类sftp命令;若采用密钥认证,且私钥已添加到ssh-agent缓存,连接时无需输入密码,直接进入交互模式。
(2)核心交互命令(常用且必备)
sftp命令分为“本地操作”和“远程操作”,本地操作命令前缀均为l(local),远程操作命令无前缀,便于区分,以下是最常用的核心命令:
-
本地操作:
-
lpwd:查看本地当前工作目录(即本地电脑的目录,默认是执行sftp命令时的目录); -
lcd 本地目录路径:切换本地工作目录(如lcd ~/local_backup,切换到本地备份目录); -
lls:列出本地当前目录下的所有文件和目录(与本地ls命令用法一致,可加-l查看详细信息)。
远程操作(操作远程服务器的文件和目录):
-
pwd:查看远程当前工作目录(默认是远程用户的家目录,如root用户默认是/root); -
cd 远程目录路径:切换远程工作目录(如cd /data/backup,切换到远程备份目录); -
ls:列出远程当前目录下的所有文件和目录(可加-l查看详细信息,如权限、大小、修改时间); -
mkdir 远程目录名:在远程当前目录下创建新目录(如mkdir log_backup,创建日志备份目录); -
rm 远程文件名:删除远程当前目录下的指定文件(不可删除目录,删除目录需用rmdir,且目录需为空); -
rmdir 远程目录名:删除远程当前目录下的空目录。
文件传输(核心操作):
-
put 本地文件路径:将本地文件上传到远程当前目录(如put backup.tar.gz,上传本地当前目录的备份文件); -
get 远程文件路径:将远程文件下载到本地当前目录(如get remote_backup.tar.gz,下载远程当前目录的备份文件); -
put -r 本地目录路径:递归上传本地目录(包括子目录和所有文件,如put -r ~/local_dir); -
get -r 远程目录路径:递归下载远程目录(如get -r /data/remote_dir)。
退出连接:exit 或 quit(两种命令均可,退出sftp交互式模式,返回本地终端)。
(3)实操示例:交互式上传/下载文件
结合上述命令,演示一套完整的交互式文件传输流程(上传本地备份文件,下载远程日志文件):
# 1. 连接远程服务器(端口2222,root用户)
sftp -P 2222 root@192.168.1.100
# 2. 查看远程当前目录(默认是/root)
sftp> pwd
# 3. 切换远程目录到/data/backup(用于存储备份文件)
sftp> cd /data/backup
# 4. 查看本地当前目录(默认是执行sftp命令时的目录)
sftp> lpwd
# 5. 切换本地目录到~/local_backup(本地备份文件所在目录)
sftp> lcd ~/local_backup
# 6. 上传本地备份文件backup.tar.gz到远程/data/backup目录
sftp> put backup.tar.gz
# 7. 查看远程目录,确认文件上传成功
sftp> ls -l
# 8. 下载远程目录下的日志文件nginx.log到本地当前目录
sftp> get nginx.log
# 9. 查看本地目录,确认文件下载成功
sftp> lls -l
# 10. 退出sftp连接
sftp> exit
注意:若传输大文件时出现中断,可重新执行上传/下载命令,sftp会自动续传(无需重新传输整个文件);若传输失败,可添加-v选项连接sftp,查看详细日志排查问题(如权限不足、磁盘空间不足等)。
五、SSH服务端配置:sshd_config与sshd服务管理
前面介绍的ssh、ssh-keygen、scp、sftp等均为SSH客户端命令,若需要配置远程服务器的SSH服务(如修改端口、禁用密码登录、限制登录用户等),需操作SSH服务端的配置文件和服务进程——核心是sshd_config配置文件(SSH服务端主配置文件)和sshd服务命令(管理SSH服务进程)。
关键注意点:修改服务端配置前,必须先备份原配置文件,避免修改错误导致SSH服务无法启动,进而无法远程登录服务器(若修改错误,需本地登录服务器恢复配置)。
1. 核心配置文件:/etc/ssh/sshd_config
SSH服务端的所有核心配置,均保存在/etc/ssh/sshd_config文件中,该文件默认有很多注释行(以#开头),注释行不生效,仅非注释行(去掉#的行)才是实际生效的配置。
(1)配置文件备份
修改前,先执行以下命令备份原配置文件,备份文件名为sshd_config.bak,便于后续恢复:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
若后续修改错误,可通过cp /etc/ssh/sshd_config.bak /etc/ssh/sshd_config命令恢复原配置,再重启SSH服务即可。
(2)常用核心配置项(必改+推荐配置)
使用文本编辑器(如vim、nano)编辑配置文件(vim /etc/ssh/sshd_config),找到以下配置项,修改后保存退出(vim编辑器按Esc,输入:wq保存退出);所有配置修改后,必须重启sshd服务才能生效。
以下是生产环境常用的核心配置项,结合安全性和实用性详细说明,同时补充配置错误的影响:
-
Port 22:SSH服务监听端口,默认是22号端口。 推荐修改:改为非22端口(如2222、5888等),降低暴力破解风险;修改后需确保防火墙开放新端口,否则无法远程连接。 -
PermitRootLogin no:是否允许root用户直接登录SSH。 推荐配置:no(禁用root直接登录),提升安全性——攻击者即使破解了普通用户密码,也无法直接获得root权限,需通过普通用户登录后,再用su或sudo切换到root;若配置为yes,则允许root直接登录,风险较高。 -
PasswordAuthentication no:是否允许密码认证登录。 推荐配置:no(禁用密码认证),仅允许密钥认证,彻底杜绝暴力破解;需注意:禁用密码认证前,必须确保密钥认证已配置成功(公钥已上传至服务器),且远程用户已设置密码(避免极端情况下无法登录),否则会导致无法远程登录。 -
PubkeyAuthentication yes:是否启用密钥认证。 默认配置:yes(启用),无需修改;若配置为no,则禁用密钥认证,仅允许密码认证,不推荐。 -
AuthorizedKeysFile .ssh/authorized_keys:指定远程服务器存储客户端公钥的文件路径。 默认配置:.ssh/authorized_keys(即远程用户家目录下的~/.ssh/authorized_keys文件),无需修改;若自定义路径,需确保路径正确,且文件权限为600,否则密钥认证失败。 -
AllowUsers user1 user2:仅允许指定的用户登录SSH(白名单机制)。 推荐配置:根据实际需求添加允许登录的用户(如AllowUsers prod_user test_user),禁止无关用户登录,进一步提升安全性;若不配置,所有存在的远程用户(且有密码/密钥)均可尝试登录。 -
ClientAliveInterval 60:客户端心跳包间隔时间(单位:秒)。 推荐配置:60(每隔60秒,服务器向客户端发送一次心跳包),避免因网络不稳定或长时间无操作导致连接超时断开。 -
ClientAliveCountMax 3:客户端无响应次数上限。 推荐配置:3(若客户端连续3次未响应服务器的心跳包,服务器自动断开连接),避免无效连接占用服务器资源。
2. sshd服务管理命令(启停、重启、状态查看)
sshd是SSH服务端的守护进程,所有配置修改后,必须重启该进程才能生效;同时,可通过系统服务命令管理sshd服务(如查看状态、停止、开机自启等),不同Linux系统的命令略有差异(CentOS/RHEL与Ubuntu的服务名不同)。
# 1. 查看sshd服务状态(确认服务是否正常运行)
systemctl status sshd # CentOS/RHEL 7+ 系统(服务名是sshd)
systemctl status ssh # Ubuntu 16.04+ 系统(服务名是ssh)
# 2. 重启sshd服务(修改配置后必执行,使配置生效)
systemctl restart sshd # CentOS/RHEL
systemctl restart ssh # Ubuntu
# 3. 设置sshd服务开机自启(避免服务器重启后,SSH服务无法自动运行)
systemctl enable sshd # CentOS/RHEL
systemctl enable ssh # Ubuntu
# 4. 停止sshd服务(不推荐,停止后无法远程登录,需本地登录启动)
systemctl stop sshd # CentOS/RHEL
systemctl stop ssh # Ubuntu
# 5. 启动sshd服务(停止后重新启动)
systemctl start sshd # CentOS/RHEL
systemctl start ssh # Ubuntu
关键注意事项:
-
修改SSH端口后,重启
sshd服务前,必须确保防火墙开放新端口(如CentOS执行firewall-cmd --add-port=2222/tcp --permanent,Ubuntu执行ufw allow 2222/tcp),否则重启后无法远程连接服务器。 -
若重启
sshd服务失败(提示“Job for sshd.service failed”),大概率是sshd_config配置文件有错误(如语法错误、端口被占用),可执行sshd -t命令检查配置文件语法,根据提示修改错误后,再重新重启服务。
总结
SSH相关命令构成了远程服务器管理的核心工具链,从基础的ssh登录,到安全的密钥管理(ssh-keygen、ssh-agent、ssh-add),再到免密配置(ssh-copy-id)和文件传输(scp、sftp),以及服务端安全配置(sshd_config),每个命令都有其明确的应用场景。掌握这些命令的核心用法,不仅能提升远程操作的效率,更能保障服务器的安全。建议在实际使用中遵循“密钥认证优先、禁用密码登录、修改默认端口、限制登录用户”的安全原则,构建可靠的远程管理环境。
原文 https://blog.csdn.net/2301_79518550/article/details/155717252