使用sulogin命令可以进行单用户登录,在启动时Shell将不会读取/etc/profile或$HOME/.profile文件。
语法格式:sulogin [参数]
常用参数:
| -p | 单用户Shell调用一个破折号作为参数中的第一个字符 |
| -t | 程序只会等待用户输入指定秒数 |
参考实例
进行单用户的登录:
[root@jiloc ~]# sulogin
使用sulogin命令可以进行单用户登录,在启动时Shell将不会读取/etc/profile或$HOME/.profile文件。
语法格式:sulogin [参数]
常用参数:
| -p | 单用户Shell调用一个破折号作为参数中的第一个字符 |
| -t | 程序只会等待用户输入指定秒数 |
参考实例
进行单用户的登录:
[root@jiloc ~]# sulogin
使用nologin命令可以限制某些用户通过Shell登录系统。如果/etc/nologin.txt存在,显示其内容给用户,而不是默认消息。
语法格式:nologin
参考实例
限制用户登录:
[root@jiloc ~]# nologin
lynx命令是终端上的纯文本模式的网页浏览器,没有JS引擎,不支持CSS排版、图形、音视频等多媒体信息。只能作为一个很有趣的小玩具。
语法格式:lynx [参数]
常用参数:
| -case | 搜索字符串时区分大小写 |
| -ftp | 关闭ftp功能 |
| –color | 激活彩色模式 |
| –reload | 更新首页代理服务器的缓存 |
| –help | 显示帮助 |
参考实例
访问jiloc.com:
[root@jiloc ~]# lynx jiloc.com

