Linux 快捷键
Ctrl + a 切换到命令行开始 这个操作跟 Home 实现的结果一样的,但 Home 在某些 unix 环境下无法使用,便可以使用这个组合;在 Linux 下的 vim,这个也是有效的;另外,在 windows 的许多文件编辑器里,这个也是有效的。 Ctrl + e 切换到命令行末尾 这个操作跟 END 实现的结果一样的,但 End 键在某些 unix 环境下无法使用,便可以使用这个组合;在 Linux 下的 vim,这个也是有效的;另外,在 windows 的许多文件编辑器里,这个也是有效的。 Ctrl + l 清除屏幕内容 效果等同于 clear Ctrl + u 清除剪切光标之前的内容 这个命令很有用,在 nslookup 里也是有效的。我有时看见同事一个字一个字的删除 shell 命令,十分崩溃!其实完全可以用一个 Ctrl + u 搞定。 Ctrl + k 剪切清除光标之后的内容 […]
10个最酷的Linux单行命令
下面是来自 Commandlinefu 网站由用户投票决出的 10 个最酷的 Linux 单行命令,希望对你有用。 sudo !! 以 root 帐户执行上一条命令。 python -m SimpleHTTPServer 利用 Python 搭建一个简单的 Web 服务器,可通过 http://$HOSTNAME:8000 访问。 :w !sudo tee % 在 Vim 中无需权限保存编辑的文件。 cd – 更改到上一次访问的目录。 ^foo^bar 将上一条命令中的 foo 替换为 bar,并执行。 cp filename{,.bak} 快速备份或复制文件。 mtr google.com traceroute + ping。 !whatever:p 搜索命令历史,但不执行。 $ssh-copy-id user@host 将 ssh keys 复制到 user@host 以启用无密码 […]
Linux系统中掩耳盗铃的sudo配置
今天在这里讨论Linux系统中一个非常滑稽的系统配置失误,就是sudo,为什么说是滑稽的配置呢,就是因为如果配置不当的话,普通用户非常容易就可以提权到root用户,而且没有一点技术含量,系统管理员自己以为已经做好了权限管理,其实如果配置不当,权限漏洞已经出现。 很多公司Linux系统都会用到sudo来配置普通用户可以执行的超级用户权限,一是为了系统管理员更安全的操作系统,二是可以为研发人员提供可控的权限范围,下面就看一下我们在系统中常见的sudo配置文件。 admin ALL=(ALL) NOPASSWD: /app/nginx/sbin/nginx 这一段配置文件显示admin用户可以通过sudo来调用root权限启动nginx,相信这也是经常使用sudo的功能之一,因为如果nginx启动的是80端口的话,普通用户是无法启动的,因为系统限制了1024以下的端口监听只有root权限才可以操作,问题大多出现在这个sbin目录下的nginx可执行文件上,因为我们既然要将nginx的管理权限交付给普通用户admin,那么大部分情况是nginx的所有文件权限所属用户及组也都为admin,就像下面显示的这样。 [admin@localhost sbin]$ ll 总用量 3004-rwxr-xr-x 1 admin admin 3066035 9月 10 2014 nginx 但是如果sbin目录下的nginx文件权限也为admin用户,而此时该文件还在sudo权限配置中,那么问题就来了,admin用户可以将系统任意命令copy过来变成nginx文件,到这里大家应该知道潜在的风险是有多大了,只要是任何命令文件admin用户有只读权限,那么就可以把文件变成nginx,随意以root身份执行该命令,因为sudo只关心执行的文件名,而不关心文件内容本身,如果此时admin用户需要提权到root用户下也很简单,只要将系统的vi命令copy到sbin目录下并重命名为nginx,当文件替换后,此时的nginx文件就变成了系统的vi命令,如果admin用户此时运行sudo nginx时就是以root用户的权限来执行vi动作了,例如用户执行sudo nginx /etc/sudoers,他就可以用root身份来编辑这个文件,从而给自己开放一个NO PASSWORD ALL的权限,只要保存sudo配置文件,执行sudo su -就可以轻松切换到root权限中来了,而后再将被替换的nginx文件复原,此时用root权限就可以轻松留下系统后门,同时再清空操作记录,完成整个操作而不留痕迹,下面来总结一下admin提权需要的几步操作。 [admin@localhost ~]$ sudo -l用户 admin 可以在该主机上运行以下命令: (ALL) NOPASSWD: /app/nginx/sbin/nginx [admin@localhost ~]$ which vi /bin/vi [admin@localhost ~]$ cp /bin/vi /app/nginx/sbin/nginx [admin@localhost ~]$ sudo /app/nginx/sbin/nginx /etc/sudoers //注意此时已经是调用root权限vi编辑sudoers文件了 [admin@localhost ~]$ sudo -l用户 admin 可以在该主机上运行以下命令: (ALL) NOPASSWD: ALL [admin@localhost ~]$ sudo su – root [root@localhost ~]# //用户成功切换到root权限 避免这样的问题发生其实也很简单,就是将我们需要执行的文件所属权限都改为root即可,这样普通用户就没有办法用copy的方法来改写这个文件,因为他对于该文件已经没有操作权限了,从而也就规避了这种提权风险。 最后提一下发现这个配置问题的过程,在很早刚开始负责运维工作时,那个时候还是在一家传统互联网企业,甲方对于权限的控制非常严格,对于系统操作人员只提供普通用户权限,如果普通用户需要操作apache或者是nginx等就需要配置sudo,由于申请root权限的流程非常繁琐,在一次非常紧急的系统故障处理中就发现了这个方法,而当时的sudo可执行文件就存在权限所属的问题,最终提权成功了,不过这种方法还是不鼓励大家去做哈,如果在生产系统中发现有这样的问题,应该及时更新修复,避免由于权限泄漏导致的更多问题。 原创文章首发自阿布的博客,本文地址:http://www.abuve.com/article/16
每天一个linux命令(50):crontab命令
前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。 一、crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 Linux下的任务调度分为两类,系统任务调度和用户任务调度。 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。 /etc/crontab文件包括下面几行: [root@localhost ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=””HOME=/ # run-parts 51 * * * * root run-parts /etc/cron.hourly 24 7 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly [root@localhost ~]# 前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。 使用者权限文件: 文件: /etc/cron.deny 说明: 该文件中所列用户不允许使用crontab命令 文件: /etc/cron.allow 说明: 该文件中所列用户允许使用crontab命令 文件: /var/spool/cron/ 说明: 所有用户crontab文件存放的目录,以用户名命名 crontab文件的含义: 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下: minute hour day month week command 其中: minute: 表示分钟,可以是从0到59之间的任何整数。 hour:表示小时,可以是从0到23之间的任何整数。 day:表示日期,可以是从1到31之间的任何整数。 month:表示月份,可以是从1到12之间的任何整数。 week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。 command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。 在以上各个字段中,还可以使用以下特殊字符: 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9” 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6” 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。 二、crond服务 安装crontab: yum install crontabs 服务操作说明: /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置 查看crontab服务状态: […]
linux 权限掩码 umask
一 权限掩码umask umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常用到的是后3个,例如你用chmod 755 file(此时这文件的权限是属主读(4)+写(2)+执行(1),同组的和其它用户有读写权限) 二 umask的作用 默认情况下的umask值是022(可以用umask命令查看),此时你建立的文件默认权限是644(6-0,6-2,6-2),建立的目录的默认权限是755(7-0,7-2,7-2),可以用ls -l验证一下哦 现在应该知道umask的用途了吧,它是为了控制默认权限,不要使默认的文件和目录具有全权而设的。 三 如何计算umask值 umask命令允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、同组用户、其他用户)存在一个相应的umask值中的数字。对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。目录则允许设置执行权限,这样针对目录来说,umask中各个数字最大可以到 7。 计算u m a s k值的方法:我们只要记住u m a s k是从权限中“拿走”相应的位即可。 umask值与权限表 Umask中的某位 文件 目录 0 6 7 1 6 6 2 4 5 3 4 4 4 2 3 5 2 2 6 0 1 7 0 0 如果umask为023,则对于文件所有者,不拿去任何权限,而新建的文件默认没有执行权限,故对文件所有者的权限位rw-(6);对组所有者,拿去写权限,原本没有执行权限,故为r–(4);对其他用户,拿去写和执行权限,原本没有执行权限,故为r–(4); 如果umask为023,因为没有新建目录没有执行权限的限制。则对于目录所有者,不拿去任何权限,故对目录所有者的权限为rwx(7);对组所有者,拿去写权限,故为r-x(5);对其他用户,拿去写和执行权限,故为r–(4); 四 常用的u m […]
Linux下zip加密压缩
zip -q -r -P password zipfile.zip sourcefiles.txt password 是加密密码 zipfile.zip 是生成的压缩文件 sourcefiles.txt 是被压缩的文件 zip [参数] 使用zip格式打包文件 -r 递归,将指定目录下的所有文件和子目录一并处理 -S 包含系统和隐藏文件 -y 直接保存符号连接,而非该连接所指向的文件 -X 不保存额外的文件属性 -m 将文件压缩并加入压缩文件后,删除源文件 – 1~9,数字越大,压缩率越高 -F 尝试修复已损坏的压缩文件 -T 检查备份文件内的每个文件是否正确无误 -q 不显示指令执行过程 -g 将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件 -u 更新压缩包内文件 -f 更新压缩包内文件。如果符合条件的文件没有包含在压缩包中,则压缩后添加 -$ 保存第一个被压缩文件所在磁盘的卷标 -j 只保存文件名称及其内容 -D 压缩文件内不建立目录名称 -i 压缩目录时,只压缩符合条件的文件 -x 排除符合条件的文件 -n 排除指定文件名后缀的文件 -b 指定临时文件目录 -d […]
linux下删除某个目录下大量文件办法
在lamp架构里,因为设置session 超时时间为一天,所以遇到php产生的session大量存在/data/tmp目录下,数量大概有200万,并且不能及时回收。使用 rm -fr /data/tmp/sess_* 不能删除,rm命令会提示参数太多。 后,使用rsync同步删除命令实现,完美实现了批量删除大量垃圾文件操作。具体步骤如下: 大量文件存在的目录:/data/tmp 使用命令: #cd /data #mkdir -pv /data/null # 建立临时空目录 #rsync -process –delete -rv null/ tmp/ 这样可以批量删除,文件太大,可以放在后台执行: #nohup rsync -process –delete -rv null/ tmp/ & 原理就是使用rsync 对源目录同步不存在的话,删除目标文件
每天一个linux命令(41):ps命令
Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。 ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。 kill 命令用于杀死进程。 linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行) ps工具标识进程的5种状态码: D 不可中断 uninterruptible sleep (usually IO) R 运行 runnable (on run queue) S 中断 sleeping T 停止 traced or stopped Z 僵死 a defunct (”zombie”) process 1.命令格式: ps[参数] 2.命令功能: 用来显示当前进程的状态 3.命令参数: a 显示所有进程 -a 显示同一终端下的所有程序 -A 显示所有进程 c 显示进程的真实名称 -N 反向选择 -e 等于“-A” e 显示环境变量 f 显示程序间的关系 -H 显示树状结构 r 显示当前终端的进程 T 显示当前终端的所有程序 u 指定用户的所有进程 -au 显示较详细的资讯 -aux 显示所有包含其他使用者的行程 -C<命令> 列出指定命令的状况 –lines<行数> 每页显示的行数 –width<字符数> 每页显示的字符数 –help 显示帮助信息 –version 显示版本显示 4.使用实例: 实例1:显示所有进程信息 命令: ps -A 输出: [root@localhost test6]# ps -A PID TTY TIME CMD 1 ? 00:00:00 init 2 ? 00:00:01 migration/0 3 ? 00:00:00 ksoftirqd/0 4 ? 00:00:01 migration/1 5 ? 00:00:00 ksoftirqd/1 6 ? 00:29:57 events/0 7 ? 00:00:00 events/1 8 ? 00:00:00 khelper […]
每天一个linux命令(40):wc命令
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。 1.命令格式: wc [选项]文件… 2.命令功能: 统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。 3.命令参数: -c 统计字节数。 -l 统计行数。 -m 统计字符数。这个标志不能与 -c 标志一起使用。 -w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。 -L 打印最长行的长度。 -help 显示帮助信息 –version 显示版本信息 4.使用实例: 实例1:查看文件的字节数、字数、行数 命令: wc test.txt 输出: [root@localhost test]# cat test.txt hnlinux peida.cnblogs.com ubuntu ubuntu linux redhat Redhat linuxmint [root@localhost test]# wc test.txt 7 8 70 test.txt [root@localhost test]# wc -l test.txt 7 test.txt [root@localhost test]# wc -c test.txt 70 test.txt [root@localhost test]# wc -w test.txt 8 test.txt [root@localhost test]# wc -m test.txt 70 test.txt [root@localhost test]# wc -L test.txt 17 test.txt 说明: 7 8 70 test.txt 行数 单词数 字节数 文件名 实例2:用wc命令怎么做到只打印统计数字不打印文件名 命令: 输出: [root@localhost test]# wc -l test.txt 7 test.txt [root@localhost test]# cat test.txt |wc -l 7[root@localhost test]# 说明: 使用管道线,这在编写shell脚本时特别有用。 实例3:用来统计当前目录下的文件数 命令: ls -l | wc -l 输出: […]
每天一个linux命令(39):grep 命令
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。 grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。 grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。 1.命令格式: grep [option] pattern file 2.命令功能: 用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。 3.命令参数: -a –text #不要忽略二进制的数据。 -A<显示行数> –after-context=<显示行数> #除了显示符合范本样式的那一列之外,并显示该行之后的内容。 -b –byte-offset #在显示符合样式的那一行之前,标示出该行第一个字符的编号。 -B<显示行数> –before-context=<显示行数> #除了显示符合样式的那一行之外,并显示该行之前的内容。 -c –count #计算符合样式的列数。 -C<显示行数> –context=<显示行数>或-<显示行数> #除了显示符合样式的那一行之外,并显示该行之前后的内容。 -d <动作> –directories=<动作> #当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。 -e<范本样式> –regexp=<范本样式> #指定字符串做为查找文件内容的样式。 -E –extended-regexp #将样式为延伸的普通表示法来使用。 -f<规则文件> –file=<规则文件> #指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。 -F –fixed-regexp #将样式视为固定字符串的列表。 -G –basic-regexp #将样式视为普通的表示法来使用。 -h –no-filename #在显示符合样式的那一行之前,不标示该行所属的文件名称。 -H –with-filename #在显示符合样式的那一行之前,表示该行所属的文件名称。 -i –ignore-case #忽略字符大小写的差别。 -l –file-with-matches #列出文件内容符合指定的样式的文件名称。 -L –files-without-match #列出文件内容不符合指定的样式的文件名称。 -n –line-number #在显示符合样式的那一行之前,标示出该行的列数编号。 -q –quiet或–silent #不显示任何信息。 -r –recursive #此参数的效果和指定“-d recurse”参数相同。 -s –no-messages #不显示错误信息。 -v –revert-match #显示不包含匹配文本的所有行。 -V –version #显示版本信息。 -w –word-regexp #只显示全字符合的列。 -x –line-regexp #只显示全列符合的列。 -y #此参数的效果和指定“-i”参数相同。 4.规则表达式: grep的规则表达式: ^ #锚定行的开始 如:’^grep’匹配所有以grep开头的行。 $ #锚定行的结束 如:’grep$’匹配所有以grep结尾的行。 . #匹配一个非换行符的字符 如:’gr.p’匹配gr后接一个任意字符,然后是p。 * #匹配零个或多个先前字符 如:’*grep’匹配所有一个或多个空格后紧跟grep的行。 .* #一起用代表任意字符。 [] #匹配一个指定范围内的字符,如'[Gg]rep’匹配Grep和grep。 [^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 \(..\) #标记匹配字符,如’\(love\)’,love被标记为1。 \< #锚定单词的开始,如:’\<grep’匹配包含以grep开头的单词的行。 \> #锚定单词的结束,如’grep\>’匹配包含以grep结尾的单词的行。 x\{m\} #重复字符x,m次,如:’0\{5\}’匹配包含5个o的行。 x\{m,\} #重复字符x,至少m次,如:’o\{5,\}’匹配至少有5个o的行。 x\{m,n\} #重复字符x,至少m次,不多于n次,如:’o\{5,10\}’匹配5–10个o的行。 \w #匹配文字和数字字符,也就是[A-Za-z0-9],如:’G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p。 \W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。 \b #单词锁定符,如: ‘\bgrep\b’只匹配grep。 POSIX字符: 为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。 […]