首页 文章 精选 留言 我的

精选列表

搜索[linux],共10000篇文章
优秀的个人博客,低调大师

我把Linux系统上面误删的数据找回来了

一、背景 突发事件,应用上传的数据被程序自动删掉了,可悲的是还没有数据备份,数据是放在系统的 /data/webapps/xxxx/upload 目录下面,可把我们急坏了,之前又没有做过数据恢复的测试,然后我找到了一款数据恢复的软件,成功把删除的大部分数据找回来了,我的数据恢复过程如下。 二、安装恢复软件 1、epel 仓库安装 如果我们的源里面添加了 epel 仓库的话,我们可以直接使用下面的命令安装。 yum install extundelete -y 2、源码编译安装 wget http://zy-res.oss-cn-hangzhou.aliyuncs.com/server/extundelete-0.2.4.tar.bz2 yum -y install bzip2 e2fsprogs-devel e2fsprogs gcc-c++ make tar -xvjf extundelete-0.2.4.tar.bz2 cd extundelete-0.2.4 ./configure make && make install 三、删除数据查找 首先我们最好先卸载挂载的磁盘,我这里是 /dev/sda5 挂载到了 /data 目录下面。因为我的数据路径比较深,所以我们需要一步步查找,可以先从根分区(/data) inode 查找,根分区(/data)当前目录的 inode为2。 extundelete /dev/sda5 --inode 2 我们会看到 weapps (/data/webapps)目录的inode, extundelete /dev/sda5 --inode 24641537 我们看到项目(/data/webapps/project)的 inode, extundelete /dev/sda5 --inode 24903688 我们找到了最终删除数据的目录 upload (/data/webapps/project/upload) extundelete /dev/sda5 --inode 24904454 我们可以看到标称的 Deleted,这些数据就是我们要进行恢复的数据。 四、数据恢复 那我们就恢复指定目录,以当前分区(就是把/data当做根目录/)为根分区进行路径设定,项目名进行掩盖。 extundelete /dev/sda5 --restore-directory /webapps/project/upload 因为磁盘数据一直在读写,所以有些文件之前的 inode 已经被重新分配了,导致部分数据无法恢复,数据最后会告诉我们有多少文件没有回复,但是大部分数据我们已经恢复了,这就是很重要的事情了。 那我们查看一下回复的数据吧,软件会在当前目录生成一个目录 RECOVERED_FILES 里面就是我们恢复的数据。 恢复全部数据可以使用命令 extundelete /dev/sda5 --restore-all 使用方法 extundelete --help 其中,参数(options)有:--version, -[vV],显示软件版本号。--help,显示软件帮助信息。--superblock,显示超级块信息。--journal,显示日志信息。--after dtime,时间参数,表示在某段时间之后被删的文件或目录。--before dtime,时间参数,表示在某段时间之前被删的文件或目录。 动作(action)有:--inode ino,显示节点“ino”的信息。--block blk,显示数据块“blk”的信息。--restore-inode ino[,ino,...],恢复命令参数,表示恢复节点“ino”的文件,恢复的文件会自动放在当前目录下的RESTORED_FILES文件夹中,使用节点编号作为扩展名。--restore-file 'path',恢复命令参数,表示将恢复指定路径的文件,并把恢复的文件放在当前目录下的RECOVERED_FILES目录中。--restore-files 'path',恢复命令参数,表示将恢复在路径中已列出的所有文件。--restore-all,恢复命令参数,表示将尝试恢复所有目录和文件。-j journal,表示从已经命名的文件中读取扩展日志。-b blocknumber,表示使用之前备份的超级块来打开文件系统,一般用于查看现有超级块是不是当前所要的文件。-B blocksize,通过指定数据块大小来打开文件系统,一般用于查看已经知道大小的文件。 在数据删除之后,首先要卸载被删除数据所在的磁盘或是分区,如果是系统根分区遭到误删除,就需要进入单用户模式下,将根分区以只读的方式挂载。 原因:因为文件删除之后,仅仅是将文件的inode节点中的扇区指针清零,实际上文件还存在磁盘上面,如果磁盘以读写方式挂载,这些删除的数据块可能会被系统从新分配出去,这些数据块被覆盖之后,这些数据就真的丢失了,所以以只读的方式挂载,尽可能避免数据被覆盖。

