背景
从 阮一峰老师的博客 了解到 sadserver 可以在线挑战一些 linux 指令相关问题(整体难度一般,但做题体验不错,有提示),这里将目前网站提供的的16道题进行简单解答,提供思路和相关指令
本文csdn 博客地址
题解
“Saint John”: what is writing to this log file?
思路
找到文件占用的进程,并关闭
相关指令
# 确认文件占用进程
lsof /var/log/bad.log
# 确认文件是否最近未更新
find /var/log/bad.log -mmin -0.1
“Saskatoon”: counting IPs.
思路
统计字符串出现次数,并倒序排列
相关指令
# 排序
sort
# 统计字符串出现次数
uniq -c
# 按数字格式倒序
sort -nr
“Santiago”: Find the secret combination
思路
计数、输出相邻行和过滤
相关指令
# 统计行数
wc -l
# 输出之后一行
grep "Alice" -A1
# 过滤数字
grep -oE "[0-9]+"
“Manhattan”: can’t write data into database.
思路
确认postgresql启动失败原因,手动启动
相关指令
# 手动启动
su postgres -c "/usr/lib/postgresql/14/bin/postgres -D /opt/pgdata/main -c config_file=/etc/postgresql/14/main/postgresql.conf"
# 检查 postgresql 数据目录下的文件
ls -l /opt/pgdata/
# 重启 postgresql
systemctl restart postgresql
“Tokyo”: can’t serve web file
思路
通过 iptables 指令检查本地防火墙规则
相关指令
# 查看防火墙规则列表
iptables -L
# 清空所有防火墙规则
iptables -F
# 访问 [apache2](https://github.com/apache/httpd) 链接, 查看具体报错
curl -i localhost:80
# 文件添加可读权限
chmod +r /var/www/html/index.html
“Cape Town”: Borked Nginx
思路
调整系统打开文件数
相关指令
# 手动启动 nginx
nginx
# 正常流程启动 nginx
systemctl start nginx
# 查看 nginx 启动错误日志
vim /var/log/nginx/error.log
# 检查 nginx 服务配置
vim /etc/systemd/system/nginx.service
# 重新加载配置并重启 nginx
systemctl daemon-reload
systemctl restart nginx
“Salta”: Docker container won’t start.
思路
检查端口占用,关闭占用8888 端口的其他服务,并检查 容器app 的启动日志,修复 nodejs 服务启动失败问题
相关指令
# 检查端口占用
netstat -tunlp | grep 8888
# 启动容器
docker start 124a4fb17a1c
# 查看启动日志
docker logs 124a4fb17a1c
# 检查 Dockerfile 中的 CMD 启动命令
cd /home/admin/app
vim Dockerfile
# 构建镜像
docker build -t app .
# 启动容器 并 开放端口
docker run -d -p 8888:8888 app
“Venice”: Am I in a container?
思路
没有需要解决的问题,主要引导大家思考 如何判断连接的服务器是在容器内,还是宿主机
参考-如何判断当前linux是 docker容器 还是 虚拟机/物理机
相关指令
# 判断是否是 podman container
cat /proc/1/environ |tr "\0" "\n" | grep container
podman 相关介绍: Podman vs Docker: All You Need To Know!
“Oaxaca”: Close an Open File
思路
找到占用文件的进程,判断会产生这个进程的原因,彻底关闭并让进程不再启动
相关指令
# 找到占用文件的进程 ,并直接 kill 掉
lsof /home/admin/somefile | tail -2 | awk '{print $2}' | xargs kill -9
# 检查 bash
vim /home/admin/.bashrc
“Melbourne”: WSGI with Gunicorn
思路
修复 nginx 和 wsgi 服务配置
相关指令
# 查看 nginx 配置
vim /etc/nginx/sites-enabled/default
# 查看 gunicorn 配置
vim /etc/systemd/system/gunicorn.service
# 查看 wsgi 服务配置
vim /home/admin/wsgi.py
# 重启 gunicorn
systemctl restart gunicorn
WSGI: Web Server Gateway Interface, 为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口
gunicorn: 基于 WSGI 实现的http服务器,类似 httpd
“Lisbon”: etcd SSL cert troubles
思路
思路:重新生成证书
解决机器时间问题、解决 iptables 规则错误问题
相关指令
# 通过 etcdctl 获取配置
etcdctl get foo
# 设置系统时间为一年前的时间
date -s "last year"
# 调用校验
curl -ik https://localhost:2379/v2/keys/foo
# 获取指令
“Jakarta”: it’s always DNS.
思路
修复域名解析顺序问题
相关指令
# 编辑配置解析顺序
vim /etc/nsswitch.conf
参考-Linux系统解析域名的先后顺序files(/etc/hosts)OR dns(/etc/resolv.conf)
“Bern”: Docker web container can’t connect to db container.
思路
修正 wordpress 连接 mysql 配置
注意:这道题检查有问题,只要不返回错误信息即可
相关指令
# 检查 wordpress 连接 mysql(没有异常返回则正常)
curl -s localhost:80 | tail -4
# 查看 wordpress 容器和 mysql 相关的配置
docker exec 6ffb084b515c env | grep "WORDPRESS_DB"
# 查看 mysql(mariadb) 容器配置
docker exec 0eef97284c44 env | grep MYSQL
# 检查 mysql 连接
mysql -h127.0.0.1 -P3306 -uroot -ppassword
# 进入 wordpress 容器
docker exec -it 6ffb084b515c /bin/bash
# 修正配置
sed -i "s#define( 'DB_HOST'.*#define( 'DB_HOST', '172.17.0.1');#g" wp-config.php
# 关闭/启动容器
docker kill 6ffb084b515c
docker start 6ffb084b515c
“Karakorum”: WTFIT – What The Fun Is This?
思路
通过 系统调用 执行 linux 指令
相关指令
# 通过 perl 脚本调用
perl -e 'chmod 0755, "/usr/bin/chmod"'
# 通过 ld-linux 库调用
/lib64/ld-linux-x86-64.so.2 /usr/bin/chmod +x /usr/bin/chmod
参考-ld-linux.so(8) - Linux man page
参考-Perl chmod Function
“Singara”: Docker and Kubernetes web app not working.
思路
重建、提交镜像,开放端口
相关指令
# 获取所有 pod
kubectl get pod -A
# 获取 pod 的描述信息
kubectl describe pod webapp-deployment-666b67994b-5sffz -n web
# 启动 register 镜像仓库
docker run -d -p 5000:5000 registry:2
# 提交镜像
docker tag webapp localhost:5000/webapp
docker push localhost:5000/webapp
# 修改 deployment 并重新启动
kubectl delete deploy webapp-deployment -n web
vim /home/admin/deployment.yml
kubectl apply -f /home/admin/deployment.yml
# 开放端口
kubectl port-forward deployments/webapp-deployment 8888 -n web
“Hong-Kong”: can’t write data into database.
思路
确认 pgsql 启动失败原因,重启后新建库表
相关指令
# 检查配置
vim /etc/postgresql/14/main/postgresql.conf
# 创建数据目录并初始化
mkdir -p /opt/pgdata
chown -R postgres:postgres /opt/pgdata
su postgres -c "/usr/lib/postgresql/14/bin/initdb -D /opt/pgdata/main"
# 创建库表
sudo -u postgres psql -c "create database dt"
sudo -u postgres psql -c "CREATE TABLE persons(name varchar(100))" -d dt
# 插入数据
sudo -u postgres psql -c "insert into persons(name) values ('jane smith');" -d dt
其他注意事项
作者温馨提醒: 做完一道题之后最好及时关闭服务器,可以帮他省钱
sudo shutdown -h now