Linux

There are 25 entries for the tag Linux

Linux下以其他用户运行程序

MitchellChu 2015-07-29 Unix & Linux

  #1:runuser命令 runuser命令使用一个替代的用户或者组ID运行一个Shell。这个命令仅在root用户时有用。 仅以会话PAM钩子运行,并且没有密码提示。如果用一个非root用户,并且该用户没有权限设置user ID,这个命令将会因为程序没有setuid而失败。因runuser不会运行认证和账户PAM钩子,它比su更底层。 语法: runuser -l userNameHere -c 'command' runuser -l userNameHere -c '/path/to/command arg1 arg2' 举例来说,作为一个root用户,你也许想检查下oracle用户下的shell资源限制,输入: # runuser -l oracle -c 'ulimit -SHa' 或者监察下nginx或lighttpd web服务器限制: # runuser -l nginx -c 'ulimit -SHa' 或  # runuser -l lighttpd -c 'ulimit -SHa'  有时,root用户由于权限(安全)问题不能浏览NFS挂载的共享: # ls -l /nfs/wwwroot/cyberciti.biz/http 或者 # cd /nfs/wwwroot/cyberciti.biz/http 可能的输出: -bash: cd: /nfs/wwwroot/cyberciti.biz/http/: Permission denied 尽管如此,apache用户被允许浏览或访问挂载在/nfs/wwwroot/cyberciti.biz/http/下基于nfs的系统: # runuser -l apache -c 'ls -l /nfs/wwwroot/cyberciti.biz/http/' 或者 # runuser -l apache -c 'cd /nfs/wwwroot/cyberciti.biz/http/; vi index.php' 使用runuser命令,无需使用密码,并且,只能在root用户下使用。 可用选项: 1. -l: 让shell成为登录shell,用 runuser -l PAM 文件替代默认的 2. -g:指定主要的组 3. -G 追加组 4. -c:命令,要传到shell的单个命令 5. --session-command=COMMAND:使用-c传递单个命令道shell中并且不创建新的会话 6. -m: 不重置环境变量。     #2:su命令 su命令允许你成为一个超级用户或者替代用户(substitute user),欺骗用户(spoof user),设置用户(set user)或者切换用户(switch user)。它允许一个Linxu用户切换当前用户到那些你知道密码的目标用户,切换包括与之关联的运行中的控制台(console)或者Shell,它的语法如下: su - su - username   切换到root用户 su命令会询问目标用户的密码,在你的shell命令行中输入 su - 来切换到root用户(你必须知道root用户的密码): vivek@wks01:~$ su - 或者 vivek@wks01:~$ su - root 输出示例: Password: root@wks01:/root# logout vivek@wks01:~$ 如果输入了正确的root密码,会话的所有权(这里应该指当前控制台的上下文——译注)将改为root账户。输入logout可以退出一个root登录的shell,输入 whoami或者id命令来验证当前会话的所有者: whoami 或者 id   用root账户运行命令 语法是: su - root -c "command" # OR su - -c "command arg1"  查看/root目录下的内容,这些原本是普通用户无法访问的,运行: su - root -c "ls -l /root" 需要注意的是,Linix和一些Unix-like系统有一个wheel用户组,并且只允许这个组内的用户使用su切换到root。   使用su命令来让其他用户运行命令 下面这个命令是切换到oracle的账户,并且显示限制清单: $...

Linux非root用户程序使用小于1024端口

MitchellChu 2015-07-09 Unix & Linux

在Linux下,默认端口1024下的是要在root下才能使用的,在其他用户下,如果尝试使用将会报错。在有的时候,我们可能考虑程序运行在root帐户下,可能会给Linux系统带来安全风险。那如何能够让非root用户运行的程序能够对外启用小于1024的端口呢?本文尝试给出一些方法:   第一种方法: SetUID 为用户的应用程序在执行位设置user ID能够使程序可以有root权限来运行,这个方法让程序能够像在root下运行有同样的效果,不过需要非常小心,这种方法同样会带来安全风险,特别是当要执行的程序本身存在安全风险。使用的方法是: chown root.root /path/to/application #使用SetUID chmod u+s /path/to/application 我们可以看到在系统下,/usr/bin/passwd这种文件,就使用了SetUID,使得每个系统能的用户都能用passwd来修改密码——这是要修改/etc/passwd的文件(而这个只有root有权限)。 既然要使用非root用户运行程序,目的就是要降低程序本身给系统带来的安全风险,因此,本方法使用的时候需要特别谨慎。   第二种方法: CAP_NET_BIND_SERVICE 从2.1开始,Linux内核有了能力的概念,这使得普通用户也能够做只有超级用户才能完成的工作,这包括使用端口1。 获取CAP_NET_BIND_SERVICE能力,即使服务程序运行在非root帐户下,也能够banding到低端口。使用的方法: #设置CAP_NET_BIND_SERVICE setcap cap_net_bind_service =+ep /path/to/application Note: 1. 这个方法并不是所有Linux系统通适,内核在2.1之前的并没有提供,因此你需要检查要使用此方法所在系统是否支持(Linux must support capacity); 2. 另外需要注意的是,如果要运行的程序文件是一个脚本,这个方法是没有办法正常工作的(Script won't work)。   第三种方法: Port Forwarding 如果要运行的程序有权限监听其他端口,那么这个方法是可以使用的,首先让程序运行在非root帐户下,并绑定高于1024的端口,在确保能正常工作的时候,将低端口通过端口转发,将低端口转到高端口,从而实现非root运行的程序绑定低端口。要使用此方法可以使用下面的方式: # Enable the IP FORWARD kernel parameter. sysctl -w net.ipv4.ip_forward=1 # Use iptables rules to redirect packets iptables -F -t nat iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to:8088 第一步使用sysctl确保启用IP FORWARD功能(此功能在Red Hat/CentOS默认是被禁用的),注意,代码中使用的sysctl设置是临时性设置,重启之后将会被重置,如果要长久保存,需要在/etc/sysctl.conf文件内修改: # Default value is 0, need change to 1. # net.ipv4.ip_forward = 0 net.ipv4.ip_forward = 1 然后从文件中加载新的配置 # load new sysctl.conf sysctl -p /etc/sysctl.conf # or sysctl -p # default filename is /etc/sysctl.conf  第二步就是使用iptables的规则来实现端口转发到程序所在的端口,示例中我们要将80端口转发到8088。 此种方法能够比较好的达到我们的目的,我们的程序可以通过非root用户来运行,并能够对外提供低端口号的服务。   第四种方式: RINETD2 这种方法使用的也是端口转发,此工具可以将本地端口映射到远程端口,但此功能对于我们当前的功能来说,有点鸡肋,毕竟我们新增了一个额外的程序,这将可能会增加我们系统的风险性。在此不做推荐。   参考说明: 1.  Linux capabilities文档,参见其中CAP_NET_BIND_SERVIC,文中的内核是否从2.1开始有这个功能并不完全确定,此信息来自网上。 2.  官网地址:RINETD  

Linux任务的高级管理:程序后台运行及控制

MitchellChu 2014-06-18 Unix & Linux

