Unix & Linux

个人在Linux/Unix上学习的一些笔记和积累

CentOS安装配置vsftp虚拟用户登录(Berkeley DB+PAM)

MitchellChu 2015-09-05 Unix & Linux

在使用Linux时,难免要进行各种文件的远程传输,比如:网站的代码,共享资源等,而这其中用的最多的传输方法大概就是FTP了。Linux下可用FTP服务端是非常多的,vsftp, proftp, uw-ftp等,其中vsftp流行度比较广,冲着这个,本人在自己的CentOS上也就选择了vsftp,而且,vsftp支持PAM(pluggable authentication modules)下虚拟用户设置,这正是Mitchell Chu比较喜欢的一种方式,接下来就请vsftp君上场。 Vsftp使用的用户中,支持三种用户模式,分别是:实体用户,匿名用户和虚拟用户(guest,亦称访客身份)。实体用户(Real User)是指用户本身存在于系统中的用户,他们存在于/etc/passwd和/etc/shadow文件中。匿名用户(Anonymous)是指客户端无需提供任何用户身份,ftp为访问者提供一个名为anonymous的特殊用户以供其使用。虚拟用户(Virtual User)个人理解是一种介于实体用户和匿名用户之间的用户。原因是:虚拟用户虽然在系统的实体用户文件中不存在,但是会在系统的其他地方进行记录(本文是Berkeley DB),以供vsftp用来对ftp访问者进行必要的鉴权,而鉴权完毕之后,该用户操作文件之时,将是使用vsftp的运行用户ftp进行的。由于实体用户需要的是系统真实帐户,开放这种权限无疑会增加系统的风险,而虚拟用户使用的是和实体用户不同的用户验证体系,并且,在系统中并不实际存在虚拟用户到实体用户的映射关系,因此降低了FTP给系统带来的风险性,在实际生产环境中,虚拟用户可以更加灵活的进行独立管理,比如:虚拟主机需要给用户提供FTP帐户。有这么些好处之后,让我们看看是如何配置吧。   预备式 Berkeley DB 数据库:用来存储虚拟用户的登录信息 pam_userdb.so:用来验证虚拟用户 db4_utils:用来转换虚拟用户到DB数据的工具   安装需要的包 CentOS中好像是默认自带vsftp的,因此,无需安装,如果你不确认,可以用which看下: which vsftpd # 如果安装好了的话,应该是有类似下面的输出: # /usr/sbin/vsftpd # 如果没安装,则类似下面的输出 # /usr/bin/which: no xd in (/home/limituser...  没有安装的话,请安装: yum install vsftpd # 或者: yum -y install vsftpd 当然,清空下yum的缓存亦可: pushd /etc/yum.repos.d/ rm -rf * wget http://docs.linuxtone.org/soft/lemp/CentOS-Base.repo yum clean all yum -y install vsftpd ## 这句还是重点. 为了简单,我们可以一次性安装所有需要的包: yum install db4-utils db4 vsftpd ## Mitchell Chu提醒:有的就不用再安装了,请自行增减   创建虚拟用户 虚拟用户我们使用Berkeley DB数据库来存储。第一步是创建纯文本来添加用户和密码,用户名和密码各占一行。比如我们要创建:useasp的用户名,密码是blog.useasp.net,并且创建一个admin密码是adminpasswd的用户,那么,纯文本将类似如下: pushd /etc/vsftpd cat >vusers.txt useasp blog.useasp.net admin adminpasswd 创建好vusers.txt后,我们需要的第二步是将纯文本转换为db文件,这时候需要使用到db_load了: db_load -T -t hash -f vusers.txt vsftpd-virtual-users.db 为了安全起见,记得设置仅root可读写(当前是root): chmod 600 vsftpd-virtual-users.db 再清理掉原来的纯文本文件: rm vusers.txt 此时,我们已经将需要登录FTP的用户已经准备好了,接下来就需要去配置vsftpd,让vsftpd能够正确的识别并支持已经设置好虚拟用户了。   VSFTPD虚拟用户的配置 找到vsftpd.conf配置文件,添加或修改下面这些配置选项: # 禁止匿名登录 anonymous_enable=NO anon_upload_enable=YES anon_other_write_enable=YES # 启用本地用户 local_enable=YES # 虚拟用户使用本地用户权限 virtual_use_local_privs=YES # 可写 write_enable=YES # PAM配置 pam_service_name=vsftpd # 启用虚拟用户 guest_enable=YES # 用户后缀: 配合下面local_root使用,将会用登录的用户名替换掉$USER user_sub_token=$USER # 根目录 local_root=/var/ftp/$USER # 启用chroot,登录后会被定位到指定根目录 chroot_local_user=YES # 将所有的用户和组显示为ftp hide_ids=YES vsftpd的配置文件是在/etc/vsftpd/vsftpd.conf,原有配置项可以保留默认值,如果需要日志,vsftpd有两个日志可供使用,一个是标准xferlog格式的,一个是vsftpd格式的,可读性后者更好,当然,你也可以两个日志都启用,要启用可以设置:xferlog_enable, xferlog_std_format, xferlog_file, vsftpd_log_file等参数以获得需要的日志效果。   虚拟用户的PAM配置 要针对虚拟用户启用PAM,我们还需要对PAM尽心配置,在上面的vsftpd配置文件中,我们使用pam_service_name来配置了PAM将使用的配置文件,这个文件安装后是默认存在的,如果你觉得有必要保留原来的配置,可以先行备份一份,而后配置文件内容改为如下: #%PAM-1.0 auth required pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-users account required pam_userdb.so db=/etc/vsftpd/vsftpd-virtual-users #session required...

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

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...