优秀的个人博客,低调大师

LINUX-内核-中断分析-中断向量表(3)-arm【转】

转自:http://blog.csdn.net/haolianglh/article/details/51986987 arm中断概念 在《ARM体系结构与编程》第9章中说到,ARM 中有个概念叫做“异常中断”,也就是包括外部中断在内的各种异常。显然,ARM体系的“异常中断”概念更加接近MIPS体系中的“异常”概念。 既然更类似MIPS体系,那么自然的ARM体系就存在“异常中断入口”和“异常中断向量表”的概念。 arm的异常中断向量表 非向量化中断 ARM体系定义了7种异常中断,在《ARM体系结构与编程》第9章的表9.1中标明了这7种异常中断。其中第6中异常中断即是外部中断的统一入口。显然,在ARM中,也类似MIPS一样实行了非向量化的外部中断。应该说RISC类的架构几乎都是采用非向量化中断。 向量化异常中断 虽然外部中断没有被向量化,但是异常中断被向量化了。因此,ARM也有一个所谓异常中断向量表。 摘自《ARM体系结构与编程》表9-1,如表 4 1所示,ARM的这个异常中断向量表可以是高端向量表,也可以是低端向量表,两者取其一。区别是基地址不同。高端向量是ARM架构可选配置,可以通过硬件外部输入管脚来配置是低端向量还是高端向量,不能通过指令来改变向量的位置,但如果ARM芯片内部有标准ARM协处理器,那么协处理器CP15的寄存器C1的bit13可以用来切换低端和高端向量地址,等于0时为低端向量,等于1时为高端向量。 异常中断向量表的初始化 arm体系在函数early_trap_init()中初始化这个异常中断向量表,相比x86以设置门的方式赋值idt_table,MIPS直接给全局变量exception_handlers[]成员赋值的方式。arm的方式比较另类。其方式是将从__vectors_start开始,直到__vectors_end之间的一段代码给复制到vectors_base地址上,这个vectors_base其实就是0x0000000或者0xffff0000。 ------------------------------------------------arch/arm/kernel/trap.c void __init early_trap_init(void *vectors_base) { /* 异常向量表 exception vectors的基址 */ unsigned long vectors = (unsigned long)vectors_base; extern char __vectors_start[], __vectors_end[]; vectors_page = vectors_base; /* * Copy the vectors, stubs and kuser helpers (in entry-armv.S) * into the vector page, mapped at 0xffff0000, and ensure these * are visible to the instruction stream. */ memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start); . . . } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 异常向量表内容是针对ARM的7种异常要采取的不同的处理代码,但是这个异常向量表总size是非常小的,其中每一种异常只有4字节的代码。因此实际上向量表中针对每一种异常的每一个表项都是一句跳转指令或者是使用ldr指令向PC寄存器写入新值。 ------------------------------------------arch/arm/kernel/entry-armv.S .globl __vectors_start __vectors_start: ARM( swi SYS_ERROR0 ) THUMB( svc #0 ) THUMB( nop ) W(b) vector_und + stubs_offset /* 未定义指令 */ W(ldr) pc, .LCvswi + stubs_offset /* 软件中断SWI,系统调用 */ W(b) vector_pabt + stubs_offset /* 指令预取中止 */ W(b) vector_dabt + stubs_offset /* 数据访问中止 */ W(b) vector_addrexcptn + stubs_offset /* 保留 */ W(b) vector_irq + stubs_offset /* 外部中断模式 */ W(b) vector_fiq + stubs_offset /* 快速中断模式 */ .globl __vectors_end __vectors_end: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 初始化大蓝图 下面以海思的Hi3535为例展示arm体系中断初始化的主要流程。 【作者】 张昺华 【出处】 http://www.cnblogs.com/sky-heaven/ 【博客园】 http://www.cnblogs.com/sky-heaven/ 【新浪博客】 http://blog.sina.com.cn/u/2049150530 【知乎】 http://www.zhihu.com/people/zhang-bing-hua 【我的作品---旋转倒立摆】 http://v.youku.com/v_show/id_XODM5NDAzNjQw.html?spm=a2hzp.8253869.0.0&from=y1.7-2 【我的作品---自平衡自动循迹车】 http://v.youku.com/v_show/id_XODM5MzYyNTIw.html?spm=a2hzp.8253869.0.0&from=y1.7-2 【新浪微博】 张昺华--sky 【twitter】 @sky2030_ 【facebook】 张昺华 zhangbinghua 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