在Bash下操作,不可避免的需要让程序运行在后台而不妨碍前台的操作。在Linux有个概念称之为Job Control,由于Bash下的运行的任何程序都是当前Bash下的子程序,而job control也即管理当前Bash下的子程序。所以,Job Control的概念是不能跨Bash管理,比如我们不能在tty1中管理tty2中的程序。 其中我们在Bash中最常用的应该就是&符了,这个符号跟在要运行的程序的后面,像下面这样: ping blog.useasp.net & 这样配置后,我们将会发现,运行后,系统返回的是类似下面这样的: [1] 23911 这样我们就将这个ping放到了当前Bash的后台进行运行,我们此时仍可以正常的在Bash下进行其他的操作。但是你也许会发现这种方式运行的程序虽然不影响你当前操作,但是运行的输出却总是和我们抢占Bash的屏幕,非常的郁闷!但当我们想Ctrl+C来终止的时候,却又无能为力——因为在Bash下你Ctrl+C根本无法终止这个后台运行的程序! 为了防止这种情况,我们需要用到重定向(Redirection),如果你不太清楚,可以本博客之前的博文《Linux下高效编写Shell-Shell特殊字符汇总》篇里面的重定向,代码变化不大,类似下面这样: ## 重定向输出到/dev/null这个特殊文件 ## 也就是没有输出内容了 ping blog.useasp.net &>/dev/null & 当然,我们一般更希望后台运行的程序的输出能够保存到指定文件,而不是直接丢弃,所以更一般形式是: ping blog.useasp.net >>/tmp/background_programs.log 2>&1 & ## 想想这是什么意思? 但我们在这里是要Bash界面能够不被后台的程序搞砸。——毫无疑问,我们前一种已经达到了我们要的效果。  恩,迄今为止我们已经能够将程序放到后台运行了,但是,对于已经占据我们Bash的程序,我们却无能为力,为了不让它们继续霸占我们的Bash屏幕,我们迄今能做的只有Ctrl +C,让它见鬼去吧!这样我们跑了很久的程序也就终结了,不过,运行的数据可能也没有了。也许更温柔一点是个不错的选择——Ctrl+Z! Ctrl+Z是让程序暂停,在已经运行的程序上直接按下Ctrl+Z,他们就会非常自觉的将自己挂起,并放入到后台中,此时的程序是处于停止状态的,如果要让他在后台运行,就还要用到后面将学到的命令。但此时,我们的Bash屏幕能恢复干净清爽才最主要。  好了,在这难得平静的Bash界面上,让我们来学习下job control的一个命令吧,也许我们后台已经有一堆程序在跑呢,我们怎么也得看看才放心,jobs命令就是让我们干这个事情的: jobs [-lnprs] [jobspec ...] or jobs -x command [args] 参数: -l 列出后台程序的job number,PID, 状态和命令串 -n 显示自从上次用户知晓状态后程序改变过状态的程序 -r 仅列出正在后台运行(RUNNING)的程序 -s 仅列出后台中处于停止(STOPPED)的程序 更详细的内容可以参看man,这里基本够我们用了。 用用看,你也许会发现你的后台有很多程序在运行哦,同时你也会看到一些不同的地方,比如: jobs -l [1]- 10314 Running ping blog.useasp.net &>/dev/null & [2]+ 10833 Stopped emacs (wd:~) 中括号后面的竟然有+和-号,这是什么?这个是Bash根据我们放入后台的顺序的一个标记,+号表示最近被放到后台的程序,-号次之,如果有三个以上,我们就会发现第三个以上是没有+/-符号的。而下面我们将要看到的fg在取出后台程序的时候,+号在默认情况下就是那个被切换到前台的程序了。 既然上面我们说了fg,那就看看它是干什么的。fg应该是foreground的简写,即前台,它的作用是将在后台的程序切换到前台来运行。在切换的时候,fg可以指定参数——Job Number! ## 使用上面的jobs -l中的例子 fg ## 这个切换到前台运行的程序将会是emacs——Why? ## 或者我们使用下面这种形式 fg...

感叹号提高Bash下效率——历史扩展(bang命令)

MitchellChu 2014-06-03 Unix & Linux 编程语言

前一篇中介绍了在Bash下用快捷键来提高工作效率,而在Bash下要高效的工作,不仅仅可以从快捷键的方式来达到,Bash下还有很多其他方式,比如,使用别名,在之前的使用一些Shell下的特殊符号等,都能够一定程度的简化操作。而在Bash下还有另外一类——历史扩展,如果应用的当也能很大程度提高操作效率,嗯!Linux下你要放这么些代码,也显得很酷! 历史扩展(History Expansion)又被称为Bang(!)命令1,历史扩展是bash将历史命令转换到可执行命令的过程。Bash下的History库提供了一个与csh下历史扩展类似的历史扩展功能。历史扩展中操作历史命令一般有两个部分: 首先要从历史命令中找出相对应的命令,被选择到的命令我们称作为Event(条目),比如上面的Bang Bang(!!),就是选择最后一条命令; 选择选定行的部分或全部文本以包含到当前行中。要操作的条目(Event)Bash将其拆分成了Words(词),命令中的Words是靠空格来分割的,我们就可以使用修饰符(Modifiers)来调整Words以符合我们的要求。注意:Words并不是英文单词,而是一个字符序列而已。 例子: cat /tmp/cat.cat.txt ##这个是cat出cat.cat.txt的内容 !:0 !*:gs/cat./echo. ##获取命令,参数中的cat.换成echo. ##变成/tmp/echo.echo.txt内容. ## 第二个命令中: ##我们首先是选出命令!!(!:0可以写成!!:0,!*同样可以写成!!*) ##有了命令之后我们选择第二步 ##利用0,选择出词(!:0选择出来的是cat) ##第三步是对词进行操作,这里是!*后面对参数进行了字符替换。 ##最后变成完成的命令了: ## cat /tmp/echo.echo.txt 条目标志符(Event Designators)条目标志符是一个到历史列表内一个命令行实体的引用,除非是绝对引用,不然条目的引用是相对历史列表中当前位置的。 条目标志符 条目标志符说明 ! ...

Linux下更高效的使用Bash——快捷键

MitchellChu 2014-06-03 Unix & Linux 编程语言

在Linux下,Bash的地位无可忽视,日常中涉及到Linux下的管理与操作基本都是在Bash中进行,因此,为了提高Linux下工作效率,自然而然的就变成了如何高效使用Bash的问题。虽然上一篇Shell下的一些特殊字符在使用的时候,能够一定程度上提高效率,后一篇关于Bash下的历史扩展也能很大程度提高效率,但Bash上的一些快捷键才是提高效率的最简单也是最直接方式。本文正是奔着这个目标来的! 快捷键的一些说明: C = CTL = CTRL = CONTROL:这个键是指PC键盘上的Ctrl键 M = ALT:这个键是PC键盘上的ALT键,如果你键盘上没有这个键,可以尝试使用ESC键代替 S = SHIFT:此键是PC上的Shift键 E = ESC:这个键是PC键盘上的ESC键,此键一般在键盘的左上角 DEL = Backspace:此键是是PC键盘上的Backspace键,一般位于主键盘区的右上角 文中"[]"括住的为快捷键内容,"-"两边的内容是按住左边键,再按右边键获得,","逗号两边的内容是先按左边键,松开后再按右边键。如:[C-v]是表示按下Ctrl键之后,不要松开,再按下v键。 默认的情况下,快捷键的组成格式是:<Ctrl | Alt | Esc>-[Shift-]<char>。即由Ctrl,Alt,Esc之一开头,中划线,Shift,中划线,和一个字符组成。其中,中括号内的Shift和"-"有时可省略。 默认情况下,快捷键只有最后一个为字符,其他的键值均为功能键 出现[C-?]这类快捷键,由于"?"是需要使用SHIFT按键才能获得的字符,因此此类快捷键默认使用的是[C-S-?] 要注意,在Bash里面,快捷键可能会被写成八进制或者十六进制的形式(跟在转义符后面); 脚本文件中的快捷键并不是总能起作用的。另外快捷键有个规律,Ctrl开头的快捷键一般是针对字符的,而Alt开头的快捷键一般是针对词的。 Bash下,如果使用的是shell脚本文件,快捷键不一定是有的时候会出现同一个快捷键有不同的表现,这种情况一般是由于Bash所处的模式不同而引起的,你可以通过set命令来调整模式: set -o emacs ##切到emacs模式 ## set -o vi ##切到vi模式 ## set -o ## 查看当前选项的设置状态 这个是Bash的option选项,你可以根据具体情况进行设置,本文使用的是emacs模式。 快捷键 快捷键说明 ...

Linux下高效编写Shell——shell特殊字符汇总

MitchellChu 2014-06-02 Unix & Linux 编程语言

Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好,往往能给我们起到事半功倍的效果,为此,特地将Shell里面的一些符号说明罗列成对照表的形式,以便快速的查找。看看你知道下表中哦你的哪些Shell符号呢? Shell符号及各种解释对照表: Shell符号 使用方法及说明 # 注释符号(Hashmark[Comments]) ...

Linux下如何批量建立文件软连接(极简版)

MitchellChu 2014-05-21 Unix & Linux

