直接apt-get install -y mysql-server会卡住,因debconf在root密码环节阻塞交互;必须用debconf-set-selections预设mysql-server/mysql-server/root_password和mysql-server/mysql-server/root_password_again两个key,且密码含特殊字符时须用单引号包裹防止解析错误。

为什么直接 apt-get install -y mysql-server 会卡住
因为 mysql-server 包在安装时依赖 debconf 做交互式配置,尤其是 root 密码环节。即使加了 -y,它仍会停在终端等待输入——不是不提示,而是用 debconf 的底层接口阻塞,脚本就挂在那里不动了。Ubuntu 默认没预设任何值,所以必须手动注入。
debconf-set-selections 必须设置哪两个 key
只有这两个 key 被正确写入,安装才不会中断:
-
mysql-server/mysql-server/root_password:root 密码主值 -
mysql-server/mysql-server/root_password_again:密码确认值(必须完全一致)
注意斜杠 / 是分隔符,不能写成下划线或空格;key 名大小写敏感;两行命令顺序不能颠倒,否则第二行可能被忽略。
密码含特殊字符时怎么避免被 shell 解析错误
如果密码里有 $、!、` 这类字符,直接双引号包裹的 echo 会导致变量展开或命令替换。必须用单引号包裹整个字符串:
echo 'mysql-server mysql-server/root_password password my$ecur3!P@ss' | sudo debconf-set-selections echo 'mysql-server mysql-server/root_password_again password my$ecur3!P@ss' | sudo debconf-set-selections
或者对每个特殊字符转义,但单引号最稳妥。
装完后连不上 root?大概率是认证插件问题
Ubuntu 22.04+ 默认装 MySQL 8.0,root 用户默认用 caching_sha2_password 插件。很多旧客户端(包括部分脚本里的 mysqladmin)不支持它,会报 Access denied,但实际密码没错。
解决办法不是换密码,而是改插件:
mysql -u root -p'your_strong_password' -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_password';"
这条命令必须在安装并启动服务后立即执行——否则后续所有非交互操作都可能失败。
真正容易被忽略的点是:debconf 预设只影响安装时的 root 密码初始化,不影响认证方式;而认证插件不兼容的问题,在自动化流程里往往要等第一次连接失败后才暴露。