CentOS下编译安装Python2.7.6

MitchellChu 2014-05-07 Unix & Linux

CentOS下面Python在升级到2.7.6的时候,没有找到安装包直接安装,只能通过源代码编译的方式来安装Python 2.7.6版本。这篇是编译和安装Python2.7.6的过程记录。 CentOS系统中安装了development tools。要编译安装Python,执行下面代码: $ pushd /usr/local/src $ sudo mkdir python $ sudo chown $USER python $ cd python $ wget https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz $ tar zxvf Python-2.7.6.tgz $ cd Python-2.7.6 $ ./configure --prefix=/usr/local/python-2.7.6 && make $ sudo make install 代码过程: 1. 在/usr/local/src创建python文件夹,并将Python文件夹所有者设置为当前用户(非root) 2. 进入创建的python目录下,从官方网站上下载python2.7.6源代码包。 3. (非必须)如果要校验包的一致性,可以在官方网站上下载sig文件,并通过PGP校验文件,也可以通过官网提供的MD5校验下载的压缩包。更多关于校验的信息请参考Linux下校验文件的完整性(MD5,SHA1,PGP)。本代码忽略了此过程。 4. 解压压缩包到当前目录,并进入Python-2.7.6目录 5. 配置python并编译。这步只是用了--prefix参数指示安装路径。 6. 安装Python [也可使用altinstall的安装方式,这样文件末尾会带上版本号。updated: 2015-07-13] 上面是在Python编译安装顺利的情况下的大体流程,但是我在编译的时候,Python出现了下面的提示信息: Python build finished, but the necessary bits to build these modules were not found: _bsddb _sqlite3 _ssl _tkinter bsddb185 bz2 ...

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 ...

CentOS6.4下Emacs24.3的编译安装备忘

MitchellChu 2014-04-27 Unix & Linux

Emacs是一个具有强大扩展性的文本编辑器(说IDE或许更准确点),在CentOS中,你可以直接通过yum来安装。出于对新版本的热衷,选择了对Emacs24.3进行了编译安装。以下是Mitchell的安装过程,关于编译安装的一些介绍可以参看前一篇编译安装介绍。 首先,自然是要获取到Emacs的源代码,源代码在Emacs的官方网站上可以找到下载的地方(其中一个地址);第二个就是依赖了,Emacs 24.3版本需要依赖autoconf(2.65或更新),makeinfo(4.7或更新),makeinfo在Texinfo里面。 编译过程是反向的,先将依赖,编译安装完成之后,再编译安装Emacs本身。 autoconf的编译安装,由于CentOS本身自带autoconf,但是autoconf的版本不符合要求,因此先删除自带的autoconf。 yum erase autoconf 用这种方法移除后在更新,涉及到依赖包:automake,intltool,libtool。我们还需要将这些新版本安装回来。安装automake,intltool,libtool的过程简要备录如下: automake安装: $ wget http://ftp.gnu.org/gnu/automake/automake-1.14.1.tar.xz $ ./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.14.1 $ make $ sed -i "s:./configure:LEXLIB=/usr/lib/libfl.a &:" t/lex-{clean,depend}-cxx.sh $ make -j4 check TIPS:这个后缀的文件名不太常见,解压方法可以参考:Linux下的压缩解压命令汇总 make check的信息如下:    ============================================================================ Testsuite summary for GNU Automake 1.14.1 ============================================================================ # TOTAL: 2761 # PASS: 2455 # SKIP: 266 # XFAIL: 40 # FAIL: 0 # XPASS: 0 # ERROR: 0 ============================================================================ 这表示成功,可以安装 # make install libtool安装: $ wget http://mirror.hust.edu.cn/gnu/libtool/libtool-2.4.tar.xz $ wget http://mirror.hust.edu.cn/gnu/libtool/libtool-2.4.tar.xz.sig $ tar xvf libtool-2.4.tar.xz $ cd libtool-2.4/ $ ./configure --prefix=/usr $ make $ make check # make install intltool安装: $ wget http://launchpad.net/intltool/trunk/0.50.2/+download/intltool-0.50.2.tar.gz $ ./configure --prefix=/usr && $ make # make install && ...

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现在还是菜鸟一枚,暂时只想到这么些,如果还有更多或不对的地方,欢迎指正补充。

关于博主

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