在上一篇里面是通过创建了Shell脚本文件的方式来批量创建文件的软链接,由于Shell脚本处在(Linux)菜鸟阶段,那个脚本文件的编写完全是现学现卖——Shell语法都没看完,这我会告诉你吗,告诉你会信吗?所以引出的一个问题是:此脚本虽然能正确处理任务但肯定还有很多地方的处理值得商榷。为此也花了一些时间思考了一下如何不要使用shell脚本文件来处理批量建立软链接的问题,后来确有一些思路,在上篇成文之时已经有了一些方法,所以当时卖了一个关子。 要一行脚本代码来建立批量的文件软链,Mitchell的思路主要在通道的使用上,我希望能够这样: ## 代码是示意,并不能正常运行 ls /tmp/*.log | ln -s ..... 但在Linux下这个通道我并没有知道合适的传递参数的方法。只能告一个段落。换种思路,就是将文件列表用for循环来处理。于是,有了下面的脚本: ## 获取目录下要软链接的文件,让后用for遍历文件来创建软链接。 FILES=`ls *.log`;for FILE in $FILES;do ln -s '/tmp/'$FILE '/tmp/lnk_'$FILE;done 但这个只能放到目标目录下,这是/tmp目录,然后运行,因为FILE遍历出来不能含有路径。为了改善这个缺点,做了改进: ## 使用basename来将路径过滤掉,只取文件名称 FILES=`ls /tmp/*.log`;for FILE in $FILES;do ln -s $FILE '/tmp/lnk_'`basename $FILE`;done 后来发现,此处还可以继续改进,在Linux下你可以这样: ## create all files' soft link in '/tmp/' which subfix is log, and all link files' save to /tmp/ with prefix 'lnk_' for FILE in /tmp/*.log;do ln -s $FILE '/tmp/lnk_'`basename $FILE`;done  这样就可以在任意位置下运行这个代码,只要修改目标路径和存放链接的路径即可。  很酷吧,这样就可以实现上一篇的那么东西。来吧,看看更酷的,回到前面的通道,我们虽然没有办法直接将数据直接传递给ln,但是我们可以这样批量建立软链接: ## Create a batch of soft-link files with pipeline ls /tmp/*.log | xargs -L 1 -i sh -c "ln -s {} '/tmp/lnk_'\$(basename {})"  哇噢~ 原来通道也可以这么来做,当然,Mitchell对Linux的命令还不是很了解,但我相信肯定可以在这个基础上,再精简出更酷的代码的。 恩,看了上面两种方法,是不是瞬间觉得好有难度——恭喜,Same as me。搞这个软链接,需要这么消耗脑细胞吗。记得原来的cp好像有个参数是创建连接的,于是,翻看了cp的命令帮助,加之网络搜索大神附身,不多久,出来了cp版: ## create a batch of soft-link files with cp command. ## this command can not create soft-link file with prefix or subfix ## so...

Linux下如何用Shell脚本批量创建文件软链接

MitchellChu 2014-05-21 Unix & Linux

这篇是个人Shell脚本的初作,功能是批量创建文件的软链接。文中值得商榷之处肯定非常多,欢迎大家指点。 —— MitchellChu 最近在Linux,具体说是CentOS (v 6)下,因为自定义安装的软件太多,而自定义安装之后,由于系统的PATH中没有安装软件的路径,每次都需要将安装后的软件可执行文件在PATH里面有的bin目录下创建软链接,以此来达到直接可以调用的目的。一个文件两个文件也许还好,可有的软件需要弄出个一大堆的文件要软链接,在Shell下一个一个命令的敲,确实不是一个事情。也正因此,才有了此篇博文——Linux下用Shell脚本来批量创建文件的软链接。 要批量创建文件的软链接,自然要想想下我的shell脚本应该是能够提供什么样功能的(需求):由于初期没有什么特别要求,只要批量创建软链接即可,但创建软链接是使用ln -s target_file link_file的格式来的,所以,1. shell脚本要可以接收到这两个关键因素!2.如果仅仅是接受这两个参数,就没有批量创建软链接一说了,因此,还应该有个文件过滤器,能够将需要批量创建的文件筛选出来。 需求明确成:shell脚本能够过滤出需要创建软链接的文件,并通过ln命令在目标目录中批量创建软链接文件。 根据这个需求,捣鼓了一下,弄出了BatchLinkFilesCreater.sh: #!/bin/sh ######################## ## ARGUMENTS: ## TARGET_DIR: the directory where the link file to link. ## FILES_FILTER: this is the arguments of the ls command. ## LINK_DIR: where is the link file to save. ######################## function usagehelp() { echo -e "Usage:batchCreateLink.sh -t TARGET_DIR -f FILES-FILTER -l LINK-DIR\n\n TARGET_DIR: the directory where the link file to link\n\n FILES_FILTER: arguments of ls command, to filter the list...

SSH客户端(如PuTTY)ssh远程登录Linux非常慢的解决方法

MitchellChu 2014-05-19 Unix & Linux

每次PuTTY使用SSH登录到远程的Linux进行管理的时候,远程登录的过程都非常慢——输入完用户名之后,非要等到30秒左右才会出来输入密码的提示。在实际处理问题的时候,特别需要快速响应的时候,这种状况着实让人难以忍受。 但后来具体测试了一下,发现这又并非是每种系统的通病,出现问题的机器主要集中的CentOS上,同样的Debian系统,在远程连接的过程就是健步如飞,丝毫没有卡顿犹豫的感觉。这难道是CentOS的问题?出于好奇,查看了下两个系统在SSH时的差别。 CentOS: ssh -v ssh_test@192.168.128.137 SSH远程登录的时候显示的信息如下: OpenSSH_6.0p1 Debian-4, OpenSSL 1.0.1e 11 Feb 2013 ...Some sensitive information... debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3 debug1: match: OpenSSH_5.3 pat OpenSSH_5* debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_6.0p1 Debian-4 debug1: SSH2_MSG_KEXINIT sent debug1: SSH2_MSG_KEXINIT received debug1: kex: server->client aes128-ctr hmac-md5 none debug1: kex: client->server aes128-ctr hmac-md5 none debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP debug1: SSH2_MSG_KEX_DH_GEX_INIT sent debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY ...Some sensitive information... debug1: ssh_rsa_verify: signature correct debug1: SSH2_MSG_NEWKEYS sent debug1: expecting SSH2_MSG_NEWKEYS debug1: SSH2_MSG_NEWKEYS received debug1: Roaming not allowed by server debug1: SSH2_MSG_SERVICE_REQUEST sent debug1: SSH2_MSG_SERVICE_ACCEPT received debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password debug1: Next authentication method: gssapi-keyex debug1: No valid Key exchange context debug1: Next authentication method: gssapi-with-mic debug1: Unspecified GSS failure. Minor code...

Linux下Putty链接后Emacs黑底蓝字处理

MitchellChu 2014-05-14 其他技术 Unix & Linux

在CentOS 6下装了一个Emacs24.3,在宿主终端上显示Emacs的字体还是非常不错的,可是用Putty一连接,Emacs的字体就抽风,里面的链接变成了黑底蓝字——作死的节奏啊这是!在屏幕上只能看到蓝色的一小团,贴近了看才能看清楚字的内容。后来,一查才发现,原来是终端连接上没有开启xterm-256色。 查看设置: tput colors ## 如果是显示8,恭喜,xterm终端默认还是8色 echo $TERM ## 查看终端类型,CentOS下默认好像是xterm  如果你也是上面显示的这个数值,那说明同样没有开启对终端的256色的支持。 开启Putty终端256色的支持要做2件事情: 1. Putty客户端工具里面要开启对Xterm-256colors的支持 Putty设置: Putty->Change Settings...->Window->Colors->(勾选)Allow terminal to use xterm 256-colors mode->Apply 2. CentOS(Linux)上开启Xterm-256colors。  开启Xterm-256color有两种方式,其一是修改连接用户的.bashrc文件;其二是修改.Xresources文件。如果是使用CentOS的命令行模式(没有安装XWindow)的话,.Xresources文件可能不存在,此时可以用第一种方式实现。 修改~/.bashrc: ## 务必注意,修改的是使用PuTTY连接到Linux的用户目录下的.bashrc vi ~/.bashrc ## 打开用户的.bashrc文件 ## 在末尾附加下面代码 if [ "$TERM" == "xterm" ]; then export TERM=xterm-256color fi ## 保存~/.bashrc文件 修改~/.Xresources: ##在~/.Xresources文件中添加下面这句 xterm*termName:xterm-256color ##保存~/.Xresources文件 修改完成后,记得重新登录下,以便让修改后的xterm配置生效。生效后,再次输入开篇的命令,你可以看到结果的不同: tput colors ## 这个时候返回的应该是256 echo $TERM ## 此时返回的应该是xterm-256color 此时,在开启Emacs,就会发现,可恶的黑底蓝字终于得到了拯救。 其实你也可以在修改前后对比下Emacs内输入M-x list-colors-display(看不明白?可参看Emacs快捷键对照说明),看看前后的效果。——应该明显不同哦(8个颜色和256个颜色) TIPS: 1. 如果上述修改后,没有得到正确的结果,说明你可能需要安装ncurses-term包来提供xterm-256color类型支持。里面有许多附加的终端类型定义。 2. 这种方法只能让PuTTY支持256色,如果你的Emacs还是显示的不符合你胃口,那么你就要考虑换配色方案了,而不是在这里寻找原因。 ##在Emacs里面的minibuffer(小缓冲区域)内输入下面的命令,你就可以看到各种Themes了 ## Mitchell觉得manoj-dark,tango-dark,tsdh-dark都还不错 M-x customize-themes RET