优秀的个人博客,低调大师

Linux-CentOS 6.5 mini 中没有curses.h的问题

1、直接贴过程 [fengbo@CentOS: jigsaw]$ rpm -q ncursesncurses-5.7-3.20090208.el6.i686[fengbo@CentOS: jigsaw]$ rpm -q ncurses-develpackage ncurses-devel is not installed[fengbo@CentOS: jigsaw]$ sudo yum install ncurses-devel[sudo] password for fengbo:已加载插件:fastestmirror设置安装进程Loading mirror speeds from cached hostfile* base: mirrors.btte.net* extras: mirrors.btte.net* updates: mirror.bit.edu.cn解决依赖关系--> 执行事务检查---> Package ncurses-devel.i686 0:5.7-3.20090208.el6 will be 安装--> 完成依赖关系计算 依赖关系解决 =====================================================================================================软件包 架构 版本 仓库 大小=====================================================================================================正在安装:ncurses-devel i686 5.7-3.20090208.el6 base 642 k 事务概要=====================================================================================================Install 1 Package(s) 总下载量:642 kInstalled size: 1.7 M确定吗?[y/N]:y下载软件包:ncurses-devel-5.7-3.20090208.el6.i686.rpm | 642 kB 00:00运行 rpm_check_debug执行事务测试事务测试成功执行事务正在安装 : ncurses-devel-5.7-3.20090208.el6.i686 1/1Verifying : ncurses-devel-5.7-3.20090208.el6.i686 1/1 已安装:ncurses-devel.i686 0:5.7-3.20090208.el6 完毕! 本文转自郝峰波博客园博客,原文链接:http://www.cnblogs.com/fengbohello/p/4567414.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

shell脚本监控Linux系统节点和服务CPU内存性能

1、获取信息 #!/bin/bash #描述: # 把top信息输入到一个文件内部 #作者:孤舟点点 #版本:1.0 #创建时间:2017-11-09 03:04:28 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH p=`pwd` Day=`date +"%Y%m%d"` HOST=`hostname` for((i=0; i<1440; i=i+1)) do echo "Date `date +"%Y-%m-%d %H:%M:%S"`" >>$p/$Day-top.txt top c -bn1 >>$p/$Day-top.txt sleep 1 done 2、筛选信息 #!/bin/bash #描述: #作者:孤舟点点 #版本:1.0 #创建时间:2017-11-09 04:08:52 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH p=`pwd` Day=`date +"%Y%m%d"` HOST=`hostname` mkdir -p $p/$HOST-$Day PT=$p/$HOST-$Day cd $PT cat $p/$1 | grep -v grep | grep "^Date" >> $PT/Time-$Day.txt cat $p/$1 | grep -v grep | grep "^Cpu(s):" >> $PT/CPU-$Day.txt cat $p/$1 | grep -v grep | grep "^Mem:" >> $PT/Mem-$Day.txt cat $p/$1 | grep -v grep | grep "^Swap:" >> $PT/Cache-$Day.txt while read line do cat $p/$1 | grep -v grep | grep "$line" >> $PT/$line-$Day.txt done < $p/service.txt # 这里service.txt是按行存放的服务名称 cd $p 3、整理数据 例如用Excel整理内存使用情况,这里把获取的时间和内存信息放在Excel内部,并把内存列用Excel分列,用时间和使用的内存大小列可以制作出一张内存使用趋势图;同理也可以制作CPU、cached及各个微服务的CPU和内存趋势图。

优秀的个人博客,低调大师

Linux基础之bash脚本进阶篇-循环语句(for,while,until)

