- 工信部备案号 滇ICP备05000110号-1
- 滇公安备案 滇53010302000111
- 增值电信业务经营许可证 B1.B2-20181647、滇B1.B2-20190004
- 云南互联网协会理事单位
- 安全联盟认证网站身份V标记
- 域名注册服务机构许可:滇D3-20230001
- 代理域名注册服务机构:新网数码
前言正则表达式,新手见它的感觉就是“这都什么玩意,乱七八糟的,完全不知所云”,但学会它就会体验那种一行代码抵数十上百行,效率飞起的感觉,简直不要太爽。今天小肆先把我自己收藏的一些正则表达式写法分享给大家,当然想深入学习如何写正则表达式,可以去w3c看看教程。干货一.校验数字数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$有两位小数的正实数:^[0-9]+(.[0-9]{2})?$有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$非零的正整数:^[1-9]\d*$非零的负整数:^\-[1-9][]0-9"*$非负整数:^\d+$非正整数:^-[1-9]\d*|0$非负浮点数:^\d+(\.\d+)?$非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$正浮点数:^[1-9]d.d|0.d[1-9]d$负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$浮点数:^(-?\d+)(\.\d+)?$二.效验字符汉字:^[\u4e00-\u9fa5]{0,}$英文和数字:^[A-Za-z0-9]+$长度为3-20的所有字符:^.{3,20}$由26个英文字母组成的字符串:^[A-Za-z]+$由26个大写英文字母组成的字符串:^[A-Z]+$由26个小写英文字母组成的字符串:^[a-z]+$由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$由数字、26个英文字母或者下划线组成的字符串:^\w+$中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+禁止输入含有~的字符:[^~\x22]+三.特殊需求表达式Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$(国内 13、15、18开头的手机号正则表达式,可根据目前国内收集号扩展前两位开头号码)电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}身份证号(15位):^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$身份证号码(18位):^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-16之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,16}$日期格式:^\d{4}-\d{1,2}-\d{1,2}一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$中文字符的正则表达式:[\u4e00-\u9fa5]双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))空白行的正则表达式:\n\s*\r (可以用来删除空白行)首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)腾讯QQ号:[1-9][0-9]{4,11} (腾讯QQ号从10000开始)中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)IP-v4地址:\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b (提取IP地址时有用)校验IP-v6地址:(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))子网掩码:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))校验日期:^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$(“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。)抽取注释:<!--(.*?)-->查找CSS属性:^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}提取页面超链接:(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^" rel="external nofollow" ]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>提取网页图片:\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)提取网页颜色代码:^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$文件扩展名效验:^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$判断IE版本:^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$
MySQL主从备份配置实例 场景:1、主服务器192.168.0.225、从服务器192.168.0.226。其中,主服务器上已有数据。2、主从服务器上的mysql版本及安装配置相同。 一、主从备份的原理:主服务器数据库的每次操作都会记录在二进制日志文件mysql-bin.xxx中。从服务器的I/O线程使用专用帐号登陆到主服务器中读取该二进制文件,并将文件内容写入到自己本地的中继日志relay-log文件中。然后从服务器的SQL线程会根据中继日志中的内容执行SQL语句。这要求两台服务器有同样的初态。 二、同步初态:1、将主服务器要同步的数据库加锁,避免同步时发生改变:>use database_name;>flush tables with read lock;2、使用mysqldump工具导出数据:mysqldump -uroot -pxxx database_name >database_name.sql3、备份完成后,解锁数据库:>unlock tables;4、将初始数据导入从数据库:>create database database_name;>use database_name;>source database_name.sql; 完成以上操作后,主从服务器就有一样的初态了。三、主从同步设置:1、配置从数据库:/etc/my.cnf主要配置如下:log-bin=mysql-bin #开启二进制日志 server-id = 2 #主数据库id为1,不能相同。replicate_wild_do_table=test.% #只同步test库下的表relay_log=mysqld-relay-bin #记录中继日志log-slave-updates=YES #从服务器同步后记录日志修改完成后重启mysql服务。2、查看主服务器日记记录位置:>show master status\G显示内容如下:***************** 1. row **************** File: mysql-bin.000001 #当前记录的日志 Position: 80647293 #日志中记录的位置 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)3、主服务器创建允许从服务器同步数据的账户:>grant replication slave on *.* to 'user_name'@'192.168.0.226' identified by 'ahaii';4、从服务器开启同步:>change master to master_host='192.168.0.225', master_user='user_name', master_password='ahaii', master_log_file='mysql-bin.000001', master_log_pos=80647293;配置完以上后,重启从服务器mysql服务。5、查看从服务器是否已经成功开启同步:>show slave status\G显示如下:*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.0.225 Master_User: user_name Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 1114 Relay_Log_File: mysqld-relay-bin.000004 Relay_Log_Pos: 1260 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: test.% Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 1114 Relay_Log_Space: 1563 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 1 row in set (0.00 sec)其中:Slave_IO_Running和Slave_SQL_Running的状态都是YES,说明同步开启成功。现在就可以去主服务器上的test库下创建表开测试同步了。 MySQL主主备份配置实例在主从备份配置完毕的基础上实现双主备份:一、在从服务器上创建用于同步的帐号:>grant ...二、修改主服务器mysql.cnf,加入replicate_wild_do_table=test.%relay_log=mysqld-relay-bin log-slave-updates=YES三、记录从服务器二进制日志文件名与位置:>show master status\G四、主服务器开启同步设置:>change master to master_host='192.168.0.226', master_user='user_name', master_password='ahaii', master_log_file='mysql-bin.000009', master_log_pos=107; 然后重启mysqld服务。 以上就是mysql主从、主主设置的过程。=================== 四、疑惑记录:1、关于my.cnf配置文件中binlog-format的值:mysql的binlog-format有三种格式,分别是:row、statement和mixed 1.1、row:基于行的复制(row-based replicate,RBP) 优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题 缺点: 所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行alter table之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。 1.2、statement:基于SQL语句的复制(statement-based replicate, SBR) 每一条会修改数据库的SQL语句都会被记录在binlog中。 优点: 不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。) 缺点: 由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数, last_insert_id(),以及user-defined functions(udf)会出现问题). 使用以下函数的语句也无法被复制: * LOAD_FILE() * UUID() * USER() * FOUND_ROWS() * SYSDATE() (除非启动时启用了 --sysdate-is-now 选项) 同时在INSERT ...SELECT 会产生比 RBR 更多的行级锁。 1.3、mixed:混合模式复制(mixed-based replicate,MBR) mysql的默认模式。 mixed模式是以上两种模式的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。2、关于复制参数:replicate-do-db、replicate-do-table、replicate-wild-do-tableMySQL官网的介绍:https://dev.mysql.com/doc/refman/5.5/en/replication-options-slave.html 2.1、replicate-do-db:在从服务器上设置需要同步的数据库,要同步多个库时可以写多行,每行一个。 缺点:不适用于跨库数据更新的复制。 2.2、replicate-do-table:在从服务器上设置需要同步的表,格式为db_name.tb_name。每行一个,同步多个表时需要写多行。 缺点:不适用于跨库数据更新的复制。 2.3、replicate-wild-do-table:在从服务器上设置需要同步的数据库,格式为db_name.tb_name。每行一个,同步多个表时需要写多行。可使用通配符如"%"、"_",来匹配多个表,如同步所有以share字符串开头的数据库的所有use字符串开头的表 :replicate-wild-do-db=share%.user%。 支持跨库数据更新的复制。
certutil -hashfile <文件名(fileurl)> <hash类型(md5/sha1)>
1.命令格式:kill[参数][进程号] 2.命令功能:发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进程。如果任无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。 3.命令参数:-l 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称-a 当处理当前进程时,不限制命令名和进程号的对应关系-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号-s 指定发送信号-u 指定用户 注意:1、kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。例如:kill -2 123它的效果等同于在前台运行PID为123的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号。2、kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。3、可以向多个进程发信号或终止它们。4、当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下Enter键使shell的命令提示符再次出现时,才会显示出来。5、应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。 4.使用实例:实例1:列出所有信号名称命令:kill -l输出:[root@localhost test6]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+439) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+1247) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-1451) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-1055) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-659) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX 说明:只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:HUP 1 终端断线INT 2 中断(同 Ctrl + C)QUIT 3 退出(同 Ctrl + \)TERM 15 终止KILL 9 强制终止CONT 18 继续(与STOP相反, fg/bg命令)STOP 19 暂停(同 Ctrl + Z) 实例2:得到指定信号的数值命令:输出:[root@localhost test6]# kill -l KILL9[root@localhost test6]# kill -l SIGKILL9[root@localhost test6]# kill -l TERM15[root@localhost test6]# kill -l SIGTERM15[root@localhost test6]# 说明: 实例3:先用ps查找进程,然后用kill杀掉命令:kill 3268输出:[root@localhost test6]# ps -ef|grep vim root 3268 2884 0 16:21 pts/1 00:00:00 vim install.logroot 3370 2822 0 16:21 pts/0 00:00:00 grep vim[root@localhost test6]# kill 3268 [root@localhost test6]# kill 3268 -bash: kill: (3268) - 没有那个进程[root@localhost test6]#说明: 实例4:彻底杀死进程命令:kill –9 3268 输出:[root@localhost test6]# ps -ef|grep vim root 3268 2884 0 16:21 pts/1 00:00:00 vim install.logroot 3370 2822 0 16:21 pts/0 00:00:00 grep vim[root@localhost test6]# kill –9 3268 [root@localhost test6]# kill 3268 -bash: kill: (3268) - 没有那个进程[root@localhost test6]# 说明: 实例5:杀死指定用户所有进程命令:kill -9 $(ps -ef | grep peidalinux)kill -u peidalinux输出:[root@localhost ~]# kill -9 $(ps -ef | grep peidalinux) [root@localhost ~]# kill -u peidalinux说明:方法一,过滤出hnlinux用户进程并杀死 实例6:init进程是不可杀的命令:kill -9 1输出:[root@localhost ~]# ps -ef|grep initroot 1 0 0 Nov02 ? 00:00:00 init [3] root 17563 17534 0 17:37 pts/1 00:00:00 grep init[root@localhost ~]# kill -9 1[root@localhost ~]# kill -HUP 1[root@localhost ~]# ps -ef|grep initroot 1 0 0 Nov02 ? 00:00:00 init [3] root 17565 17534 0 17:38 pts/1 00:00:00 grep init[root@localhost ~]# kill -KILL 1[root@localhost ~]# ps -ef|grep initroot 1 0 0 Nov02 ? 00:00:00 init [3] root 17567 17534 0 17:38 pts/1 00:00:00 grep init[root@localhost ~]# 说明:init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 其它所有进程都是init进程的子孙。init进程是不可杀的!
大多数Linux发行版都有针对每种哈希算法的命令行工具。 工具名称的模式是'HASH-TYPE'加上'sum'字样。 所以为了散列MD5,程序名是md5sum 。 为了散列SHA 256,命令是sha256sum 。 如果您不确定确切的名称是什么,请输入哈希算法名称,然后按两次tab,大多数发行版都将显示以该算法名称开头的所有命令。 我们将通过下面几个受欢迎的检查。我们将使用MD5哈希算法执行我们的第一次检查。 执行md5sum命令并将路径传递给要散列的文件:md5sum mini.iso结果将如下所示:Output8388f7232b400bdc80279668847f90da mini.iso该随机字符串以'8388f'开头,是校验和,这是您需要与下载页面上提供的校验和进行比较的。由于对文件的任何修改都会导致完全不同的校验和,为了节省时间,只需检查前几个字符,最后几个字符与源代码相同,而不是每个字符。例如,如果您想快速验证'mini.iso'的校验和是否匹配,请验证两个校验和都以'8388f'开始并以'f90da'结尾。 如果两者匹配,那么完全散列很可能(几乎100%)是相同的。如果您想100%确定,只需从本地检查输出下的网站复制并粘贴校验和,以查看每个字符是否排齐:Output8388f7232b400bdc80279668847f90da mini.iso8388f7232b400bdc80279668847f90da现在我们来看看检查SHA散列。 最常见的SHA哈希命令是sha1sum和sha256sum 。 通过将路径传递给文件来执行sha1sum命令:sha1sum mini.iso结果将如下所示:Outputcce936c1f9d1448c7d8f74b76b66f42eb4f93d4a mini.iso将结果值与网页上的值进行比较以验证它们是否匹配。
要安装ngxtop ,首先需要在Linux中安装PIP ,一旦您的系统上安装了pip ,就可以使用以下命令安装ngxtop 。$ sudo pip install ngxtop监控Nginx服务器请求现在你已经安装了ngxtop ,运行它的最简单方法是没有任何参数。 这将解析/var/log/nginx/access.log,并在后续模式下运行(在写入访问日志时注意新行)。$ sudo ngxtop示例输出running for 411 seconds, 64332 records processed: 156.60 req/secSummary:| count | avg_bytes_sent | 2xx | 3xx | 4xx | 5xx ||---------+------------------+-------+-------+-------+-------|| 64332 | 2775.251 | 61262 | 2994 | 71 | 5 |Detailed:| request_path | count | avg_bytes_sent | 2xx | 3xx | 4xx | 5xx ||------------------------------------------+---------+------------------+-------+-------+-------+-------|| /abc/xyz/xxxx | 20946 | 434.693 | 20935 | 0 | 11 | 0 || /xxxxx.json | 5633 | 1483.723 | 5633 | 0 | 0 | 0 || /xxxxx/xxx/xxxxxxxxxxxxx | 3629 | 6835.499 | 3626 | 0 | 3 | 0 || /xxxxx/xxx/xxxxxxxx | 3627 | 15971.885 | 3623 | 0 | 4 | 0 || /xxxxx/xxx/xxxxxxx | 3624 | 7830.236 | 3621 | 0 | 3 | 0 || /static/js/minified/utils.min.js | 3031 | 1781.155 | 2104 | 927 | 0 | 0 || /static/js/minified/xxxxxxx.min.v1.js | 2889 | 2210.235 | 2068 | 821 | 0 | 0 || /static/tracking/js/xxxxxxxx.js | 2594 | 1325.681 | 1927 | 667 | 0 | 0 || /xxxxx/xxx.html | 2521 | 573.597 | 2520 | 0 | 1 | 0 || /xxxxx/xxxx.json | 1840 | 800.542 | 1839 | 0 | 1 | 0 |要退出,请按[Ctrl + C] 。解析不同的访问日志您可以使用-l标志解析不同的访问日志,例如特定的网站或Web应用程序,如图所示。$ sudo ngxtop -l /var/log/nginx/site1/access.log列出客户的主要来源IP以下命令将列出所有访问该站点的客户端的最大源IP。$ sudo top remote_addr -l /var/log/nginx/site1/access.log示例输出running for 20 seconds, 3215 records processed: 159.62 req/sectop remote_addr| remote_addr | count ||-----------------+---------|| 118.173.177.161 | 20 || 110.78.145.3 | 16 || 171.7.153.7 | 16 || 180.183.67.155 | 16 || 183.89.65.9 | 16 || 202.28.182.5 | 16 || 1.47.170.12 | 15 || 119.46.184.2 | 15 || 125.26.135.219 | 15 || 125.26.213.203 | 15 |使用特定的日志格式要使用log_format指令中指定的日志格式,请使用-f选项,如图所示。$ sudo ngxtop -f main -l /var/log/nginx/site1/access.log从远程服务器解析Apache日志要使用通用格式从远程服务器解析Apache日志文件,请使用类似于以下的命令(指定您的用户名和远程服务器IP)。$ ssh [email protected]_server tail -f /var/log/apache2/access.log | ngxtop -f common示例输出running for 20 seconds, 1068 records processed: 53.01 req/secSummary:| count | avg_bytes_sent | 2xx | 3xx | 4xx | 5xx ||---------+------------------+-------+-------+-------+-------|| 1068 | 28026.763 | 1029 | 20 | 19 | 0 |Detailed:| request_path | count | avg_bytes_sent | 2xx | 3xx | 4xx | 5xx ||------------------------------------------+---------+------------------+-------+-------+-------+-------|| /xxxxxxxxxx | 199 | 55150.402 | 199 | 0 | 0 | 0 || /xxxxxxxx/xxxxx | 167 | 47591.826 | 167 | 0 | 0 | 0 || /xxxxxxxxxxxxx/xxxxxx | 25 | 7432.200 | 25 | 0 | 0 | 0 || /xxxx/xxxxx/x/xxxxxxxxxxxxx/xxxxxxx | 22 | 698.727 | 22 | 0 | 0 | 0 || /xxxx/xxxxx/x/xxxxxxxxxxxxx/xxxxxx | 19 | 7431.632 | 19 | 0 | 0 | 0 || /xxxxx/xxxxx/ | 18 | 7840.889 | 18 | 0 | 0 | 0 || /xxxxxxxx/xxxxxxxxxxxxxxxxx | 15 | 7356.000 | 15 | 0 | 0 | 0 || /xxxxxxxxxxx/xxxxxxxx | 15 | 9978.800 | 15 | 0 | 0 | 0 || /xxxxx/ | 14 | 0.000 | 0 | 14 | 0 | 0 || /xxxxxxxxxx/xxxxxxxx/xxxxx | 13 | 20530.154 | 13 | 0 | 0 | 0 |有关更多使用选项,请使用以下命令查看ngxtop帮助消息。$ ngxtop -h ngxtop Github存储库 : https://github.com/lebinh/ngxtop
Linux mount命令Linux mount命令是经常会使用到的命令,它用于挂载Linux系统外的文件。语法mount [-hV]mount -a [-fFnrsvw] [-t vfstype]mount [-fnrsvw] [-o options [,...]] device | dir mount [-fnrsvw] [-t vfstype] [-o options] device dir参数说明:-V:显示程序版本-h:显示辅助讯息-v:显示较讯息,通常和 -f 用来除错。-a:将 /etc/fstab 中定义的所有档案系统挂上。-F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。-f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。-n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。-s-r:等于 -o ro-w:等于 -o rw-L:将含有特定标签的硬盘分割挂上。-U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。-t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。-o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。-o sync:在同步模式下执行。-o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。-o auto、-o noauto:打开/关闭自动挂上模式。-o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.-o dev、-o nodev-o exec、-o noexec允许执行档被执行。-o suid、-o nosuid:允许执行档在 root 权限下执行。-o user、-o nouser:使用者可以执行 mount/umount 的动作。-o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。-o ro:用唯读模式挂上。-o rw:用可读写模式挂上。-o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。实例将 /dev/hda1 挂在 /mnt 之下。#mount /dev/hda1 /mnt将 /dev/hda1 用唯读模式挂在 /mnt 之下。#mount -o ro /dev/hda1 /mnt将 /tmp/image.iso 这个光碟的 image 档使用 loop 模式挂在 /mnt/cdrom之下。用这种方法可以将一般网络上可以找到的 Linux 光 碟 ISO 档在不烧录成光碟的情况下检视其内容。#mount -o loop /tmp/image.iso /mnt/cdrom
Linux fdisk命令Linux fdisk是一个创建和维护分区表的程序,它兼容DOS类型的分区表、BSD或者SUN类型的磁盘列表。语法fdisk [必要参数][选择参数]必要参数:-l 列出素所有分区表-u 与"-l"搭配使用,显示分区数目选择参数:-s<分区编号> 指定分区-v 版本信息菜单操作说明m :显示菜单和帮助信息a :活动分区标记/引导分区d :删除分区l :显示分区类型n :新建分区p :显示分区信息q :退出不保存t :设置分区号v :进行分区检查w :保存修改x :扩展应用,高级功能实例显示当前分区情况:# fdisk -l Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 1305 10377990 8e Linux LVM Disk /dev/sdb: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sdb doesn't contain a valid partition table显示SCSI硬盘的每个分区情况# fdisk -lu Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors Units = sectors of 1 * 512 = 512 bytes Device Boot Start End Blocks Id System /dev/sda1 * 63 208844 104391 83 Linux /dev/sda2 208845 20964824 10377990 8e Linux LVM Disk /dev/sdb: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders, total 10485760 sectors Units = sectors of 1 * 512 = 512 bytes Disk /dev/sdb doesn't contain a valid partition table
存储技术,Raid。以我现在的知识量很难把这个技术做出纵深方向的层级定位。 Raid,资料给的客观解释是“磁盘阵列技术”。那么不同的Raid版本有什么区别?各个版本有什么目的? 目的。Raid0 单纯实现扩容、高读取速度。 Raid1,在基于Raid0的基础上,冗余备份(n/2)。 Raid5,这个方式我理解起来有点儿模糊。似乎是Y=4(N/4)-1,有一块儿盘用于记录奇偶校对,并且在有硬盘损坏的时候,利用记录的奇偶校对推算恢复。实现的目的是最大化利用磁盘资源,带来的缺点是只可容一块儿磁盘损坏,并且写入速度只有1块儿磁盘的速度。 Raid10,y=[(n&z)+(n&z)]。目的是读取性能相比Raid0*2,硬盘使用率和备份安全性=Raid1。总结: Raid0:磁盘空间使用率:100%,故成本最低。读性能:N*单块磁盘的读性能写性能:N*单块磁盘的写性能冗余:无,任何一块磁盘损坏都将导致数据不可用。 Raid1:磁盘空间使用率:50%,故成本最高。读性能:只能在一个磁盘上读取,取决于磁盘中较快的那块盘写性能:两块磁盘都要写入,虽然是并行写入,但因为要比对,故性能单块磁盘慢。冗余:只要系统中任何一对镜像盘中有一块磁盘可以使用,甚至可以在一半数量的硬盘出现问题时系统都可以正常运行。Raid5:磁盘空间利用率:(N-1)/N,即只浪费一块磁盘用于奇偶校验。读性能:(n-1)*单块磁盘的读性能,接近RAID0的读性能。写性能:比单块磁盘的写性能要差(这点不是很明白,不是可以并行写入么?)冗余:只允许一块磁盘损坏。Raid10:磁盘空间利用率:50%。读性能:N/2*单块硬盘的读性能写性能:N/2*单块硬盘的写性能冗余:只要一对镜像盘中有一块磁盘可以使用就没问题。 实现方式等还在学习。
1、三次握手(1)三次握手的详述首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。 最初两端的TCP进程都处于CLOSED关闭状态,A主动打开连接,而B被动打开连接。(A、B关闭状态CLOSED——B收听状态LISTEN——A同步已发送状态SYN-SENT——B同步收到状态SYN-RCVD——A、B连接已建立状态ESTABLISHED)B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。若有,则作出响应。1)第一次握手:A的TCP客户进程也是首先创建传输控制块TCB,然后向B发出连接请求报文段,(首部的同步位SYN=1,初始序号seq=x),(SYN=1的报文段不能携带数据)但要消耗掉一个序号,此时TCP客户进程进入SYN-SENT(同步已发送)状态。2)第二次握手:B收到连接请求报文段后,如同意建立连接,则向A发送确认,在确认报文段中(SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y),测试TCP服务器进程进入SYN-RCVD(同步收到)状态;3)第三次握手:TCP客户进程收到B的确认后,要向B给出确认报文段(ACK=1,确认号ack=y+1,序号seq=x+1)(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。TCP连接已经建立,A进入ESTABLISHED(已建立连接)。当B收到A的确认后,也进入ESTABLISHED状态。(2)总结三次握手过程:第一次握手:起初两端都处于CLOSED关闭状态,Client将标志位SYN置为1,随机产生一个值seq=x,并将该数据包发送给Server,Client进入SYN-SENT状态,等待Server确认;第二次握手:Server收到数据包后由标志位SYN=1得知Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产生一个值seq=y,并将该数据包发送给Client以确认连接请求,Server进入SYN-RCVD状态,此时操作系统为该TCP连接分配TCP缓存和变量;第三次握手:Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并且此时操作系统为该TCP连接分配TCP缓存和变量,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server就可以开始传输数据。起初A和B都处于CLOSED状态——B创建TCB,处于LISTEN状态,等待A请求——A创建TCB,发送连接请求(SYN=1,seq=x),进入SYN-SENT状态——B收到连接请求,向A发送确认(SYN=ACK=1,确认号ack=x+1,初始序号seq=y),进入SYN-RCVD状态——A收到B的确认后,给B发出确认(ACK=1,ack=y+1,seq=x+1),A进入ESTABLISHED状态——B收到A的确认后,进入ESTABLISHED状态。TCB传输控制块Transmission Control Block,存储每一个连接中的重要信息,如TCP连接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号。(3)为什么A还要发送一次确认呢?可以二次握手吗? 答:主要为了防止已失效的连接请求报文段突然又传送到了B,因而产生错误。如A发出连接请求,但因连接请求报文丢失而未收到确认,于是A再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接,A工发出了两个连接请求报文段,其中第一个丢失,第二个到达了B,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达B,此时B误认为A又发出一次新的连接请求,于是就向A发出确认报文段,同意建立连接,不采用三次握手,只要B发出确认,就建立新的连接了,此时A不理睬B的确认且不发送数据,则B一致等待A发送数据,浪费资源。(4)Server端易受到SYN攻击?服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击,SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。防范SYN攻击措施:降低主机的等待时间使主机尽快的释放半连接的占用,短时间受到某IP的重复SYN则丢弃后续请求。2、四次挥手(1)四次挥手的详述 假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了! 数据传输结束后,通信的双方都可释放连接,A和B都处于ESTABLISHED状态。(A、B连接建立状态ESTABLISHED——A终止等待1状态FIN-WAIT-1——B关闭等待状态CLOSE-WAIT——A终止等待2状态FIN-WAIT-2——B最后确认状态LAST-ACK——A时间等待状态TIME-WAIT——B、A关闭状态CLOSED)1)A的应用进程先向其TCP发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认。2)B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT(关闭等待)状态,此时的TCP处于半关闭状态,A到B的连接释放。3)A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。4)B没有要向A发出的数据,B发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。5)A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。(2)总结四次挥手过程:起初A和B处于ESTABLISHED状态——A发出连接释放报文段并处于FIN-WAIT-1状态——B发出确认报文段且进入CLOSE-WAIT状态——A收到确认后,进入FIN-WAIT-2状态,等待B的连接释放报文段——B没有要向A发出的数据,B发出连接释放报文段且进入LAST-ACK状态——A发出确认报文段且进入TIME-WAIT状态——B收到确认报文段后进入CLOSED状态——A经过等待计时器时间2MSL后,进入CLOSED状态。(3)为什么A在TIME-WAIT状态必须等待2MSL的时间?MSL最长报文段寿命Maximum Segment Lifetime,MSL=2答: 两个理由:1)保证A发送的最后一个ACK报文段能够到达B。2)防止“已失效的连接请求报文段”出现在本连接中。1)这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,而A能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则B无法正常进入到CLOSED状态。2)A在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。(4)为什么连接的时候是三次握手,关闭的时候却是四次握手?答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。(5)为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?答���虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
整理了一些Linux常用基础命令,欢迎指正。首先记住四个热键,学会这四个键,收益一辈子。Tab按键---命令补齐功能Ctrl+c按键---停掉正在运行的程序Ctrl+d按键---相当于exit,退出Ctrl+l按键---清屏1、关机命令:shutdownshutdown 参数说明:[-t] 在改变到其它runlevel之前,告诉init多久以后关机。[-r] 重启计算器。[-k] 并不真正关机,只是送警告信号给每位登录者〔login〕。[-h] 关机后关闭电源〔halt〕。[-n] 不用init而是自己来关机。不鼓励使用这个选项,而且该选项所产生的后果往往不总是你所预期得到的。[-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数,但是可以输入一个用来解释的讯息,而这信息将会送到每位使用者。[-f] 在重启计算器〔reboot〕时忽略fsck。[-F] 在重启计算器〔reboot〕时强迫fsck。[-time] 设定关机〔shutdown〕前的时间。shutdown -h 12:00系统将在12时准时关机。shutdown -h now不等了,系统现在就要关机。shutdown -r now别墨迹了,马上给我重启系统。shutdown -h 10不等了,系统将在10分钟后关机。取消定时关机命令:shutdown -c其他关机命令:halt和poweroffhalt 最简单的关机命令用halt命令来关机时,实际调用的是shutdown -h。halt 执行时将杀死应用进程,执行sync系统调用文件系统写操作完成后就会停止内核。halt 参数说明:[-n] 防止sync系统调用,它用在用fsck修补根分区之后,以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。[-w] 并不是真正的重启或关机,只是写wtmp〔/var/log/wtmp〕纪录。[-d] 不写wtmp纪录〔已包含在选项[-n]中〕。[-f] 没有调用shutdown而强制关机或重启。[-i] 关机〔或重启〕前关掉所有的网络接口。[-p] 该选项为缺省选项。就是关机时调用poweroff。poweroff 常用的关机命令对于poweroff,网上说它是halt命令的链接,基本用法和 halt 差不多。2、重启命令:reboot3、查看目录下文件命令:llll 是 ls -l 的常用别名。此命令的功能是:查看当前目录下的所有文件及详细信息,创建时间、读写权限等;4、目录显示命令:lsls 是Linux下常用命令,ls 命令的功能是:以列表的形式 列出当前目录下的文件;显示全部目录命令:ls -a5、变换目录命令:cdcd命令用来切换工作目录至dirname。 其中dirname表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的home directory(也就是刚login时所在的目录)。另外,~也表示为home directory的意思,.则是表示目前所在的目录,..则表示目前目录位置的上一层目录。实例cd 进入用户主目录;cd ~ 进入用户主目录;cd - 返回进入此目录之前所在的目录;cd .. 返回上级目录(若当前目录为“/“,则执行完后还在“/";".."为上级目录的意思);cd ../.. 返回上两级目录;cd !$ 把上个命令的参数作为cd参数使用。6、显示当前目录命令:pwdpwd命令能够显示当前所处的路径。这个命令比较简单,如果有时在操作过程中忘记了当前的路径,则可以通过此命令来查看路径,其执行方式为:# pwd/home/linuxidc第一行为运行的命令,第二行的内容为运行pwd命令后显示的信息,即显示用户当前所在的工作目录的路径为/home/linuxidc。提示:应该经常使用pwd命令。Linux的目录结构非常复杂,一个小小的分支就可能会有十几层目录,就好像是个森林,所以Linux不会像Windows那样把全路径写在提示符里,那样太长了。在目录用cd钻来钻去,很容易记不清自己到底身在何处,这时候执行命令可是有点危险的,例如,想删除一个文件,不搞清楚当前目录,可能会误删除同名的有用文件,而且没那么容易恢复。还有很多其他的情况需要使用pwd,尤其是在执行“rm –rf”这种对目录直接删除的操作时,更需要用pwd确定一下,可能每执行十几个命令就会输入一回。我们应该感谢Jim Meyering先生,他是pwd的创作者。7、查看版本信息命令:uname -a; lsb_release -a; getconf LONG_BITuname -a (Linux查看版本当前操作系统内核信息)lsb_release -agetconf LONG_BIT 返回32或者64,表示运行在32位或者64位模式下,返回32并不代表该CPU不支持64位计算。lsb_release命令用来显示LSB和特定版本的相关信息。如果使用该命令时不带参数,则默认加上-v参数。-v, --version显示版本信息-i, --id显示发行版的ID -d, --description显示该发行版的描述信息-r, --release显示当前系统是发行版的具体版本号-c, --codename发行版代号-a, --all显示上面的所有信息-h, --help显示帮助信息8、几个小工具命令显示日期的命令:date 很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。延时通常用于脚本执行过程中提供一段等待的时间。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。date: 无法设置日期: 不允许的操作 的解决方法:报错如下:“date: 无法设置日期: 不允许的操作”,因为使用Linux系统下的普通用户登录。执行场景如下:linuxidc@linuxidc ~$ date -s "19900909 13:14:21"date: 无法设置日期: 不允许的操作问题解决:1. 用su命令切换到超级用户linuxidc@linuxidc:~$ su root密码:2. 执行date设置指令OKroot@linuxidc:/home/linuxidc# date -s "19900909 13:14:21"1990年 09月 09日 星期日 13:14:21 CDT3. 用su命令切换到原普通账户root@linuxidc:/home/linuxidc# su linuxidclinuxidc@linuxidc:~$显示日历的命令:cal显示当前月 cal显示年历 cal 2018计算器命令:bcbc命令是一种支持任意精度的交互执行的计算器语言。bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下。
什么是grep?我们今天要学习的grep实用程序是一个Unix工具,它与egrep和fgrep实用程序属于同一系列。这些都是用于对文件和文本执行重复搜索任务的Unix工具。您可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。所以他们说grep是全局搜索正则表达式并打印出匹配的行,但这个命令'grep'来自哪里? grep基本上来源于一个名为ed的非常简单和令人尊敬的Unix文本编辑器的特定命令。这是ed命令的用法:g/re/p该命令的目的与我们通过grep进行搜索的含义非常相似。此命令获取与特定文本模式匹配的文件中的所有行。让我们进一步研究grep命令。在本文中,我们将解释grep实用程序的安装,并给出一些示例,通过这些示例,您可以确切地了解如何以及在何种情况下可以使用它。我们在Ubuntu 18.04 LTS系统上运行了本文中提到的命令和过程。安装grep虽然大多数Linux系统默认使用grep实用程序,但如果您的系统上没有安装它,以下是安装过程:通过Dash或Ctrl + Alt + T快捷方式打开Ubuntu终端。然后以root身份输入以下命令,以便通过apt-get安装grep:linuxidc@linuxidc:~$ sudo apt-get install grep在安装过程中出现y/n选项提示时输入y。 之后,grep实用程序将安装在您的系统上。您可以通过以下命令检查grep版本来验证安装:linuxidc@linuxidc:~$ grep --version将grep命令与示例一起使用grep命令可以通过介绍可以使用它的一些场景来得到最好的解释。 这里有一些例子:搜索文件如果要搜索包含特定关键字的文件名,可以通过grep命令过滤文件列表,如下所示:句法:$ ls -l | grep -i “searchword”例子:linuxidc@linuxidc:~$ ls -l | grep -i linuxidc此命令将列出当前目录中包含单词“linuxidc”的文件名的所有文件。在文件中搜索字符串您可以通过grep命令从包含特定文本字符串的文件中获取一个句子。句法:grep “string” filename例:linuxidc@linuxidc:~$ grep 'Ubuntu' linuxidc.txt我的示例文件linuxidc.txt包含具有字符串“Ubuntu”的句子,您可以在上面的输出中看到该句子。 关键字和字符串在搜索结果中以彩色形式显示。在多个文件中搜索字符串如果您想从同一类型的所有文件中搜索包含您的文本字符串的句子,grep命令随时为您服务。语法1:$ grep “string” filenameKeyword*语法 2:$ grep “string” *.extension例子1:linuxidc@linuxidc:~$ grep 'Ubuntu' linuxidc*此命令将从包含关键字“linuxidc”的文件名的所有文件中获取包含字符串“Ubuntu”的所有句子。例2:linuxidc@linuxidc:~$ grep 'Ubuntu' *.txt此命令将从所有扩展名为.txt的文件中获取包含字符串“Ubuntu”的所有句子。在不考虑字符串的情况下搜索文件中的字符串在上面的示例中,我的文本字符串幸运地与我的示例文本文件中的文本字符串相同。 如果我输入了以下命令,我的搜索结果将为nil,因为我的文件中的文本不是以大写单词“Sample”开头的grep "Sample file" *.txt让我们告诉grep忽略搜索字符串的情况,并通过-i选项根据字符串打印搜索结果。语法:$ grep -i “string” filename例子:linuxidc@linuxidc:~$ grep -i 'ubuntu' *.txt此命令将从所有扩展名为.txt的文件中获取包含字符串“Ubuntu”的所有句子。 这不会考虑搜索字符串是大写还是小写。在正则表达式的基础上搜索通过grep命令,可以指定带有start和end关键字的正则表达式。 输出将是包含指定的起始和结束关键字之间的整个表达式的句子。 此功能非常强大,因为您无需在搜索命令中编写整个表达式。句法:$ grep “startingKeyword.*endingKeyword” filename例子:linuxidc@linuxidc:~$ grep 'Linux.*.Fedora' linuxidc.com.txt此命令将从我在grep命令中指定的文件中打印包含表达式的句子(从我的startingKeyword开始,到我的endingKeyword结尾)。在搜索字符串之后/之前显示指定的行数您可以使用grep命令在文件中的搜索字符串之前/之后打印N行。 搜索结果还包括包含搜索字符串的文本行。密钥字符串后面N行的语法:$ grep -A <N> 'string' filename例子:linuxidc@linuxidc:~$ grep -A 3 -i '专业的Linux系统门户网站' linuxidc.com.txt这是我的示例文本文件的样子:这就是命令输出的样子:它从我在grep命令中指定的文件中显示3行,包括包含搜索字符串的行。密钥字符串前N行的语法:$ grep -B <N> 'string' filename您还可以在文本字符串周围搜索N行。 这意味着在文本字符串之前的N行和在文本字符串之后的N.关键字串周围N行数的语法:linuxidc@linuxidc:~$ grep -A 2 -i '目前Linux公社(LinuxIDC.com)' linuxidc.com.txt通过本文中描述的简单示例,您可以掌握grep命令。 然后,您可以使用它来搜索可能包含文件或文件内容的筛选结果。 在您掌握grep命令之后,这节省了大量的时间来浏览整个搜索结果。
第1步 - 检查系统的交换信息在开始之前,我们可以检查系统是否已经有一些可用的交换空间。 可以有多个交换文件或交换分区,但通常一个就足够了。我们可以通过键入以下内容来查看系统是否已配置任sudo swapon --show如果您没有收到任何输出,这意味着您的系统当前没有可用的交换空间。您可以使用free实用程序验证没有活动交换:free -h total used free shared buff/cache availableMem: 985M 84M 222M 680K 678M 721MSwap: 0B 0B 0B正如您在输出的Swap行中所看到的,系统上没有活动交换。第2步 - 检查硬盘驱动器分区上的可用空间在我们创建交换文件之前,我们将检查当前的磁盘使用情况,以确保我们有足够的空间。 通过输入:df -hFilesystem Size Used Avail Use% Mounted onudev 481M 0 481M 0% /devtmpfs 99M 656K 98M 1% /run/dev/vda1 25G 1.4G 23G 6% /tmpfs 493M 0 493M 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/locktmpfs 493M 0 493M 0% /sys/fs/cgroup/dev/vda15 105M 3.4M 102M 4% /boot/efitmpfs 99M 0 99M 0% /run/user/1000在这种情况下,带有/在Mounted on列上的设备是我们的磁盘。 在这个例子中我们有足够的空间(仅使用1.4G)。 您的用法可能会有所不同。虽然对交换空间的适当大小有很多意见,但这实际上取决于您的个人偏好和您的应用程序要求。 通常,等于或加倍系统RAM的量是一个很好的起点。 另一个好的经验法则是,如果您只是将其用作RAM后备,那么任何超过4G的交换都可能是不必要的。第3步 - 创建交换文件现在我们知道了可用的硬盘空间,我们可以在文件系统上创建一个交换文件。 我们将在根(/)目录中分配一个我们想要的交换大小的文件,称为swapfile 。创建交换文件的最佳方法是使用fallocate程序。 此命令立即创建指定大小的文件。由于我们示例中的服务器具有1G的RAM,因此我们将在本指南中创建1G文件。 调整此项以满足您自己的服务器的需求:sudo fallocate -l 1G /swapfile我们可以通过输入以下内容来验证是否保留了正确的空间量:ls -lh /swapfile-rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile我们的文件创建时留出了正确的空间。第4步 - 启用交换文件现在我们有一个正确大小的文件,我们需要实际将其转换为交换空间。首先,我们需要锁定文件的权限,以便只有具有root权限的用户才能读取内容。 这可以防止普通用户访问该文件,这会产生重大的安全隐患。通过键入以下内容使该文件只能由root访问:sudo chmod 600 /swapfile键入以下命令验证权限更改:ls -lh /swapfile-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile如您所见,只有root用户启用了读写标志。我们现在可以通过输入以下内容将文件标记为交换空间sudo mkswap /swapfileSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf标记文件后,我们可以启用交换文件,允许我们的系统开始使用它:sudo swapon /swapfile输入以下内容验证交换是否可用:sudo swapon --showNAME TYPE SIZE USED PRIO/swapfile file 1024M 0B -2我们可以再次检查free工具的输出以证实我们的发现:free -h total used free shared buff/cache availableMem: 985M 84M 220M 680K 680M 722MSwap: 1.0G 0B 1.0G我们的交换已成功设置,我们的操作系统将在必要时开始使用它。第5步 - 使交换文件永久化我们最近的更改已启用当前会话的交换文件。 但是,如果我们重新启动,服务器将不会自动保留交换设置。 我们可以通过将交换文件添加到/etc/fstab文件来更改此设置。备份/etc/fstab文件,以防出现任何问题:sudo cp /etc/fstab /etc/fstab.bak键入以下命令,将交换文件信息添加到/etc/fstab文件的末尾:echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab接下来,我们将查看一些我们可以更新的设置以调整我们的交换空间。第6步 - 调整您的交换设置您可以配置一些选项,这些选项会在处理交换时对系统的性能产生影响。调整Swappiness属性swappiness参数配置系统将数据从RAM交换到交换空间的频率。 这是介于0和100之间的值,表示百分比。值接近于零时,除非绝对必要,否则内核不会将数据交换到磁盘。 请记住,与交换文件的交互是“昂贵的”,因为它们比与RAM的交互花费更长的时间,并且它们可能导致性能的显着降低。 告诉系统不要太依赖交换通常会使您的系统更快。接近100的值将尝试将更多数据放入交换中以努力保持更多RAM空间。 根据应用程序的内存配置文件或服务器的使用情况,在某些情况下可能会更好。我们可以通过输入以下内容来查看当前的swappiness值:cat /proc/sys/vm/swappiness60对于桌面,swappiness设置为60并不是一个糟糕的值。 对于服务器,您可能希望将其移近0。我们可以使用sysctl命令将swappiness设置为不同的值。例如,要将swappiness设置为10,我们可以键入:sudo sysctl vm.swappiness=10vm.swappiness = 10此设置将持续到下次重新引导。 我们可以通过在/etc/sysctl.conf文件中添加该行来自动设置此值:sudo nano /etc/sysctl.conf在底部,您可以添加:/etc/sysctl.conf中vm.swappiness=10完成后保存并关闭文件。调整缓存压力设置您可能想要修改的另一个相关值是vfs_cache_pressure 。 此设置配置系统将选择多少缓存inode和dentry信息而不是其他数据。基本上,这是关于文件系统的访问数据。 这通常是非常昂贵的查询和非常频繁的请求,所以这是你的系统缓存的一个很好的事情。 您可以通过再次查询proc文件系统来查看当前值:cat /proc/sys/vm/vfs_cache_pressure100由于它当前已配置,我们的系统会过快地从缓存中删除inode信息。 我们可以通过键入以下内容将其设置为更保守的设置(如50):sudo sysctl vm.vfs_cache_pressure=50vm.vfs_cache_pressure = 50同样,这仅适用于我们当前的会话。 我们可以通过将其添加到配置文件来改变它,就像我们使用swappiness设置一样:sudo nano /etc/sysctl.conf在底部,添加指定新值的行:/etc/sysctl.conf中vm.vfs_cache_pressure=50完成后保存并关闭文件。
使用默认包安装GitUbuntu的默认存储库为您提供了一种快速安装Git的方法。 请注意,通过这些存储库安装的版本可能比当前可用的最新版本旧。 如果您需要最新版本,请考虑转到本教程的下一部分 ,以了解如何从源代码安装和编译Git。首先,使用apt包管理工具更新本地包索引。 更新完成后,您可以下载并安装Git:#sudo apt update#sudo apt install git您可以通过运行以下命令来确认您已正确安装Git:#git --versiongit version 2.17.1
CBM ( 彩色带宽计 )是一个简单的工具,可以在Ubuntu Linux中以颜色显示所有连接设备上的当前网络流量。 它用于监控网络带宽。 它显示了网络接口,接收的字节数,传输的字节数和总字节数。另请参阅 : iftop - 实时Linux网络带宽监控工具在本文中,我们将向您展示如何在Ubuntu及其衍生产品(如Linux Mint)中安装和使用cbm网络带宽监控工具。如何在Ubuntu中安装CBM网络监控工具可以使用APT包管理器从默认的Ubuntu存储库安装此cbm网络带宽监视工具,如图所示。$ sudo apt install cbm安装cbm后 ,可以使用以下命令启动程序。$ cbm Ubuntu网络带宽监控在cbm运行时,您可以使用以下键控制其行为:Up/Down - 箭头键选择界面以显示详细信息。b - 在每秒位数和每秒字节数之间切换。+ - 将更新延迟增加100毫秒。-- - 将更新延迟减少100毫秒。q - 退出程序。
服务热线:
4006-75-4006(7*24小时在线)
总机直拨:
0871-63886388(工作日9:00-18:00)
售前咨询
售后咨询
备案咨询
电话
二维码
TOP