Emacs的常用快捷键功能对照表

MitchellChu 2014-05-12 其他技术

Emacs的功能非常多而且复杂,在Linux的shell下使用的时候,如果不能够灵活使用快捷键,很多操作不可能顺利完成,正因为这一点,本文罗列了一些在Emacs下常用的快捷键组合。这样可以让Emacs的初学者——比如MitchellChu,可以比较快速的上手Emacs。 这篇文章中的快捷键提取自Emacs的帮助文档中,因此,在不方便联网的时候,你也可以通过帮助文档来获取同样的信息。 本文中出现的键值简写说明: Ctrl,CTL,C均表示为同一个功能键(普通键盘中的CTRL键); META,EDIT,ALT,M均表示为同一个键(常用键盘中的ALT键); SHITF,S均表示同一个键(键盘中的Shift键); ESC表示键盘中的ESC键; SPC表示键盘中的Space键(键盘中最长的那根空格键); Deletespace,Backspace意为同一个键(Backspace键); RET,ENTER表示同一个键(回车)。 本文中出现的组合键说明: [C-x]类型,短横线分隔表示同时按下。表示按下CTRL键之后,在不松开CTRL的前提下,按下x键。 [C-x,o]类型,逗号分隔表示依次按下。按下CTRL键后,再按下x键(同上),之后松开所有键,再按o键; 快捷键类型说明: C-x是字符扩展:C-x之后输入一个另一个字符或者组合键,来达到执行新的命令的目的。 如:C-x,C-c,这个就是接组合键的扩展,作用是退出Emacs M-x是命令名扩展:M-x之后输入的是一个命令名称。 如:M-x customize-variable 则属于命令扩展, M-x replace-string 也属于命令扩展  Emacs常用快捷键对照表 快捷键 快捷键备注 ...

Linux下修改命令行终端显示的分辨率(tty)

MitchellChu 2014-05-11 Unix & Linux

以前写过一个Ubuntu下设置自定义桌面的分辨率的文章,使用的是xrandr和cvt,这次碰到的是要在Linux(CentOS)下调整命令行终端的显示。在VMWare中CentOS的命令行终端(tty)默认是很小的(80x25),在偌大的显示屏(1920X1080)中显示出来就中间一小块。所以要解决的问题就是想办法将屏幕展开。 毫不犹豫的使用老方法——尝试xrandr命令,遗憾的是CentOS(6.4)默认是没有的——没有X窗口系统嘛,就连cvt这个命令也没有踪影。 一招不行,再祭一招,修改grub.conf文件!通过修改grub.conf文件中kernel行——在最后加上vga参数,让系统在启动的时候能够自动加载适用的分辨率,如下面这样: # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/mapper/vg_mitchell-lv_root # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-431.5.1.el6.i686) root (hd0,0) ...

终端上常用的及一些高级Shell命令汇总

MitchellChu 2014-05-09 Unix & Linux

在Linux下不像Windows下这样是鼠标的天下,Linux主要的使用键盘啊亲,Shell命令的重要性自然不言而喻,然而Linux系统那么多的Shell命令,有些让人应接不暇,这种情况下,就只能记住一些常用的,有用的命令了 —— 本文记录就是这样一些Shell命令。 System运行中的kernel和system信息 uname -a ## 获取kernel版本(和BSD版本) lsb_release -a ## 打印本系统发行版的所有信息,比如发行版的ID,描述信息,具体版本,代号。LSB (Linux Standard Base) cat /etc/debian_version ## 获取Debian 版本,Ubuntu:/etc/DISTR-release, DISTR= lsb。通用/etc/issue。 uptime ## 显示系统已经运行(加载)的时间 hostname ## 系统的主机名 hostname -i ## 显示本地主机的IP地址 man hier ## 描述文件系统的层次结构 last reboot ## 显示系统重启的历史记录 硬件信息Kernel检测到的硬件 dmesg ##检测到的硬件和启动信息 lsdev ## 已经安装的硬件信息 dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8 ## 读取 BIOS cat /proc/cpuinfo ## CPU model cat /proc/meminfo ## 硬件中内存的信息 grep MemTotal /proc/meminfo ## 显示系统的物理内存 watch -n1 'cat /proc/interrupts' ## 连续动态监测中断状态 free -m ## 已经使用和空闲内存(m=MB) cat /proc/devices ## 已配置的设备 lspci -tv ## PCI设备 lsusb -tv ## USB设备 lshal ## 显示所有设备的属性清单 dmidecode ## DMI/SMBIOS: 来自BIOS的硬件信息 Load, statistics 和 messages下面的命令在找出运行于系统上的程序信息非常有用. top ## 动态显示cpu进程信息 mpstat 1 ## 进程的相关统计信息 vmstat 2 ## 虚拟内存统计信息 iostat 2 ## I/O统计信息 (2s间隔) systat -vmstat 1 ## BSD系统统计汇总 (1s) systat -tcp...

Linux(CentOS)下编译安装Nginx及配置多网站

MitchellChu 2014-05-01 Unix & Linux

Linux下编译安装Nginx,比起其他程序来说相对简单些。以下是个人编译的一些记录。 从源代码编译安装Nginx,Mitchell添加了pcre和zlib两个参数,因此需要到官方网站上下载可用版本的源代码,由Nginx编译的时候,一并完成编译。 注意:要让配置文件中的location支持正则表达式或者要启用ngx_http_rewrite_module的时候,就需要使用PCRE。而要让Nginx能够启用gzip选项,就必须添加zlib。版本选择Nginx支持的最新版本即可。 $ ./configure \ --prefix=/usr/local/nginx-1.6.0 \ --pid-path=/usr/local/nginx-1.6.0/run \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-pcre=../pcre/pcre-8.3.2 \ --with-zlib=../zlib/zlib-1.2.7 && make 在configure的参数中我们依次定义了安装路径,pid路径,运行Nginx的用户名,用户组名称,启用SSL,使用PCRE,Zlib。 如果./configure没有问题,那么接下来系统就会直接make。如果系统make之后也没有错误,就可以切换到root帐户下,将编译好的Nginx安装。 ## 注意:安装必须要切到root帐户下面. # make install 安装完毕之后,由于Nginx已经有一份默认配置文件,这让我们可以直接先启动Nginx,确认Nginx已经成功安装。如果能够正常启动,我们就可以通过宿主的80端口(HTTP)访问到Nginx的欢迎页面了。 ## 启动Nginx # /usr/local/nginx-1.6.0/sbin/nginx 正常的情况下,此时Nginx是处于工作状态,并且界面没有任何回显。 需要注意: 1. 如果你没有创建./configure参数中的用户组和用户,是无法正常启动的; 2. 请在root下启动Nginx 3. Nginx宿主机的80端口需要确保没有被其他程序占用(如:Apache) 确认能正常启动后,我们可以在/usr/local/bin下创建一个软链接到nginx执行文件上,这样就不用每次都输入一长串的路径了。 # ln -fs /usr/local/bin/nginx /usr/local/nginx-1.6.0/sbin/nginx 创建Nginx软链完成后,我们尝试下关闭Nginx: #nginx -s quit Nginx配合-s参数,可以有如下指令: stop —— 快速关闭; quit —— 退出(关闭),这个会等待Nginx处理完当前请求; reload —— 重新加载配置文件; reopen —— 重新打开日志文件。 在Nginx成功编译安装之后,我们更进一步的可以配置下Nginx的配置文件,默认的配置文件在安装目录下的conf/nginx.conf(添加中文注释): #user nobody; #设置工作进程数 worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { #并发连接数,可以启用epoll worker_connections 1024; } http { include mime.types; ...