20160909 补充break与continue的区别 什么是循环语句、死循环? 循环语句:将一段代码重复执行0、1或多次。 到底要重复运行多少次?以及我们如何设定循环语句的重复次数? 为了解决上面的问题于是就有了进入条件与退出条件。 进入条件:条件满足时进入循环。 退出条件:不符合条件退出循环。 一种特殊的循环:死循环 死循环:在编程中,一个无法靠自身的控制终止的循环称为"死循环"。死循环的出现有两种情况: 1、因程序需要刻意写的;2、因程序员的失误造成的。 第二种的死循环通常会造成比较严重的程序错误,甚至会因此而影响物理机。因此死循环的使用需要合理的设计。 实验环境CentOS7.2 本文重要的三个循环语句:for、while、until ……………………………………………………………………………………………………………………… for循环 for语句的使用格式: forNAME in LIST(列表);do 循环体 done 列表生成方式: (1)整数列表 {start..end} $(seq start [[step]end]) (2)glob /etc/rc.d/rc3.d/K* (3)命令 ……………………………………………………………………………………………………………………… 下面以一个例子看看for的具体作用 示例:计算1+2+...+10的值 1 2 3 4 5 6 7 8 9 #!/bin/bash #sumthevalueof"1+2+...+10" #authorchawan #date:20160906 declare -i sum =0 for x in {1..10}; do let sum +=$x done echo "Thesumis:$sum" 运行脚本0906-1结果如下 1 2 [root@dockerhmworks] #sh0906-1 The sum is:55 上面使用了第一种的整数列表中的第一种形式,这里如果是“1+2+...+n”这种形式那么{start..end}就不再适用,此时就只能使用$(seq start [[step]end])。下面再举一个例子说明 示例:计算“1+2+...+n”的值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/bash #sum“1+2+...+n” #authorchawan #date:20160906 declare -i sum =0 #以交互的方式输入一个正整数 read -p "Pleaseinsetanumber:" num #判断输入的数是否为空,为空则提示并退出 [-z$num]&& echo "Pleaseinputanumber!" && exit 1 #判断输入的是否是正整数,若是则执行循环,若不是提示输入正整数并退出 if [[$num=~^[1-9][0-9]{0,}$]]; then for i in {1..$num}; do #foriin`seq1$num`;do let sum +=$i #sum=$[$sum+$i]这种方式也可以不过不够简练 done else echo "Error:pleaseinputapositiveinteger" && exit 2 fi #显示最后的和 echo "Thesumis:$sum" 下面执行该脚本 1 2 3 4 [root@dockerhmworks] #sh0906-2 Pleaseinsetanumber:8 0906-2:行14: let : sum +={1..8}:语法错误:期待操作数(错误符号是 "{1..8}" ) The sum is:0 该结果说明{start..end}形式不适用于有变量出现的情况,既然这个不行就来试试$(seq start [[step]end]) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/bash #sum“1+2+...+n” #authorchawan #date:20160906 declare -i sum =0 #以交互的方式输入一个正整数 read -p "Pleaseinsetanumber:" num #判断输入的数是否为空,为空则提示并退出 [-z$num]&& echo "Pleaseinputanumber!" && exit 1 #判断输入的是否是正整数,若是则执行循环,若不是提示输入正整数并退出 if [[$num=~^[1-9][0-9]{0,}$]]; then for i in ` seq 1$num`; do let sum +=$i #sum=$[$sum+$i] done else echo "Error:pleaseinputapositiveinteger" && exit 2 fi #显示最后的和 echo "Thesumis:$sum" 执行该脚本 1 2 3 4 5 6 [root@dockerhmworks] #sh0906-2 Pleaseinsetanumber:10 The sum is:55 [root@dockerhmworks] #sh0906-2 Pleaseinsetanumber:100 The sum is:5050 该结果表明$(seq start [[step]end])适用性更好,因此一般建议使用它。 列表的glob与命令这两种就不再具体演示。大家感兴趣可以自己尝试下做个实验体会体会。 ……………………………………………………………………………………………………………………… while循环 while语句使用格式: whileCONDITION;do 循环体 done CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环; 因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正; 进入条件:CONDITION为true; 退出条件:CONDITION为false ……………………………………………………………………………………………………………………… 示例:计算1+2+...+10的值 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash #sumthevalueof"1+2+...+10"while #authorchawan #date:20160906 #为了严谨起见,事先声明变量sum及i为整数型 declare -i sum =0 declare -ii=1 while [$i- le 10]; do let sum +=$i #sum=$[$sum+$i]的简写形式 let i++ #不断修正变量体 done echo "Thesumis:$sum" 执行脚本,查看其是否正确执行 1 2 [root@dockerhmworks] #sh0906-3 The sum is:55 while与for的不同在于: 1、不需要列表,因此可以大大节省内存空间,因为for如果列表很大会占用较多内容空间,对系统性能会造成影响,所以此时while的优越性就显现出来,它不需要占用很多内存空间,只需要两个变量的空间及做加法即可。 2、while需要修正体来不断修正变量,最终在符合退出条件时结束循环。 ……………………………………………………………………………………………………………………… until循环 until语句使用格式: untilCONDITION;do 循环体 done CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“false”,则执行一次循环;直到条件测试状态为“true”终止循环; 因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正; 进入条件:CONDITION为false; 退出条件:CONDITION为true until的用法同while,唯一的区别在于进入循环与退出循环的条件相反。 以相同的例子来体会二者的区别 ……………………………………………………………………………………………………………………… 示例:计算1+2+...+10的值 1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash #sumthevalueof"1+2+...+10"until #authorchawan #date:20160906 declare -i sum =0 declare -ii=1 until [$i-gt10]; do let sum +=$i let i++ done echo "Thesumis:$sum" 执行脚本,查看结果是否正确输出 1 2 [root@dockerhmworks] #sh0906-4 The sum is:55 通过比较while与until的唯一差别就在于判断条件。这两者其实算是同一种循环语句,只是进入及退出循环的条件正好相反。 循环控制语句(用于循环体中) 1、continue[N]:提前结束第N层的本轮循环,而直接进入下一轮判断; 其使用格式: whileCONDTIITON1;do CMD1 ... ifCONDITION2;then continue fi CMDn ... done ……………………………………………………………………………………………………………………… 示例:求100以内所有偶数之和;要求循环遍历100以内的所正整数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash #求100以内所有偶数之和;要求循环遍历100以内的所正整数 #authorchawan #date:20160906 declare -ii=1 declare -i sum =0 while [$i- le 100]; do let i++ #如果为奇数则跳过该循环 if [$[${i}%2]- eq 1]; then continue fi let sum +=$i done echo "Theevennumbersum:$sum" 执行脚本,查看结果是否正确显示 1 2 [root@dockerhmworks] #sh0906-5 Theevennumber sum :2550 之前我写这个脚本时是这么写的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash #求100以内所有偶数之和;要求循环遍历100以内的所正整数 #authorchawan #date:20160906 declare -ii=1 declare -i sum =0 while [$i- le 100]; do let sum +=$i #如果为奇数则跳过该循环,直接进入下一轮判断后面的程序不再执行 if [$[${i}%2]- eq 1]; then continue fi let i++ done echo "Theevennumbersum:$sum" 这就是我个人由于对continue的理解不够准确而造成的死循环。 由于continue是跳过其所在循环,直接进入下一轮判断,后面的语句都不再执行。 当时没注意这点所以错误地把i++放在后面,这就导致若i起始值为奇数那么它就一直在重复执行。 这里只要将let sum+=$i与let i++调换为止即可正确执行。 ……………………………………………………………………………………………………………………… 2、break[N]:提前结束循环; 其使用格式: whileCONDTIITON1;do CMD1 ... ifCONDITION2;then break fi CMDn ... done break的使用通常是与死循环同时出现的,下面来介绍如何创建死循环 创建死循环: whiletrue;do 循环体 done untilfalse;do 循环体 done ……………………………………………………………………………………………………………………… 示例:每隔3秒钟到系统上获取已经登录的用户的信息;如果docker登录了,则记录于日志中,并退出; 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash #每隔3秒钟到系统上获取已经登录的用户的信息;如果docker用户登录,则记录于日志中,并退出脚本 #authorchawan #date:20160906 while true ; do if who | grep "^docker\>" $> /dev/null ; then break fi sleep 3 echo "dockerisnotlogin" done echo "dockerloggedon." >> /tmp/user .log 运行脚本 1 2 3 4 5 6 7 [root@dockerhmworks] #sh0906-6 dockerisnotlogin dockerisnotlogin dockerisnotlogin dockerisnotlogin dockerisnotlogin dockerisnotlogin 为了验证该脚本,下面我们使用docker用户登陆 docker用户登陆后查看/tmp/user.log文件 ######################################################################################### break与continue语句的区别: break语句和continue语句都可以位于各种循环体内,用于控制当前的循环流程。但,break语句是直接退出当前的循环结构,转向执行循环体后面的语句;而continue语句则只是跳过当前循环体中continue语句后面的语句,转向当前循环体的起始位置,重新执行下一次循环,并没有退出当前的循环结构。 这是两者最本质的区别:break跳出当前循环,continue没有跳出当前循环。 循环语句的特殊用法(while及for) while循环的特殊用法(遍历文件的每一行): 其使用格式: whileread line;do 循环体 done< /PATH/FROM/SOMEFILE 依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line ……………………………………………………………………………………………………………………… 示例:找出其ID号为偶数的所有用户,显示其用户名及ID号; 1 2 3 4 5 6 7 8 9 10 #!/bin/bash #找出其ID号为偶数的所有用户,显示其用户名及ID号 #authorchawan #date:20160906 while read line; do if [$[` echo $line| cut -d:-f3`%2]- eq 0]; then echo -e-n "username:`echo$line|cut-d:-f1`\t" echo "uid:`echo$line|cut-d:-f3`" fi done < /etc/passwd 运行脚本 ……………………………………………………………………………………………………………………… for循环的特殊格式: for((控制变量初始化;条件判断表达式;控制变量的修正表达式));do 循环体 done 控制变量初始化:仅在运行到循环代码段时执行一次; 条件判断表达式:在什么条件下进行循环; 控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断; 示例:求100以内所正整数之和 1 2 3 4 5 6 7 8 9 #!/bin/bash #求100以内所正整数之和 #authorchawan #date:20160906 declare -i sum =0 for ((i=1;i<=100;i++)); do let sum +=$i done echo "Thesumis:$sum" 运行脚本,查看结果是否正确 1 2 [root@dockerhmworks] #sh0906-8 The sum is:5050 for的这种格式减少了代码量,看着更简洁,不过其限制是只适用于有数字出现的循环,若是对某目录下的所有文件进行某种循环的执行就不适应了。 循环嵌套 在本文的最后再以一题体会下循环嵌套的神奇 示例:打印九九乘法表 1 2 3 4 5 6 7 8 9 10 #!/bin/bash #打印九九乘法表 #authorchawan #date:20160906 for ((j=1;j<=9;j++)); do for ((i=1;i<=j;i++)) do echo -e-n "${i}X${j}=$[$i*$j]\t" done echo done 我在刚刚接触循环嵌套时各种晕,循环嵌套不是没有目的的乱用,而是根据自己的需求有目的的使用,比如要打印99乘法表,开始要分析99乘法表的规律,分析后我们发现它横行是连续的,因此要用到一个循环(通常在遇到连续的内容都会用到循环)它的列也是连续的,因此又用到一个循环,而99乘法表又是由两个变化的量构成,综上我们就可以确定,需要使用两个变量,这两个变量分别要用到循环,而一个变量又受到另一个变量的限制,因此这个受限的变量就是被嵌套的主。问题分析到这里,我们解决这个问题要用到的工具都找出来了:两个变量,每个变量对应一个循环,同时一个变量受到另一个变量的限制,也就是说它需要在其循环内进行嵌套。 下面就是靠自己去使用工具解决问题了。我相信大家这点应该都不成问题,问题就分析到这里。 小结: 本文主要介绍什么是循环,死循环,bash常用的三种循环语句for、while、until及循环控制语句continue、break 在本文结尾又介绍了while的特殊用法(遍历文件中的每一行),for的c语言格式。 至于什么时候用for什么时候用while需要自己在实际写脚本中细细比较,鉴于本人也是新手,这里就算想细说也只能望洋兴叹。 本文转自 紫色的茶碗 51CTO博客,原文链接:http://blog.51cto.com/chawan/1847024,如需转载请自行联系原作者

