Ubuntu 16.04 安装Mariadb后root密码问题

ubuntu 16.04 的软件仓库中包含 MySQL和Mariadb(由于Mariadb是MySQL的一个分支,Mariadb兼容MySQL),安装MySQL的时候会自动提示输入和设置root用户的密码,而maridab会一路安装完成,可能会纳闷,root密码是啥?

默认mariadb安装完成后root没有密码。

初始安装完成后,登陆mariadb可以使用下面的命令(mariadb使用mysql命令和服务):

sudo mysql -u root

对于生产环境,可以使用命令 “mysql_secure_installation” (mysql_secure_installation是一个perl脚本)来优化一下mysql的设置。在使用该命令优化完成后,会设置root密码,但是使用下面的命令依然无法登陆MySQL。

mysql -u root -p

这是为什么呢?

其实这一切都是MySQL认证插件在作怪,使用命令”sudo mysql -u root” 登陆MySQL,查看mysql.user表,会发现如下内容:

select user, host, plugin from mysql.user;

看到plugin的值,是unix_socket,这里的意思就是mysql的root用户登录mysql使用unix_socket来验证登陆,如果使用系统的非root用户来登陆,由于对mysql的socket文件没有权限,所以即使有密码,也无法登陆,只能使用sudo命令来获取权限,不输入密码登陆。

如果想使用密码来登陆mysql,可以执行下面的操作:

UPDATE mysql.user SET plugin = 'mysql_native_password' where user = 'root';
FLUSH PRIVILEGES;

具体需要使用mysql_native_password 还是 unix_socket看自己的需求来定,如果只是使用命令行来登陆mysql,unix_socket可以省去输入密码的痛苦,如果需要phpmyadmin等软件来登陆mysql,则只好使用 mysql_native_password 了。

sudo 和 echo 一起使用时提示 Permition denied.

这样一条命令:

sudo echo "something" >> /etc/sudoer

看上去感觉应该没有问题,使用sudo提权执行echo,重定向输入到文件中,但是在实际执行的时候会提示”Permission denied”(没有权限)。

为什么会这样?很简单,真正执行重定向的是 shell,也就是说 “>> /etc/sudoer” 这块是有当前输入命令的shell来执行的,并不是 sudo 或者 echo 命令,而当前shell并没有root权限。

两种方法来解决这个问题。

第一种:

sudo sh -c "echo 'something' >> /etc/sudoer"

这种方法直接重新启用一个shell来执行 “echo ‘something’ >> /etc/sudoer”命令,并通过sudo给sh赋权限。

第二种:

echo "something" | sudo tee --append /etc/sudoer

这种方法是使用管道(’|’)和 tee 命令来接管原来由shell执行的重定向功能,并通过sudo给tee命令赋予权限。

至于tee命令,可以查看其 man page。

tee – read from standard input and write to standard output and files

参考链接:

  1. https://stackoverflow.com/questions/84882/sudo-echo-something-etc-privilegedfile-doesnt-work-is-there-an-alterna

Ubuntu 通过脚本安装 MySQL

Ubuntu (包括 Debian)在安装MySQL Server 会提示输入root的密码,这样在使用脚本安装MySQL的时候会暂停再输入密码的阶段。下面的方法通过预先设置MySQL的默认root密码,在安装的时候自动完成密码的设置。

sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password vagrant'
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password vagrant'
sudo apt -y install mysql-server

该方法只对应于MySQL,对于 MariaDB(MySQL的分支),在安装的时候并不设置默认的root密码。

参考链接:

  1. https://stackoverflow.com/questions/7739645/install-mysql-on-ubuntu-without-password-prompt

Ubuntu 16.04 Apache 启用 https

网站启用https协议需要一个授权的证书,而证书的获取在以前并不是免费的。为了加速https协议的部署和使用,”Let’s Encrypt”,一个免费、自动、并且开放的证书颁发机构,提供了免费并且被各大浏览器支持的证书。使用“Let’s Encrypt”的证书不需要复杂的过程,只需要安装自动化软件 “certbot”,就可以自动获取授权的证书,并且在apache等服务器软件上启用https协议。

这里以 Ubuntu 16.04 + Apache为例,通过 certbot 开启 https。

首先安装 certbot

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install python-certbot-apache

对 apache2 启用 https

certbot --apache

接下来回答几个比较简单的问题就可以了,比如输入邮箱地址,是否同意 “Let’s Encrypt” 的协议,对那个网站启用https(certbot会自动根据apache2的配置文件发现网站),是否同时使用 http和https协议还是只用https协议。设置完后,重启一下apache服务,然后使用https访问网站,就会发现已经被谷歌等浏览器标记为安全了。

 

参考链接:

  1. https://certbot.eff.org
  2. https://letsencrypt.org

Linux通过脚本检查用户是否存在

Linux下可以用id命令检查某个用户是否存在。

id -u username

下面的脚本可以检查用户是否存在,并且创建不存在的用户。

$user_exists=`id -u username > /dev/null 2>&1; echo $?`
if [ "$user_exits" = "1" ]; then
    sudo adduser username --gecos "" --disabled-password
    echo "username:newpassword" | sudo chpasswd
fi