Linux普通用户无法使用sudo处理及sudoers设置

MitchellChu 2014-04-29 Unix & Linux

Linux下我们经常使用的SSH远程连接到系统进行操作,而为了安全,一般使用的是非root用户连接,只有在必要的时候,我们才会使用sudo切换到root帐户下进行操作,以保证系统尽可能的安全和不被损坏。然而,在有的时候我们通过普通用户SSH连接到Linux的时候,使用sudo来执行身份切换的时候,系统会报错(以下是CentOS6.4下的报错): 对不起,用户 yourusername 不能在 CentOS 上运行 sudo。 ## 如果直接运行命令sudo command,则是如下错误 yourusername 不在 sudoers 文件中。此事将被报告。 或者 Sorry,user yourusername may not run sudo on CentOS 或者(直接sudo+命令): yourusername is not in the sudoers file. This incident will be reported. 这种情况下,为了让我们的用户能够正常的使用sudo,需要通过修改/etc/sudoers文件。 #添加下面一行到:/etc/sudoers,即可让该用户使用sudo yourusername ALL=(ALL) ALL 这种修改是将所有的权限都赋值给了yourusername,为了sudo这个命令,就这么ALL几下,似乎有点不负责任啊,有木有? sudoers文件默认是只读的,因此不能直接修改。网上很多方法是使用chmod来修改sudoers的权限后再通过编辑器(vi/vim etc.)来修改sudoers内容,之后再将sudoers文件的权限恢复,来达到修改sudoers的目的。这种方法确实能够修改sudoers,但是却没有办法保证sudoers文件的正确性,如果修改出现错误,将导致sudoers(sudo)不能正常的工作。更正确的做法是直接使用sudoers的专用编辑器:visudo来编辑sudoers文件。 # visudo ## visudo默认的编辑器是vi,如果你需要修改你的默认编辑器,可以通过添加EDITOR="" 来修改。 # EDITOR="/usr/bin/vim -p -X" visudo ## 如果要永久改变默认编辑器,只要将EDITOR设置为环境变量 # export EDITOR="/usr/bin/vim -p -X"  使用visudo来编辑sudoers的好处是:当我们完成sudoers的编辑时,系统会自动检测我们sudoers的格式是否正确,从而保证sudoers文件的正确性。  其实,sudoers文件是非常简单的,其内容只包含两种,第一种是别名(Aliases,基本变量定义),第二种是用户规范描述(user specifications,指定某用户可以运行的内容)。而这两种内容都是通过扩展巴科斯范式(EBNF)1来进行定义。一旦定义了别名,在用户说明中,就可以使用别名来简化给用户定义运行内容。如果同一个用户在sudoers文件中能够找到多条说明,那么将使用找到的最后一条。 sudoers的别名包含四种:User_Alias,Runas_Alias,Host_Alias和Cmnd_Alias。 User_Alias是用户别名,这个和系统中的group有点类似。通过用户别名,在sudoers中,可以将一个或者多个用户用别名来替代。 ## 定义一个用户别名 User_Alias OPERATORS = operator1,operator2,remote_admin 注意: 1. 等号后面的都是系统中的用户名,用户ID,组,组id等组成,多个用逗号分隔,具体信息可参看文后参考内容sudoers2 2. 别名只能是大写字母开头的,并由大写字母,下划线和数字组成的字符串 Runas_Alias和User_Alias类似,但不同的是Runas_Alias指明的是用户将要运行命令的身份。Runas_Alias可以包含Runas_Alias别名(User_Alias是包含User_Alias别名)。 同时要注意的是,上面两个别名在匹配的时候使用的是字符串匹配法则,也就是说,当两个不同用户名的用户,即使使用了同一个用户ID,在实际情况下,也会被认为是不同的。要避免这种情况,可以考虑使用用户的ID来替代用户名。如: Runas_Alias ROOT = #0 ## 所有的用户ID为0的,统归为ROOT别名 Host_Alias是主机别名,指定规则适用的主机列表。 Host_Alias SERVERS = 192.168.0.1, 192.168.0.2, server1 注意: 1. Host_Alias中,只能使用真实的地址,这就意味着127.0.0.1这种地址是永远不会被匹配到的。而localhost要只有在真有主机的主机名为localhost的时候才能被匹配。 2. 如果IP地址没有给定掩码,sudo自动会搜寻本地网卡上对应匹配的掩码地址来作为默认的网络掩码。 Cmnd_Alias是命令别名,指定用户能够运行的某一类命令的列表。可包含一个,或多个命令(带参数),目录,或者其他的命令别名。 Cmnd_Alias SHUTDOWN_CMDS = /sbin/poweroff, /sbin/reboot, /sbin/halt ##所有的关机命令 Cmnd_Alias ADMIN_CMDS = /usr/sbin/passwd, /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/sbin/visudo ## 所有的用户管理命令 注意: 1. 命令列表中如果包含目录(以/结束),那么该目录下(不含子目录)的所有可执行文件都被赋予了执行权限,这和使用通配符*类似; 2. 命令列表中务必使用全路径名,如果不使用完全限定名,将意味着恶意用户可以创建同名文件并在切换后的用户下运行,这将给系统带来未知的安全风险; 3. 当命令列表中的命令需要带参数的时候,如果出现特殊字符(',',':','=','\'),将需要使用反斜杆('\')进行转义。 通过上面四种别名,我们能够定义出特定的用户,主机和命令列表,在实际运行中,我们如果要对这些特定的列表的某些运行时配置项3进行修改,我们可以通过Default来完成。 Default对于前面四种别名的限制格式各有不同,定义如下: ## EBNF Default_Entry ::= ('Defaults' |'Default' '@' Host_List |'Default' ':' User_List | 'Default' '!' Cmnd_List | 'Default' '>' Runas_List ) Parameter_List Parameter_List ::= (Parameter...

CentOS(Linux)下编译安装Redis注意事项

MitchellChu 2014-04-28 Unix & Linux

在CentOS(Linux)下编译安装Redis(V2.8.7)之后,总结的注意事项如下: 下载安装Redis: $ wget http://download.redis.io/releases/redis-2.8.7.tar.gz $ tar xzf redis-2.8.7.tar.gz $ cd redis-2.8.7 $ make TIPS: 可先到官网下载Redis文件,同时可以查看官网的编译安装方法(传送门)。 在Redis根目录下,直接make make成功后,如果需要make test,则需要配置TCL8.5/TCL8.6来进行测试 TCL8.6非默认安装的时候(CentOS版本偏低),一定要在PATH的路径中创建文件连接到tclsh8.6,同时注意,文件名称必须是tclsh8.5/tclsh8.6,因为在make test的时候,会使用which查找8.5或者8.6版本的tcl 安装:直接make install,默认安装在/usr/local/bin下,如果需要设置自定义路径,用make PREFIX=/usr/local/redis install来安装 安装后,默认是没有配置文件的,需要配置的话,在安装成功后可以使用utils里面的install_server.sh来配置服务器.    install_server.sh里面有很多bug,如果不修改你将会发现/etc/init.d/redis_***是无法正常使用的——里面的配置文件有很多\n,未被转义.      line 163,177: if [ !`which chkconfig` ]; then 中 !应该和`which chkconfig`之间有个空格没有出现      line 165: echo 之后应该需要一个-e参数,表示允许使用转义字符. 配置: 为了防止内存爆满导致系统崩溃,需要设置/etc/redis/*.cnf中的maxmemory 防止报错,可以调整内存分配策略 /etc/sysctl.conf 这个是Redis日志中可以看到的建议: 添加vm.overcommit_memory=1保存,并执行:sysctl vm.overcommit_memory=1使之生效 /proc/sys/vm/overcommit_memory,这个里面就是overcommit_memory值,这个可以被上面的设置更新. ...

CentOS下编译安装MySQL5.6.16备忘

MitchellChu 2014-04-28 Unix & Linux