优秀的个人博客,低调大师

linux命令练习:通过修改用户文档手动添加用户

手动添加用户hive,基本组为hive(5000),附加组为mygroup 1、vim /etc/group 手动在组配置文档中添加hive组信息,并把mygroup作为hive用户的附加组 mygroup:x:5001:hive 把hive添加到mygroup组信息后面,作为附加组 hive:x:5000: 添加hive组信息 2、vim /etc/gshadow 手动在组密码配置文档中添加hive组信息 hive:!:: 添加hive组密码信息 3、vim /etc/passwd 手动在用户配置文档中添加hive用户信息 hive:x:5000:5000:HIVE:/home/hive:/bin/bash 添加hive用户信息 4、vim /etc/shadow 手动在用户密码配置文档中添加hive用户信息 hive:!!:17088:0:99999:7::: 此处17088的计算方法下面有说明 附:如何把最后一次密码修改日期变成天数方法如下 [root@xuelinux ~]# date +%s 先把当天日期以秒数显示出来 1476431406 [root@xuelinux ~]# bc 计算器命令 bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 1476431406/86400 用当天的日期的秒数除以一天的秒数,一天24*3600秒=86400秒 17088 计算出当天日期距离1970年的天数为17088 5、cp -R /etc/skel /home/hive 建立hive用户的家目录 [root@xuelinux test]# cp -R /etc/skel /home/hive [root@xuelinux test]# ls -l /home drwx------. 3 donggen donggen 4096 9月 13 23:26 donggen drwxr-xr-x. 3 root root 4096 10月 14 15:56 hive hive家目录已经建好 6、chown -R hive.hive /home/hive 把hive家目录及其内的内容的用户和组都修改为hive [root@xuelinux test]# chown -R hive.hive /home/hive [root@xuelinux test]# ls -la /home/hive drwxr-xr-x. 3 hive hive 4096 10月 14 15:56 . drwxr-xr-x. 7 root root 4096 10月 14 15:56 .. -rw-r--r--. 1 hive hive 18 10月 14 15:56 .bash_logout -rw-r--r--. 1 hive hive 176 10月 14 15:56 .bash_profile -rw-r--r--. 1 hive hive 124 10月 14 15:56 .bashrc drwxr-xr-x. 2 hive hive 4096 10月 14 15:56 .gnome2 7、chmod -R go= /home/hive 把hive家目录的组和其他人的权限设置为空 [root@xuelinux test]# chmod -R go= /home/hive [root@xuelinux test]# ls -al /home/hive drwx------. 3 hive hive 4096 10月 14 15:56 . drwxr-xr-x. 7 root root 4096 10月 14 15:56 .. -rw-------. 1 hive hive 18 10月 14 15:56 .bash_logout -rw-------. 1 hive hive 176 10月 14 15:56 .bash_profile -rw-------. 1 hive hive 124 10月 14 15:56 .bashrc drwx------. 2 hive hive 4096 10月 14 15:56 .gnome2 至此hive用户就手动添加成功,但是此时还无法通过终端登录hive用户,需给hive设置密码 可以通过passwd设置,这里说下如何通过手动添加密码到shadow文档中。 8、手动添加hive密码信息到shadow用户密码配置文档中 先通过openssl passwd -1 -salt 先通过openssl命令生成密码加密字符串-1此处为数字1 openss1 passwd -l -salt [root@xuelinux test]# openssl passwd -1 -salt '12345678' Password: $1$12345678$0ME5N6oDyoEAwUp7b5UDM/ [root@xuelinux test]# vim /etc/shadow hive:$1$12345678$0ME5N6oDyoEAwUp7b5UDM/:17088:0:99999:7::: 把生成的密码加密字符串复制到用户密码配置文档中 至此完整的hive用户就手动添加成功,并能通过远程登录。 本文转自wang650108151CTO博客,原文链接:http://blog.51cto.com/woyaoxuelinux/1861960,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册