最近发现在进程中有一个进程为
/www/server/panel/pyenv/bin/python /www/server/panel/script/site_task.py
而且每几秒钟就会自动启动一次,且CPU占用率较高,然后网上查了一下发现是宝塔BT面板在自动上传用户信息。关于这些我们就不说啥了,下面给出修复的shell命令:
echo '' > /www/server/panel/script/site_task.py
chattr +i /www/server/panel/script/site_task.py
rm -rf /www/server/panel/logs/request/*
chattr +i -R /www/server/panel/logs/request
su命令来自于英文单词“switch user”的缩写,其功能是用于切换用户身份。管理员切换至任意用户身份而无需密码验证,而普通用户切换至任意用户身份均需密码验证。另外添加单个减号(-)参数为完全的身份变更,不保留任何之前用户的环境变量信息。
语法格式: su [参数] 用户名
常用参数:
| 单个减号(-) | 完全身份变更 |
| -c | 执行完指定的指令后,即恢复原来的身份 |
| -f | 适用于csh与tsch,使shell不用去读取启动文件 |
| -l | 改变身份时,也同时变更工作目录 |
| -m | 变更身份时,不要变更环境变量 |
| -s | 指定要执行的shell |
| –help | 显示帮助信息 |
| –version | 显示版本信息 |
参考实例
变更至指定用户身份:
[root@jiloc ~]# su jiloc
完全变更至指定用户身份:
[root@jiloc ~]# su - jiloc
setenv命令的英文全称为“set environment variable”。该命令为 tsch 中查询或设置环境变量的命令。可以在线程里用这个命令设置环境变量的值,实现线程之间的参数传递。
语法格式: setenv [参数]
常用参数:
| ENVVAR | 所要设置的环境变量的名 |
| value | 所要设置的环境变量的值 |
参考实例:
显示环境变量:
[root@jiloc ~] setenv
设置环境变量:
[root@jiloc ~] setenv USER lx138
resize命令设置终端机视窗的大小。执行resize指令可设置虚拟终端机的视窗大小。
语法格式:resize [参数]
常用参数:
| -c | 就算用户环境并非C Shell,也用C Shell指令改变视窗大小 |
| -s | 设置终端机视窗的垂直高度和水平宽度 |
| -u | 就算用户环境并非Bourne Shell,也用Bourne Shell指令改变视窗大小 |
参考实例
使用 C shell:
[root@jiloc ~]# resize -c set noglob; setenv COLUMNS '99'; setenv LINES '34'; unset noglob;
使用 Bourne shell :
[root@jiloc ~]# resize -u COLUMNS=99; LINES=34; export COLUMNS LINES;
设置指定大小 :
[root@jiloc ~]# resize -s 80 160
unset命令用于删除已定义的shell变量(包括环境变量)和shell函数。unset命令不能够删除具有只读属性的shell变量和环境变量。
语法格式:unset[参数]
常用参数:
| -f | 仅删除函数 |
| -v | 仅删除变量 |
参考实例
使用unset命令将前面所创建的环境变量mylove及其对应的值进行删除,输入如下命令:
[root@jiloc ~]# unset -v mylove

#!/bin/bash
processes=$(ps ax -o user,pid,ppid,pgid,args,stat,start,time)
zombies=$(echo -e "${processes}" | grep -E "\s(Z|z|Z.*)\s")
if [ $? == 1 ]; then
echo "no zombie processes exists on machine"
else
echo -e "${processes}" | head -1
echo "$zombies"
fi本脚本来自腾讯云

Linux下使用Shell命令查看CPU占用率高的进程脚本
#!/bin/bash
TOPK={{topk}}
SECS={{samplingTime}}
INTERVAL={{interval}}
STEPS=$(( $SECS / $INTERVAL ))
TEMP_FILE_PREFIX="/tmp/tat_public_cpu_usage"
echo Watching CPU usage...
for((i=0;i<$STEPS;i++))
do
ps -eocomm,pcpu | tail -n +2 >> $TEMP_FILE_PREFIX.$$
sleep $INTERVAL
done
echo
echo CPU eaters :
cat $TEMP_FILE_PREFIX.$$ | \
awk '
{ process[$1]+=$2;}
END{
for(i in process) {
printf("%-20s %s\n",i, process[i]) ;
}
}' | sort -nrk 2 | head -n $TOPK
rm $TEMP_FILE_PREFIX.$$| 参数名 | 参数值 | 描述 |
|---|
| topk | 前k个进程 | |
| samplingTime | 采样时间, 单位秒 | |
| interval | 采样间隔时间, 单位秒 |
本脚本来自腾讯云

Jaromil 在 2002 年设计了最为精简的一个 Linux Fork 炸弹,整行代码只有 13 个字符,在 shell 中运行后几秒后系统就会宕机:
:(){ :|:& };:这样看起来不是很好理解,我们可以更改下格式:
:(){:|:&};:
更好理解一点的话就是这样:
bomb(){bomb|bomb&};bomb
因为 shell 中函数可以省略 function 关键字,所以上面的 13 个字符的功能是定义一个函数并调用这个函数,函数的名称为 : ,主要的核心代码是 :|:&,可以看出这是一个对函数本身的递归调用,通过 & 实现在后台开启新进程运行,通过管道实现进程呈几何形式增长,最后再通过 : 来调用此函数引爆炸弹。因此,几秒钟内,系统就会因为处理不过来太多的进程而死机,解决的唯一办法就是重启。
秉着不作不死的心态,我们也来运行一下,于是我将矛头指向云主机,我使用了一个 2G 内存的云主机,首先在本地开启两个终端,在一个终端连接云主机后运行炸弹,几秒后再尝试用另外一个终端登录,效果可以看下图:
看,运行一段时间后直接报出了 -bash: fork: Cannot allocate memory,说明内存不足了。并且我在二号终端上尝试连接也没有任何反应。因为是虚拟的云主机,所以我只能通过主机服务商的后台来给主机断电重启。然后才能重新登录:
Fork 炸弹带来的后果就是耗尽服务器资源,使服务器不能正常的对外提供服务,也就是常说的 DoS。与传统 1v1、通过不断向服务器发送请求造成服务器崩溃不同,Fork 炸弹有种坐山观虎斗,不费一兵一卒斩敌人于马下的感觉。更吓人的是这个函数是不需要 root 权限就可以运行的。看到网上有帖子说某些人将个性签名改为 Fork 炸弹,结果真有好奇之人中枪,试想如果中枪的人是在公司服务器上运行的话,oh,!
当然,Fork 炸弹没有那么可怕,用其它语言也可以分分钟写出来一个,例如,Python 版:
import oswhile True:os.fork()
Fork 炸弹的本质无非就是靠创建进程来抢占系统资源,在 Linux 中,我们可以通过 ulimit 命令来限制用户的某些行为,运行 ulimit -a 可以查看我们能做哪些限制:
ubuntu@10-10-57-151:~$ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 7782max locked memory (kbytes, -l) 64max memory size (kbytes, -m) unlimitedopen files (-n) 1024pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 8192cpu time (seconds, -t) unlimitedmax user processes (-u) 7782virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited
可以看到,-u 参数可以限制用户创建进程数,因此,我们可以使用 ulimit -u 20 来允许用户最多创建 20 个进程。这样就可以预防 Fork 炸弹。但这样是不彻底的,关闭终端后这个命令就失效了。我们可以通过修改 /etc/security/limits.conf 文件来进行更深层次的预防,在文件里添加如下一行(下面的 ubuntu 需更换为你的用户名):
ubuntu - nproc 20这样,退出后重新登录,就会发现最大进程数已经更改为 20 了:
这个时候我们再次运行炸弹就不会报内存不足了,而是提示 -bash: fork: retry: No child processes,说明 Linux 限制了炸弹创建进程。

前面几篇我们学习了Docker的相关知识:
下面我们记录一下如何在系统重启之后,使Docker容器自动启动。
systemctl enable docker.service在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:
--restart=always–restart具体参数值详细信息:
no – 容器退出时,不重启容器;
on-failure – 只有在非0状态退出时才从新启动容器;
always – 无论退出状态是如何,都重启容器;
如果已经启动了则可以使用如下命令:
docker update --restart=always <CONTAINER ID>docker ps -a通过这里 STATUS 来判断是否已启动。

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eee0acf086c8 nginx “nginx -g ‘daemon …” 3 hours ago Up 4 minutes 0.0.0.0:80->80/tcp jnginx
cf8ad8125a4c bitnami/php-fpm “php-fpm -F –pid …” 3 hours ago Up 5 minutes 9000/tcp jphp-fpm
ab6dea2ab176 memcached “docker-entrypoint…” 2 days ago Up 5 minutes 0.0.0.0:11211->11211/tcp jmemcached
f0df7b311a41 mariadb “docker-entrypoint…” 2 days ago Up 5 minutes 0.0.0.0:3306->3306/tcp jmysql