在CentOS6.4下编译MySQL5.6.16版本,直接编译MySQL源代码会出现一些问题,因此在这里备忘一下编译方法及修改事项。MySQL的编译过程如下: $ sed -i "/ADD_SUBDIRECTORY(sql\/share)/d" CMakeLists.txt && $ sed -i "s/ADD_SUBDIRECTORY(libmysql)/&\\nADD_SUBDIRECTORY(sql\/share)/" CMakeLists.txt && $ sed -i "s@data/test@\${INSTALL_MYSQLSHAREDIR}@g" sql/CMakeLists.txt && $ sed -i "s@data/mysql@\${INSTALL_MYSQLTESTDIR}@g" sql/CMakeLists.txt && $ sed -i "s/srv_buf_size/srv_sort_buf_size/" storage/innobase/row/row0log.cc && $ mkdir build && $ cd build && $ cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6.16 \ -DINSTALL_MYSQLDATADIR=/srv/mysql ...

CentOS/Linux下软件的编译安装介绍及注意事项

MitchellChu 2014-04-26 Unix & Linux

CentOS作为服务器,要求软件的稳定性比较高,因此发布的软件一般都比较老,然而,有的时候我们需要某些软件新的功能,这种时候如果没有可用的安装包,就需要使用软件提供的源代码,在CentOS下进行编译安装。编译安装顾名思义就是需要先进行对软件的源代码进行编译,然后安装编译之后的软件文件。在CentOS/Linux下编译软件的源代码,一般会涉及编译器,关联库等。 编译器: 在CentOS下开发软件的语言种类繁多,需要根据需要编译的软件的源代码选择对应的编译器。在CentOS下,最常用的有两种:C语言的可以使用gcc,C++可以使用g++。GCC(GNU Compiler Collection,GNU编译器套件)已经扩展成可以处理C,C++,Ada,Java,Objective-C,Object-C++,Go,Fortran的编译器。也就是说,一般情况下,在拥有gcc编译器的前提下,CentOS下你已经可以编译大部分应用程序。如果你仅仅需要编译程序,通过yum install 来安装gcc和g++吧。—— 当然,一般仅有这两个编译器是远远不够的。 关联库: 前面说了,有了对应的编译器,理论上是可以完成对软件的编译。然而,在CentOS/Linux下,大部分的软件都有对其他库的依赖,这就需要在编译的时候,将关联的库包含进来,才能顺利的完成软件的编译。哪怕是同一个库,在不同的软件编译中,可能依赖的版本也会有所不同,因此,在实际编译的过程需要谨慎选择依赖库的版本。关联库可以通过编译器的参数来进行设置。 编译工具: 关联的库可以通过编译器来进行添加,但这种方法一旦在软件依赖比较多;需要根据系统环境进行参数筛选依赖库的时候,编译者为了要顺利在某一个特定的Linux发行版本下编译成功软件,就需要对该软件在当前Linux版本下的相关信息了解清楚。在繁多的软件编译安装列表中,要对每一个软件在每一个版本的Linux/CentOS下的安装信息都掌握,对编译者的要求就非常高了,无形之中会加重软件的编译安装成本,为了应对这种情况,Linux下提供了configure,make,CMake,automake等,这可以让软件的发布者提前将特定版本下编译的信息通过配置文件的形式提前固定下来。编译的时候,直接读取配置文件中的信息,找到对应的配置项,进行配置校验即可。要了解更多可以了解下MakeFile的相关信息。 系统编译相关: 1. 在CentOS中,如果要进行对软件的编译安装,我们一般需要安装:Development Tools yum groupinstall "Development Tools" 如果你编译安装的软件需要图形界面的话,你可能还需要安装X Software Development yum groupinstall "X Software Development" 要是你编译安装的软件比较旧,那可能就还需要Legacy Software Development了 yum groupinstall "Legacy Software Development" 可以根据自己的实际情况对上面的开发环境进行配置,Mitchell一般在CentOS上只编译最新的,无图形界面的软件,这种情况下,Development Tools对我来说已经就足够了。 如果没有安装Development Tools,而只安装gcc,g++这类的编译器,在实际编译的时候,你将会发现编译工作进展是痛苦无比的,这是因为,你只安装了特定的编译器,而关联的库文件缺失。在编译自己的小程序也许没有问题,但涉及到库关联的时候,问题就来了。 2. 关于系统时间,开始Mitchell本人一直觉得,系统时间和编译是半毛钱没有的事情,然而在一次编译的过程中发现(特别是在使用虚拟机的时候,时间观念淡薄啊),./configure出来的makefile,一直会报错: MakeFile is too old.  这个时候,不要吝惜那分分钟的时间,赶紧先把系统时间修改成正确的时间吧(时区)。 更新系统时间: date 'current-date' 更新硬件时间: #使用hwclock hwclock -w #使用clock clock -w 3. 安装路径,一般使用--prefix来进行设置,这样便于将来维护。    Linux现在还是菜鸟一枚,暂时只想到这么些,如果还有更多或不对的地方,欢迎指正补充。

Linux下常用压缩及解压命令

MitchellChu 2014-04-03 Unix & Linux

在Linux下,压缩和解压相比较Windows而言,琳琅满目的各种压缩包是一种莫名的负担,很多时候,根本就不知道该如何下手,经过无数次的折磨之后,通过伟大的互联网整理出了下面这份常用压缩包的后缀名的解压缩和压缩方法以及可能涉及到的相关程序.虽然不一定完全正确,且用且更新罢! 文件后缀 解压/解包 压缩/打包 备注 *.tar ...

Linux下chkconfig命令的作用

MitchellChu 2014-04-03 Unix & Linux

chkconfig在Linux下是管理服务/启动项在各个系统运行级别中的设置,在Linux中系统有7个运行级别,分别是: 运行级别0:表示关机 运行级别1:表示单用户模式 运行级别2:无网络连接的多用户命令行模式 运行级别3:有网络连接的多用户命令行模式 运行级别4:暂不可用 运行级别5:带图形界面的联网多用户模式 运行级别6:重新启动 chkconfig能够管理全部云心级别,但是默认情况下,只对级别2,3,4,5这4个级别进行操作。如果要操作其他级别的,需要带上--level参数。chkconfig一般常用的组合如下: 用法: chkconfig [--list] [--type <type>] [name] chkconfig --add <name> chkconfig --del <name> chkconfig --override <name> chkconfig [--level <levels>] [--type <type>] <name> <on|off|reset|resetpriorities> #列出系统所有的服务设置详情 #注意:如果是手动设置的不能显示 chkconfig --list #列出某个服务在各个级别中的启动设置项 # servicename可以是:mysqld,vsftpd等 chkconfig --list servicename #设置某个服务在某些级别的启动设置 #这里以vsftpd为例,设置在2,3运行级别下启动 chkconfig --level 2,3 vsftpd on #增加服务 #假设要增加的名称为:serv-name chkconfig --add serv-name #在上面添加后,你就可以使用前面的方法来设置serv-name的在各个运行级别的启动 #如果是手动配置的时候,会配置/etc/rc.d/rc*.d中K/S项 #rc*为各个级别名称,但手动配置的,使用chkconfig是无法管理的. #删除服务 chkconfig --del serv-name  

Linux下校验下载文件的完整性(MD5,SHA1,PGP)

MitchellChu 2014-03-29 Unix & Linux

