标签: Shell

  • sulogin命令 – 单用户登录

    使用sulogin命令可以进行单用户登录,在启动时Shell将不会读取/etc/profile或$HOME/.profile文件。

    语法格式:sulogin [参数]

    常用参数:

    -p单用户Shell调用一个破折号作为参数中的第一个字符
    -t程序只会等待用户输入指定秒数

    参考实例

    进行单用户的登录:

    [root@jiloc ~]# sulogin
  • nologin命令 – 限制用户登录

    使用nologin命令可以限制某些用户通过Shell登录系统。如果/etc/nologin.txt存在,显示其内容给用户,而不是默认消息。

    语法格式:nologin

    参考实例

    限制用户登录:

    [root@jiloc ~]# nologin
  • lynx命令 – 终端上的纯文本浏览器

    lynx命令是终端上的纯文本模式的网页浏览器,没有JS引擎,不支持CSS排版、图形、音视频等多媒体信息。只能作为一个很有趣的小玩具。

    语法格式:lynx [参数]

    常用参数:

    -case搜索字符串时区分大小写
    -ftp关闭ftp功能
    –color激活彩色模式
    –reload更新首页代理服务器的缓存
    –help显示帮助

    参考实例

    访问jiloc.com:

    [root@jiloc ~]# lynx jiloc.com
  • BT宝塔面板 国际版aaPanel 安装后必执行Shell

    BT宝塔面板 国际版aaPanel 安装后必执行Shell

    最近发现在进程中有一个进程为

    /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命令 – 切换用户身份

    su命令来自于英文单词“switch user”的缩写,其功能是用于切换用户身份。管理员切换至任意用户身份而无需密码验证,而普通用户切换至任意用户身份均需密码验证。另外添加单个减号(-)参数为完全的身份变更,不保留任何之前用户的环境变量信息。

    语法格式: su [参数] 用户名

    常用参数:

    单个减号(-)完全身份变更
    -c执行完指定的指令后,即恢复原来的身份
    -f适用于csh与tsch,使shell不用去读取启动文件
    -l改变身份时,也同时变更工作目录
    -m变更身份时,不要变更环境变量
    -s指定要执行的shell
    –help显示帮助信息
    –version显示版本信息

    参考实例

    变更至指定用户身份:

    [root@jiloc ~]# su jiloc

    完全变更至指定用户身份:

    [root@jiloc ~]# su - jiloc  
  • setenv命令 – 查询或显示环境变量

    setenv命令的英文全称为“set environment variable”。该命令为 tsch 中查询或设置环境变量的命令。可以在线程里用这个命令设置环境变量的值,实现线程之间的参数传递。

    语法格式: setenv [参数]

    常用参数:

    ENVVAR所要设置的环境变量的名
    value所要设置的环境变量的值

    参考实例

    显示环境变量:

    [root@jiloc ~] setenv

    设置环境变量:

    [root@jiloc ~] setenv USER lx138
  • resize命令 – 设置终端机视窗的大小

    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变量或函数

    unset命令用于删除已定义的shell变量(包括环境变量)和shell函数。unset命令不能够删除具有只读属性的shell变量和环境变量。

    语法格式:unset[参数]

    常用参数:

    -f仅删除函数
    -v仅删除变量

    参考实例

    使用unset命令将前面所创建的环境变量mylove及其对应的值进行删除,输入如下命令:

    [root@jiloc ~]# unset -v mylove    
  • Linux 下 显示僵尸进程

    Linux 下 显示僵尸进程

    #!/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占用率高的进程脚本

    Linux下使用Shell命令查看CPU占用率高的进程脚本

    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采样间隔时间, 单位秒

    本脚本来自腾讯云

  • 经典的 Fork 炸弹解析

    经典的 Fork 炸弹解析

    Jaromil 在 2002 年设计了最为精简的一个 Linux Fork 炸弹,整行代码只有 13 个字符,在 shell 中运行后几秒后系统就会宕机:

    :(){ :|:& };:

    这样看起来不是很好理解,我们可以更改下格式:

    :(){	:|:&};:

    更好理解一点的话就是这样:

    bomb(){	bomb|bomb&};bomb

    因为 shell 中函数可以省略 function 关键字,所以上面的 13 个字符的功能是定义一个函数并调用这个函数,函数的名称为 : ,主要的核心代码是 :|:&,可以看出这是一个对函数本身的递归调用,通过 & 实现在后台开启新进程运行,通过管道实现进程呈几何形式增长,最后再通过 : 来调用此函数引爆炸弹。因此,几秒钟内,系统就会因为处理不过来太多的进程而死机,解决的唯一办法就是重启。

    Bomb 一下

    秉着不作不死的心态,我们也来运行一下,于是我将矛头指向云主机,我使用了一个 2G 内存的云主机,首先在本地开启两个终端,在一个终端连接云主机后运行炸弹,几秒后再尝试用另外一个终端登录,效果可以看下图:

    看,运行一段时间后直接报出了 -bash: fork: Cannot allocate memory,说明内存不足了。并且我在二号终端上尝试连接也没有任何反应。因为是虚拟的云主机,所以我只能通过主机服务商的后台来给主机断电重启。然后才能重新登录:

    炸弹的危害

    Fork 炸弹带来的后果就是耗尽服务器资源,使服务器不能正常的对外提供服务,也就是常说的 DoS。与传统 1v1、通过不断向服务器发送请求造成服务器崩溃不同,Fork 炸弹有种坐山观虎斗,不费一兵一卒斩敌人于马下的感觉。更吓人的是这个函数是不需要 root 权限就可以运行的。看到网上有帖子说某些人将个性签名改为 Fork 炸弹,结果真有好奇之人中枪,试想如果中枪的人是在公司服务器上运行的话,oh,!

    预防方式

    当然,Fork 炸弹没有那么可怕,用其它语言也可以分分钟写出来一个,例如,Python 版:

    import os 	
        while 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 限制了炸弹创建进程。

  • 系统重启Reboot 后 Docker服务及容器自动启动设置

    系统重启Reboot 后 Docker服务及容器自动启动设置

    前面几篇我们学习了Docker的相关知识:

    下面我们记录一下如何在系统重启之后,使Docker容器自动启动。

    Docker服务自动重启设置

    systemctl enable docker.service

    Docker容器自动启动设置

    在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:

    --restart=always

    –restart具体参数值详细信息:
           no –  容器退出时,不重启容器;
           on-failure – 只有在非0状态退出时才从新启动容器;
           always – 无论退出状态是如何,都重启容器;

    如果已经启动了则可以使用如下命令:

    docker update --restart=always <CONTAINER ID>

    如何判断Docker容器状态是否已启动

    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

WeChat