简介:面向Linux初学者与运维人员的Ubuntu 18.04系统配置实操指南,完整覆盖修改root用户密码、安装并启用SSH服务、开放root远程登录权限以及安装配置vsftpd文件服务器的全过程。文档以图文结合方式逐步演示关键命令与配置文件修改,包括使用sudo passwd root重置密码、通过apt-get安装openssh-server、编辑sshd_config开启PermitRootLogin、用netstat查看服务状态,以及去除vsftpd.conf中write_enable的注释等,并附带服务重启与FileZilla上传验证方法,可帮助读者快速建立服务器远程管理与文件传输能力。资源包为单个docx文档,容量仅556KB,内容集中精炼,适合边看边操作或作为速查手册。目前已有364人学习使用,是Ubuntu服务器部署与安全配置的实用参考资料。
1. 先想清楚再动手:为什么改 root 密码、装 SSH、装 vsftpd 这三步总是连着做
拿到一台刚装好的 Ubuntu 18.04 服务器,无论是物理机还是 VMware 虚拟机,你第一件要办的事往往就是这三件:给 root 设一个自己能记住的密码、装 SSH 让自己能远程登进去、再装一个 vsftpd 让文件能传上服务器。很多新手在这三步上翻车——root 密码设完却登不上、SSH 装完连不上、FTP 能连却传不了文件,每个环节都有隐藏门槛。这篇笔记按一个服务器初始化最常见的顺序讲完这三件事,把每步的命令、参数和坑都交代清楚。适合刚接手 18.04 服务器、或者正给实验环境开远程入口的从业者,照着走一遍就能把这套链路跑通。
2. 修改 root 密码:两种场景、五个参数与一条后悔药
修改 root 密码是这套流程的第一步,但它分两种完全不同的场景:一种是你能正常登录系统,另一种是你把密码忘了、连系统都进不去。两种场景的操作路径不一样,先分清你是哪一种再动手。
2.1 已登录系统:用 passwd 修改 root 密码的标准流程
如果你还能用普通用户登录(比如安装系统时创建的那个账户),那改 root 密码的标准做法是sudo passwd root。但动手之前,我建议先看一眼 root 当前的密码状态:
# 查看 root 在 /etc/shadow 中的密码字段 sudo grep '^root:' /etc/shadow这条命令输出的第二段(两个冒号之间的部分)就是加密后的密码散列。如果这段以!或*开头,说明 root 密码目前是锁定状态,也就是 root 账户根本没有可用的密码。Ubuntu 18.04 默认就是这种状态——安装时只让你创建普通用户,root 的密码字段默认锁定。这解释了很多人的疑惑:明明没给 root 设过密码,为什么su - root一直报认证失败。
确认状态后,执行密码修改:
# 给 root 设置新密码 sudo passwd root # 输入两次新密码后,验证切换到 root su - root这里的passwd root只能用 root 权限执行,普通用户不借助 sudo 改不了别人的密码。su - root和su root的区别要注意:加了-会同时加载 root 的完整环境变量和家目录,不加-只切换用户身份,环境变量还是原来的。我建议验证时习惯用su - root,因为后续在 root 下执行命令时,PATH 等环境变量是否完整直接决定了你能不能找到apt、ls这些命令。
如果密码设置成功但su - root依旧报错,多半不是新密码的问题,而是 root 账户被锁定后没有真正解锁。这时执行sudo passwd -u root解锁,再重新验证。这种"设置密码后仍无法登录"的现象很常见,尤其是用过一些自动化初始化脚本的机器。
2.2 忘记密码:通过 GRUB 引导进入恢复模式
忘记 root 密码、连普通用户也进不去的时候,唯一的入口就是 GRUB 引导菜单。这个方法在物理机和虚拟机上通用,操作前先把虚拟机做个快照,给自己留条后悔药。
重启机器,在 GRUB 菜单出现时按下方向键暂停自动启动,选中默认的内核行,按e键进入编辑模式。找到以linux开头的那一行,在行尾追加一段内核参数:
# 在 linux 那行末尾追加以下内容 init=/bin/bash console=tty0追加完成后按Ctrl+x或F10引导,系统会直接进入一个 root shell。注意这个阶段根文件系统是只读挂载的,直接输入passwd root会报错。先重新以读写模式挂载根文件系统,再修改密码:
# 重新以读写模式挂载根文件系统 mount -o remount,rw / # 修改 root 密码 passwd root # 修改完成后重启 reboot -f值得强调的一点是,进入这段紧急 shell 后环境变量可能不完整,passwd这类命令如果提示找不到,通常是因为 PATH 里没有/usr/bin和/bin,用绝对路径/usr/bin/passwd root就能解决。这个问题和系统里环境变量配置错误导致命令找不到是同一类故障,排查思路一致。如果屏幕提示System is rebooting卡住,直接强制断电再开机,密码已经写进 shadow 文件,不会丢。
2.3 passwd 的参数边界:锁定、解锁、删除与强制过期
passwd修改密码只是它的基本功能,日常运维里更常用的是它的一堆参数。我把它整理成了一个参数表,遇到"改了密码但登不上"这类问题时,逐个排查这几个状态。
| 参数 | 作用 | 适用场景 |
|---|---|---|
passwd -l root | 锁定 root 密码,密码字段前加! | 临时禁用 root 登录,不需要删账户 |
passwd -u root | 解锁 root 密码 | 锁定后要恢复登录时 |
passwd -d root | 删除 root 密码,变成空密码 | 测试环境,不推荐生产使用 |
passwd -e root | 强制 root 下次登录时修改密码 | 给账户设置临时密码并强制轮换 |
chpasswd | 批量修改密码,支持管道输入 | 写初始化脚本时批量设置 |
命令行里还有一个实用技巧:用chpasswd批量改密码,一条命令解决,适合在脚本里使用:
# 通过管道把 "用户名:新密码" 传给 chpasswd echo 'root:YourNewPass123' | sudo chpasswd这里有一个容易踩的细节:passwd -d删除密码后,某些 SSH 配置下会允许空密码登录,如果sshd_config里恰好开了PermitEmptyPasswords yes,那 root 就能无密码远程登录,这是最危险的组合之一。我的建议是,生产环境永远不要用空密码,改密码后的第一件事是验证su - root和ssh root@localhost两条链路都能正常走通。
3. 安装 SSH 并允许 root 远程登录:PermitRootLogin 的三个可选值怎么选
改完 root 密码,下一步是装 SSH 服务。Ubuntu 18.04 桌面版默认没装 openssh-server,最小化安装的服务器版同样没有,所以这个步骤基本必做。装完之后真正的重点是 sshd_config 里的PermitRootLogin参数怎么配——这也是网上问得最多的一个问题:为什么 root 密码明明正确,SSH 就是登不进去。
3.1 安装 openssh-server 的最小命令集
先做系统软件源检查,再安装。18.04 的官方源已经停止标准支持,如果apt update报 404,你需要先把源切换到 old-releases 镜像,这个坑我在后面避坑章节单列一条,这里先按正常流程走:
# 更新软件源索引并安装 SSH 服务端 sudo apt update sudo apt install -y openssh-server # 设置服务开机自启并立即启动 sudo systemctl enable --now ssh # 确认服务运行状态 systemctl status ssh安装包名是openssh-server,但服务名是ssh,这点容易混淆。systemctl status ssh能看到active (running)就说明服务起来了。如果用systemctl status sshd查不到,不是服务有问题,而是名字查错了。另外 18.04 上ssh.service对应的守护进程二进制文件仍然是sshd,你可以在ps aux | grep sshd里看到它。
3.2 PermitRootLogin 与 PasswordAuthentication 的组合判断
安装完成后,核心配置文件是/etc/ssh/sshd_config。允许 root 远程登录的关键参数就是PermitRootLogin,它有四个可选值,我一般按下面的表格来判断该选哪个:
| 可选值 | 行为 | 推荐场景 |
|---|---|---|
yes | 允许 root 使用密码和公钥登录 | 内网实验环境,图省事时用 |
prohibit-password | 只允许 root 使用公钥登录,禁止密码登录 | 有公网暴露的服务器,安全底线 |
forced-commands-only | 只允许 root 通过公钥执行强制命令 | 极少用,一般做自动化备份时用 |
no | 禁止 root 登录 | 安全要求极高的生产环境 |
Ubuntu 18.04 自带的 openssh-server 默认值是prohibit-password,这意味着一件事:你刚装完 SSH 就用 root 加密码去登录,系统会直接拒绝你,报Permission denied,因为默认配置里 root 只能走公钥认证,密码认证对 root 是禁用的。这也是"为什么我的 root 密码对、SSH 却拒绝我"的最常见原因。
两个参数必须放在一起判断:PermitRootLogin负责"root 能不能登",PasswordAuthentication负责"密码这种认证方式可不可用"。组合关系如下:
# 允许 root 使用密码远程登录(内网环境常用) sudo sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config echo 'PasswordAuthentication yes' | sudo tee -a /etc/ssh/sshd_config如果PasswordAuthentication no,那即使PermitRootLogin yes,root 用密码也是登不进来的,因为整个系统的密码认证都被关掉了,所有用户都只能靠密钥。建议在改配置之前先做备份,一条命令的事:
# 修改前备份,出问题时可以立刻回滚 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)这个备份习惯很便宜但非常救命。SSH 配置改错导致服务起不来的话,如果没有备份就得进恢复模式改回去了。
3.3 让配置生效并验证登录
修改完配置后不能直接重启服务了事,先检查语法,再平滑重载:
# 语法检查,任何配置错误都会在这里暴露 sudo sshd -t # 语法正常后重启服务 sudo systemctl restart ssh # 本机验证 root 能否登录 ssh root@localhostsshd -t是绝对要跑的一步。它只做配置解析不启动服务,语法错误会直接提示哪一行有问题。常见错误是手写配置时把PermitRootLogin拼错,或者在重复的Include文件里写了互相冲突的参数——18.04 的sshd_config默认带一行Include /etc/ssh/sshd_config.d/*.conf,云镜像装出来的系统常常在这个目录下已经有一个cloud-init.conf,里面可能写了自己的PasswordAuthentication配置,你在主配置里改了半天发现不生效,原因就在这。
如果 root 密码正确但登录报错,优先看/var/log/auth.log,里面有具体的拒绝原因:
# 查看 SSH 登录失败的详细日志 sudo tail -30 /var/log/auth.log日志里Failed password for root说明密码错;root not allowed because not listed in AllowUsers说明账户被AllowUsers白名单拦了;Permission denied (publickey)说明密码认证没开。看清日志里的拒绝原因再改配置,别瞎猜。
4. 安装 vsftpd 服务器:匿名、本地用户与 root 登录的边界
文件传输是服务器初始化的另一个高频需求。vsftpd 是 Ubuntu 上最常用的 FTP 服务端之一,安装简单、性能好、配置也不复杂,但 root 登录和被动模式这两个点坑了不少人。先把最小可用流程跑起来,再讲参数边界。
4.1 安装启动 vsftpd 的最小可用流程
# 安装 vsftpd sudo apt install -y vsftpd # 设置开机自启并启动 sudo systemctl enable --now vsftpd # 确认服务状态和监听端口 systemctl status vsftpd ss -tlnp | grep :21安装完成后 vsftpd 默认就会监听 21 端口。如果你执行完看到 21 端口没起来,多半是配置文件里listen=NO或者listen_ipv6=YES与当前网络栈不匹配。18.04 的 vsftpd 默认配置同时涉及 IPv4 和 IPv6,这个我在下一节参数表里细说。
4.2 核心配置参数逐项说明
主配置文件在/etc/vsftpd.conf,Ubuntu 的默认配置已经适合本地用户访问的多数场景。我用这份配置来跑通本地用户和 root 登录:
# 编辑主配置 sudo nano /etc/vsftpd.conf配置文件中需要重点确认或修改的参数如下:
| 参数 | 值 | 作用与坑 |
|---|---|---|
listen=YES | 开启 IPv4 监听 | 停止/etc/init.d/vsftpd与 systemd 的冲突写法 |
listen_ipv6=NO | 关闭 IPv6 监听 | 双栈机器上YES可能导致 21 端口不监听 |
anonymous_enable=NO | 关闭匿名访问 | 默认是 NO,安全需要 |
local_enable=YES | 允许本地用户登录 | 不开启则 root 和普通用户都无法登录 |
write_enable=YES | 允许写入 | 不开这个,上传文件必然报 550 Permission denied |
local_umask=022 | 文件权限掩码 | 022 生成 644 文件,077 更安全 |
chroot_local_user=YES | 锁定用户在自己的家目录 | 防止用户浏览整个文件系统 |
allow_writeable_chroot=YES | 允许对 chroot 根目录写入 | chroot 后家目录可写时,必须开这个 |
pasv_enable=YES | 开启被动模式 | 穿透 NAT 环境必需 |
pasv_min_port=40000/pasv_max_port=40010 | 被动模式端口段 | 防火墙需要放行这段端口 |
其中chroot_local_user=YES配合allow_writeable_chroot=YES这个组合非常容易漏。如果你只开了chroot_local_user=YES,用户会锁在根目录里,但根目录默认不可写,于是一登录就连不上或无法上传。看到了500 OOPS: vsftpd: refusing to run with writable root inside chroot()这个报错,就是第二个参数没开。
4.3 root 用户登录 vsftpd 的特别处理
默认安装完的 vsftpd,root 是登不进来的,因为 root 被写进了/etc/ftpusers这个黑名单文件。注意这个文件名很具有迷惑性——它是"禁止使用 FTP 的用户列表",不是"允许使用 FTP 的用户列表"。编辑时需要把 root 那行注释掉:
# 查看黑名单中是否有 root grep -n '^root' /etc/ftpusers # 注释掉 root 那行(行首加 #) sudo sed -i 's/^root/#root/' /etc/ftpusers如果配置文件里还启用了userlist_enable=YES和userlist_deny=YES,那么/etc/vsftpd.userlist也是黑名单,root 同样不能登录。反过来,如果userlist_deny=NO,这个文件就变成白名单,只有写进文件里的用户才能登录 FTP,这适合只开放固定账户的场景。
root 经过 chroot 之后家目录是/root,如果allow_writeable_chroot=YES没开而/root又是可写的,也会触发前面那个500 OOPS错误。完整的 root 登录配置流程是:
# 1. 注释黑名单 sudo sed -i 's/^root/#root/' /etc/ftpusers # 2. 如启用了 userlist,确认没有把 root 当黑名单列出 sudo grep -n '^root' /etc/vsftpd.userlist # 3. 改完配置后重启服务 sudo systemctl restart vsftpd5. 避坑:SSH 连不上、FTP 传不了文件的常见问题排查
前面三章把正向流程走完了,但实际运维里反而是故障排查占了大半时间。我把这几件事里最常见的故障整理成一条条踩坑记录,每条按现象、原因、解决三步写,遇到问题可以直接对照查。
5.1 SSH 连接超时或拒绝连接
现象:客户端执行ssh root@服务器IP后一直卡住不动,最后报Connection timed out,或者直接提示Connection refused。
原因:两种报错对应不同的问题。Connection refused通常是 sshd 服务没有运行或端口不是 22;Connection timed out通常是防火墙拦截或云安全组没放行 22 端口。18.04 上 ufw 默认可能是 inactive,但如果你装系统后执行过ufw enable,默认策略是拒绝入站,SSH 就会超时。
解决:先在服务器本机执行以下命令,逐层排查:
# 1. 确认 sshd 进程在跑 systemctl status ssh # 2. 确认 22 端口在监听 ss -tlnp | grep :22 # 3. 确认防火墙规则 sudo ufw status verbose # 4. 放行 SSH(如果 ufw 是开启的) sudo ufw allow 22/tcp云服务器还要在控制台安全组里放行 TCP 22 端口,这个层面和操作系统无关,但最容易让人忽略。物理机则要检查机房网络是否对 22 端口做了限制。
5.2 root 密码正确但 SSH 登录提示 Permission denied
现象:输入 root 密码后始终提示Permission denied, please try again.,确认密码没有输错。
原因:这又回到第三章讲过的组合问题。要么PermitRootLogin是prohibit-password,要么PasswordAuthentication被设为no。18.04 默认这两个值是prohibit-password和yes,所以只改第一个就能让 root 用密码登录。另外云镜像的sshd_config.d/cloud-init.conf可能覆盖了主配置。
解决:备份后修改配置,检查两处参数,再sshd -t验证语法后重启:
sudo grep -E 'PermitRootLogin|PasswordAuthentication' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf这个 grep 会把主配置和附加配置里的相关行一次性列出来,哪个文件里写了什么一眼就能看清。
5.3 FTP 能登录但列不出目录、传不了文件
现象:FileZilla 能输入用户名密码并成功登录,但列目录时一直转圈,最终超时报Failed to retrieve directory listing。
原因:这是 FTP 被动模式的典型故障。登录走的是 21 端口,但列目录和传数据走的是随机高端口,客户端没法主动与服务器建立数据连接。没有防火墙拦截时可能侥幸能通,但一旦开了 ufw 或云安全组,随机高端口就被挡住了。
解决:在 vsftpd.conf 中固定被动模式端口段,并放行防火墙:
# 在 vsftpd.conf 末尾追加固定端口段 echo 'pasv_enable=YES' | sudo tee -a /etc/vsftpd.conf echo 'pasv_min_port=40000' | sudo tee -a /etc/vsftpd.conf echo 'pasv_max_port=40010' | sudo tee -a /etc/vsftpd.conf # 重启 vsftpd sudo systemctl restart vsftpd # 放行防火墙端口段 sudo ufw allow 40000:40010/tcp云服务器同样需要在安全组里放行这段端口。客户端这边记得把传输模式设为"被动模式",大部分 FTP 客户端默认就是被动模式,但使用命令行ftp时默认是主动模式,这也会产生类似问题。
5.4 修改 sshd_config 后服务启动失败
现象:改完配置执行systemctl restart ssh,系统没有任何提示但服务就是起不来,或者直接报Job for ssh.service failed。
原因:配置语法错误,最常见的是PermitRootLogin值写错(比如写成without-password,旧版本兼容这个值,18.04 的 OpenSSH 7.6 仍然接受但会产生警告)、参数行前后多余空格、或重复指定了同一参数且值冲突。
解决:先跑语法检查再重启,这一条我在前面强调过一次,这里再给一次完整排查路径:
# 语法检查,指出具体错误行 sudo sshd -t # 如果语法检查通过但服务仍失败,看日志 sudo journalctl -u ssh --since "5 minutes ago"另一个隐蔽点来自Include /etc/ssh/sshd_config.d/*.conf,这个目录下如果同时有多个文件,文件名的字典序会决定加载顺序,后加载的配置会用同一个参数值覆盖前面的配置。多文件管理时尽量把自定义配置写到99-local.conf,确保最后加载、优先级最高。
5.5 Ubuntu 18.04 apt update 连不上源
现象:执行sudo apt update时报无法解析archive.ubuntu.com,或者连接超时、404 Not Found。
原因:Ubuntu 18.04(Bionic Beaver)已经结束标准支持,官方源里的 18.04 目录被迁移到 old-releases 镜像服务器。如果系统时间不对或者 DNS 解析异常,也会出现类似现象,但 18.04 特有的情况就是源失效。
解决:将源地址从archive.ubuntu.com替换为old-releases.ubuntu.com,并去掉所有-security和-updates之外的第三方源配置:
# 备份原有源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 用 sed 替换镜像地址 sudo sed -i 's/archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list sudo sed -i 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list # 更新源 sudo apt update这个方案只对 18.04 适用,更新的版本如果也遇到源失效,那多半是网络问题而不是生命周期问题。做完这步之后可能仍然有个别软件包索引不完整,但不影响apt install openssh-server vsftpd这类基础包安装。
6. 验证链路:从 SSH 到 FTP 的自检顺序与常用命令
配置全部完成后,建议按一套固定顺序把整条链路从头到尾验证一遍,而不是只看服务状态是 running 就以为万事大吉。我自己的验证习惯是按端口、本地、远程三层递进,哪一层卡住就立刻定位到具体环节。
第一步确认端口监听和防火墙。执行ss -tlnp看 22 和 21 端口是否都在 LISTEN 状态,再用sudo ufw status确认没有阻断。第二步本地验证,在服务器本机执行ssh root@localhost和ftp localhost,这一步能排除网络因素,纯粹验证服务端配置是否正确。第三步才是远程验证,从你的客户端机器执行同样的命令。
远程验证时用ssh -v root@服务器IP可以输出详细的握手日志,debug1: Authentications that can continue:这一行会列出当前允许的认证方式,如果只有publickey,就说明密码认证没开。FTP 侧推荐用lftp代替命令行ftp,退出码和报错信息更清晰:
# 用 lftp 连接并测试上传下载 lftp root@服务器IP lftp> ls lftp> put /etc/hostname lftp> quit关于 SSH 配置还有一个实用技巧:18.04 的 sshd 支持Include机制,把自定义配置放到/etc/ssh/sshd_config.d/99-local.conf里,比直接改主配置更利于后续升级和回滚。主配置保持默认,所有个性化设置集中在 99 号文件里,排查时只需看这一个文件。
我吃过一次亏:给一台公网服务器配了PermitRootLogin yes加上弱密码,第二天看日志全是爆破尝试,虽然没破进来,但冷汗直流。现在的习惯是公网机器一律prohibit-password,只允许密钥登录,密码认证全关;内网实验机才放宽用密码。这个习惯也建议你直接复制过去,希望帮到你。
本文还有配套的精品资源,点击获取