Linux下的学习开始总是艰难的,但有的时候,却发现Linux下远比Windows的操作来的实在的多——这下载文件的完整性就是其中一件,让本人觉着很爽的一件事情。在编译安装各种软件的时候,总要到各个网站上收集下软件源码包。正由于此,软件的入口就非常复杂,校验下载的文件是否被修改过就显得非常有必要了。而校验方法当前一般是MD5,SHA1,PGP三种。在Windows那个漫长的岁月里(沧桑有木有),一般只能接触到前两种——前提是你会去校验的话。 MD5校验 原理:对文件进行MD5 Hash,求出文件的MD5哈希值,通过下载后文件MD5哈希值和发布者提供的MD5哈希值是否一致来判断文件是否在发布者发布之后被篡改过。 说明:寿命老长的一个Hash算法,适用范围广,网站存储密码也经常使用。不同的文件产生的MD5哈希值是唯一的,但这点已经有办法通过对文件进行少量的修改,让文件的MD5后的哈希值保持一致。 使用:在CentOS下,要对文件进行MD5 Hash是很简单的,一个md5sum命令即可: # $是终端提示符,非输入. # #号是注释 # 没有提示符的是输出 #直接输出MD5 Hash $ md5sum your-downloaded-file-name fd4a1b802373c57c10c926eb7ac823d8 your-downloaded-file-name #将MD5 Hash值保存到md5-hash.txt文件中. $ md5sum your-downloaded-file-name > md5-hash.txt # 显示输出的md5-hast.txt内容 $ cat md5-hash.txt fd4a1b802373c57c10c926eb7ac823d8 your-downloaded-file-name # 通过md5-hash.txt来校验你下载的文件是否正确 $ md5sum -c md5-hash.txt your-downloaded-file-name: OK 你是文件的发布者话,你可以通过md5sum把文件的哈希值发送给验证者,这样下载你文件的人就可以通过MD5哈希值来验证你的文件正确性。反过来,我们在网站上下载文件之后,同时可以获取发布者的MD5哈希值和本地生成的Hash值对比,如果一致,认为文件是正确的。   SHA1校验 原理: 原理同MD5一样,都是通过对文件进行HASH求值,比对文件发布者发布的HASH值,通过是否相等判断文件是否被篡改 说明: SHA1 HASH求值方法可以说是MD5的一个升级版本(SHA1 20位,MD5 16位),在HASH求值方面,MD5退出的舞台将有SHA1占据。SHA家族有五个算法:SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,后四种有时候称为SHA2 使用: CentOS有SHA1的命令:sha1sum # 说明同上 # 直接输出SHA1 Hash $ sha1sum your-downloaded-file-name 12dc96cbd822598c1230c87622f3591461a77227 your-downloaded-file-name # 将SHA1 Hash值保存到文件中 $ sha1sum your-downloaded-file-name > sha1-hash.txt # 显示文件内容 $ cat sha1-hash.txt 12dc96cbd822598c1230c87622f3591461a77227 your-downloaded-file-name #通过sha1-hash.txt来校验我们下载的文件your-downloaded-file-name # 注意,文件必须要要通过txt文件中的路径知道哦 $ sha1sum -c sha1-hash.txt your-downloaded-file-name: OK  这个SHA1和MD5基本一致,需要补充说明下的是,在使用md5sum也好,还是sha1sum也罢,校验文件的时候,务必要让系统能够根据文件中提供的路径找到文件,如果文件找不到,是没有办法进行校验的。 如果是做多个文件的Hash校验,可以通过一个文件保存多个文件的Hash值即可。   PGP校验 原理:使用非对称加密,程序生成唯一的密钥对(公钥和私钥:Public Key和Private Key/Secret Key)。操作方法如下: 发布者通过用生成的密钥对中的私钥对要发布的文件进行签名,得到签名文件(sign); 发布者将密钥对中的公钥发布到公钥服务器; 发布者将文件和用私钥生成的签名一起发布; 验证者下载发布者发布的文件和签名; 使用PGP的程序获取的发布者第二步发布的公钥; 使用公钥校验文件签名 说明:签名算法中,密钥的用处分别是:公钥用于加密信息和验证,私钥用于解密和签名。私钥掌握在信息发布方,公钥可以任意分发。信息发布方用密钥进行对信息进行签名,接收方在获取公钥后,可以用公钥对发布方发布的信息+签名进行验证。如果验证失败则认为信息被篡改。在网络中,我们经常碰到的HTTPS协议,使用了同样的机制。 使用:由于PGP是商业应用程序,在CentOS/Linux中,具有同类功能的是GPG(也就是:GnuPG),同样遵守OpenPGP数据加密标准(RFC 4880),没有安装可以用yum install gnupg安装,命令是:gpg # 说明同上 # 由于过程相对复杂,并且在实际使用中,校验用的比较多,因此这里只介绍文件的校验过程。 # 在获得文件和签名时,我们先用gpg校验签名,此时文件必须存在 $ gpg --verify downloaded-file-sign.asc  这里有多种情况,如果你只有签名,但生成签名的文件不存在时(系统没找到,一般应该放在同目录下面),返回的是: gpg: 不含签名的数据 gpg: can't hash datafile: No data 当你有文件的时候,但还没有与签名对应的公钥时,gpg返回的信息类似下面: gpg: 于 2013年05月06日 星期一...

CentOS网络配置后不能访问外网

MitchellChu 2014-03-18 Unix & Linux

今天在按照Mitchell博客之前的CentOS网络配置的文章配置Linux网卡之后,发现竟然ping不通外网,但是内网ping却是正常的。一直很纳闷,在网上搜索很久也没有得到答案。关于CentOS网络的具体配置项,可以参考Mitchell博客之前的那篇文章。 现象: ping内网正常 ping外网IP,域名均无法正常,返回错误:connect: Network is unreachable   后面在无意中看到Linux网络配置有添加网关的命令: route add default gw 192.168.128.2 dev eth0 按上面操作,添加了默认的网关之后。再次访问外网一切正常。 有这个现象来看,应该是配置文件中没有配置网关,但是经过确认/etc/sysconfig/network 中是配置了GATEWAY地址的,而且GATEWAY的地址也是正确的,在多次重启network之后,只要不手动添加网关,就不能访问外网。 多次仔细确认各个网络配置文件之后,发现在网卡配置文件中(ifcfg-eth0)有一个NETWORK配置项,对于这个配置项,本身作用不是很清楚,因此到官网查看了一下说明: NETWORK=<address> where <address> is the network address. This directive is deprecated, as the value is calculated automatically with ifcalc. 这节奏是告诉我们这个参数不要设置嘛(deprecate),这个值将会由ifcalc自动计算。既然不用设置,自然去掉。 去掉之后,重启network服务之后,外网竟然神奇的能够访问了。使用route查看路由表,发现能够自动添加default这条信息了,原来可是一直没有的: Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.128.0 * 255.255.255.0 U 0 0 ...

Linux下的用户管理及SSH禁止用户登录和IP连接的配置

MitchellChu 2014-01-14 Unix & Linux

     MitchellChu从零开始学Linux,用户管理会在各种配置中显示其强大的作用。当我们在不太会配置Linux的时候,配置了一个运行在不同用户下的网站,另一个帐户下的数据库,当我们网站被黑之后,至少让别人在黑数据库的过程中没有那么顺当——增加被攻击的复杂度就是在增加自己站点的安全性。好吧,不得不说,我是这个思路的。那毫不犹豫的就开始了用户管理的操作。 在Linux中,用户的管理分为组和用户两种。这个Windows下也是这个样子,组是一类用户的统称。组和用户的关系是:多对多的关系。即用户可以存在于多个组中,组中也可以有多个用户。组的权限会被赋予组中的用户,用户可以从多个组中继承权限。 对于组的管理命令有: #组管理命令 groupadd #添加组 groupdel #删除用户组 groupmod #修改用户组 groups #显示当前用户所属的用户组 grpck #检查用户组及密码文件的完整性(etc/group以及/etc/gshadow文件) grpconv #通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建; grpunconv #通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件。 对于用户的管理命令有: #用户管理相关的命令 useradd #添加用户 adduser #添加用户 passwd #为用户设置密码 usermod #修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等 pwcov #同步用户从/etc/passwd 到/etc/shadow pwck #pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整; pwunconv #是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件; finger #查看用户信息工具 id #查看用户的UID、GID及所归属的用户组 chfn #更改用户信息工具 su #用户切换工具 sudo #sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现 visudo #visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的 sudoedit #和sudo 功能差不多 这些命令可以完成绝大部分的用户和组的管理操作,下面的代码中,就完成了添加组和用户的功能,如果还有不能达到的地方——使用强大的文本编辑吧,各种用户和组的文件等待你去发掘(后面就有要修改文件的case)。 #如果你不想使用现有用户组,那么你可以新建一个用户组 groupadd GROUPNAME #GROUPNAME是新用户组的名称。这里使用的GID是默认的 #添加了用户组之后,我们可以将用户添加到用户组中。 useradd username -G GROUPNAME #添加用户username到GROUPNAME中,注意没有添加密码 #修改用户密码 passwd username #设置用户密码 #其他各种操作... 在Linux下,root是个非常特别的帐户,而且权限非常大,对于生产环境中,root的帐户保护就非常重要,其中一点就是远程SSH连接的时候,我们最好能够将root的远程连接功能关闭。这个就需要修改配置文件来进行了。在/etc/ssh下面有个sshd_config文件,这个文件中,会有一个PermitRootLogin 配置,默认是被#注释掉的,要禁止SSH登录,就需要将这个注释去掉,并且将值改成no(默认值是yes)。 #修改/etc/ssh/sshd_config文件内容 vi /etc/ssh/sshd_config #找到内容 #PermitRootLogin yes这行,修改成下面这行 PermitRootLogin no #保存内容,并退出 #重启sshd服务 service sshd restart 此时我们关闭putty之后,再重新连接之后,输入root,并提供密码之后,远程的返回将会是:Access denied。这就禁止了root帐户的SSH连接。如果在SSH时,需要使用root帐户的执行权限执行命令,只需要用su/sudo来做即可。 对于一般用户,网上找到的禁用的方式有很多,至于那种处理方式会比较优就看个人爱好了,这里列出其中的一部分: #直接禁用用户,让用户不能登录,方法有以下这些: #1.修改/etc/shadow的第二列内容为*,这种方式是让用户不能登陆系统 username:*:15864:0:99999:7::: #这种方式处理的用户不能再登录系统,同时该用户的密码也丢失了,如果要再次登录时,需要重新设置密码 #2.类似第一种,这种方式是直接修改/etc/passwd中的用户路径那一行的最后一列,将/bin/bash改成/sbin/nologin username:x:501:500::/home/username:/sbin/nologin #这种方式修改之后,用户同样不能登录,效果和上面类似,但是如果恢复/bin/bash之后,用户可以直接输入密码登录。 #3.当然,不想修改文件,直接使用usermod也是可以的 usermod -L username ##锁定username这个账户 #这种方式如果要解锁的时候,使用usermod -U username 即可。不用再修改文件了 #4.修改shell类型,可以禁止用户,还能让用户知道原因 chsh username -s /sbin/nologin #修改username的shell #修改 /etc/nologin.txt(如果没有,可创建) #在文件中添加被禁止的原因。 #这个方法和第二种效果差不多,不过这个方法可以让用户知道自己不能登录的原因 #5.禁止多用户登录 #首先需要在/etc下建立nologin文档 touch /etc/nologin ##文件存在之后,除了root之外的所有用户都无法登陆,这个文件可以写上禁止登陆的原因,以便用户无法登录时看到原因 ## 如果不要禁止所有用户,只需要将/etc/nologin文件删除即可。 #6.修改/etc/ssh/sshd_config文件,修改AllowUsers的值 #在文件中查找AllowUsers,如果没有,在文件末尾加上即可。 AllowUsers username root #仅允许username,root通过SSH登录 #修改文件保存之后,需要重启sshd服务 #如果要显示提示信息,可以修改/etc/issue.net,在文件中添加信息。同时修改sshd_config文件中加入Banner参数 Banner /etc/issue.net #这个Banner是提示在用户登录之前。 #如果要输入密码之后提示,可以将提示信息放入/etc/motd中 ################################################# #来自网上关于motd和issue.net(issue的网络版)的区别: #/etc/motd,即messageoftoday,每次用户登录时,/etc/motd文件的内容会显示在用户的终端。系统管理员可以在文件中编辑系统活动消息,如:管理员通知用户系统何时进行软件或硬件的升级、何时进行系统维护等。/etc/motd在用户进入的是图形界面时,可能看不到提示。 #/etc/issue.net与/etc/motd文件类似,区别在于:当一个网络用户登录系统时,/etc/issue.net的文件内容显示在login提示符之前,而/etc/motd内容显示在用户成功登录系统之后。 #7. 还有一种方法是修改/etc/pam.d/sshd文件 #在文件的第一行添加: auth required ...

Windows和Linux下的关机重启命令

MitchellChu 2013-06-02 其他技术 Unix & Linux

  MitchellChu从零开始学Linux,开始学Linux的时候,最基本的还是要学会怎么开机关机啊,要是关机/重启这种基本命令都不会,说出去也没有人相信我学习过Linux的呀。   在Linux下面,关机和重启的命令非常多,不像Windows,要学重启关机的命令,一个shutdown就全部搞定,当然,Windows下有shutdown,那Linux下是不是也有shutdown?——所以,非常自然的我学到的第一个命令是shutdown了。    Windows下shutdown还是相当的简单的: REM 重启使用/r或-r参数 REM /t或-t指示多少时间之后执行(单位:s) REM 如:/t xxx 指示xxx秒后执行 REM 如果不指定/t参数,则系统默认在60s后执行操作 REM 下面是在5s后重启系统 shutdown /r /t 5 REM 关机使用/s 或-s参数 REM 同样可以使用/t或-t参数 REM 下面指令是在5s之后关闭当前系统 shutdown -s -t 5 REM 要取消当前的shutdown指定的操作可以使用/a 或-a参数 REM 下面指令执行取消当前所有的shutdown 操作 shutdown -a   在Windows下,你有这个命令,重启关机不求人,如果是服务器版本的话,可能会需要更多的参数,具体的可参见官方文档或在cmd下查看帮助。   Linux下的关机重启命令比Windows下的多的多了,而且因为在Linux下更多的是使用文本界面(终端界面),因此,命令要比Windows更深入了解才行。首先对应的是Linux下的shutdown命令。先看看关机重启命令在Linux下怎么写的: #shutdown 和Windows下的这个命令非常类似,因此也就比较类比学习了 #Linux下的shutdown命令格式: #shutdown [OPTION]... TIME [MESSAGE] #重启使用-r参数 #如果不给定TIME,shutdown无法执行 #TIME使用的是分钟,而Windows使用的是秒钟,这是个区别 shutdown -r 10 #系统在10分钟之后重启 #关机使用-P参数 #-P参数是关机&关闭电源 #这个和Windows下的shutdown -s类似 shutdown -P now #立即关机并切断电源 #如果只是关闭CPU,而不关闭电源,就是用-H参数 shutdown -H 1 System is going down in 1 minute! save your works Pls. #1分钟后关闭系统CPU #The system...之后的是Message信息,会发送到各个登录的用户界面中提醒用户注意保存工作 #取消shutdown命令 shutdown -c #取消shutdown的操作 当然,如果是在当前的文本模式窗口输入的命令,因为shutdown是前台执行,如果要取消,也可以直接Ctrl + C,终止命令的执行。 在知道shutdown的基本用法之后,我们来看看它的所有参数 shutdown shutdown命令的工作实质是给init程序发送信号(signal),要求其切换系统的运行级别(Runlevel)。系统的运行级别包括: 0:关闭系统 1:单用户模式,如果没有为shutdown命令指定-h或-r参数而直接执行,则默认将切换到此运行级别 2:多用户模式(不支持NFS) 3:多用户模式(支持NFS),一般常用此种运行级别 5:多用户模式(GUI模式) 6:重新启动系统 shutdown -参数 时间 讯息 -k:并非真正关机,只是送出讯息 -r:关机后重新开机 -h:关机后不重新开机 -f:快速关机 -n:快速关机,不要经过init的程序 -c:取消关时的程序 -t:在警告讯息和删除信号间做停留 时间可用now或任意数字 (代表分钟) 注意:这里是网上找到的比较老的一些参数。  但是我当前CentOS的版本为6.4,参数有所不同:   reboot 快速重启,类似于Ctrl + ALT +DEL 说明:若系统的 runlevel 为 0 或 6 ,则重新开机,否则以 shutdown 指令(加上 -r 参数)来取代 reboot -参数 参数: -n : 在重开机前不做将记忆体资料写回硬盘的动作 -w : 并不会真的重开机,只是把记录写到 /var/log/wtmp 档案里 -d : 不把记录写到 /var/log/wtmp 档案里(-n 这个参数包含了 -d) -f : 强迫重开机,不呼叫 shutdown 这个指令 -i : 在重开机之前先把所有网络相关的装置先停止 参数可选  CentOS 6.4中的参数 halt   说明:若系统的 runlevel 为 0...

LUbuntu下文字界面和图形界面的切换方式

MitchellChu 2013-04-02 其他技术 Unix & Linux

Lubuntu & Ubuntu下文本界面和图形界面直接的切换快捷键。

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。