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

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日 星期一...

wget下载进度条变成多行显示的解决方法

MitchellChu 2014-03-19 Unix & Linux

在之前为了解决Putty客户端连接到CentOS之后显示乱码的问题,设置了LANG=zh_CN.UTF-8之后,在使用wget下载的时候,wget下载进度条异常,竟然不能在一行显示了,变成了坑爹的多行显示,每一个周期wget自动会产生新的一行,结果下载进度慢点的文件,不用一会儿整个屏幕就全是wget进度条的天下了。 wget 的进度条变成了悲催的屏幕杀手,满屏幕都是下面这样的...(=号省略无数个) 99% [==========================================> ] 10,416,337 6.09K/s eta(英国中部时 99% [==========================================> ] 10,419,241 6.10K/s eta(英国中部时 99% [==========================================> ] 10,419,241 5.73K/s eta(英国中部时 99% [==========================================> ] 10,425,049 5.79K/s eta(英国中部时 99% [==========================================> ] 10,427,953 5.65K/s eta(英国中部时 100%[===========================================>] 10,431,288 5.65K/s in 27m 12s 这和原来的一行显示进度条的节奏完全不同啊。后面才发现这是因为翻译的时候,eta被转成eta(英国中部时间),导致整个输出太长,引起了断行,导致下次输出必须从新行开始。 再后来,发现网上也有很多人出现这个问题,关键是,这个问题从很早之前就一直存在,修改起来倒还是挺快的。 #注意文件路径是在:/usr/share/locale/zh_CN/LC_MESSAGES/ cd /usr/share/locale/zh_CN/LC_MESSAGES/ #先重命名 mv wget.mo wget.mo.bak #从重命名后的文件里替换eta(英国中部时间)为ETA,并导出新文件 msgunfmt wget.mo.bak -o - | sed 's/eta(英国中部时间)/ETA/' | msgfmt - -o wget.mo TIPs: 1. 如果没有msgunfmt 和msgfmt,请安装gettext(没有直接找到安装msgunfmt和msgfmt的方式)。 2. 以上命令本人是在root用户下操作

putty SSH连到CentOS显示乱码的解决方法

MitchellChu 2014-03-18 Unix & Linux

使用putty(版本0.62)通过SSH连接到CentOS(版本6.4)时,在客户端显示中文时会显示乱码。为了让putty显示正常,需要做如下操作: 1. 在CentOS上设置 /etc/sysconfig/i18n为如下内容 LANG="zh_CN.UTF-8" 2. 在putty的PuTTY Configuration窗口中设置如下: 1. Window->Appearance->font setting 设置字体为:新宋体,10号 2. Window->Translation->Remote character set 设置值为:UTF-8  这样设置后的putty通过SSH连接到CentOS上,中文字符正常显示,不再出现中文乱码。 Update: 这个设置可能会引起其他软件的一些问题,比如:wget下载进度条会变成多行显示.

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

MinGW生成C可执行文件,运行报dll丢失

MitchellChu 2013-12-30 其他技术 Unix & Linux 编程语言

MinGW下使用g++.exe/gcc.exe编译出来的可执行文件,在运行时报libgcc_s_dw2-1.dll丢失的错: 无法启动此程序,因为计算机中丢失libgcc_s_dw2-1.dll。尝试重新安装该程序已解决此问题。 这个问题的原因是因为gcc编译器在默认的情况下使用的不是静态关联,所以在执行文件下没有找到该DLL就会导致这个报错。最简单的解决方法是将此DLL直接放入到可执行文件的同目录下即可,当然,还有可能会报: 无法启动此程序,因为计算机中丢失libstdc++-6.dll。尝试重新安装该程序已解决此问题。 这种情况下,只能再次把丢失的DLL拷贝到可执行文件的目录下,这样问题就能得到解决。 虽然上面的方法能够解决这个问题,但每次新项目之后都需要将这些文件放入到部署文件夹。如果对这种方式不太满意,你可以考虑在编译的时候加入:-static-libgcc -static-libstdc++ g++.exe source_files -o target_file -static-libgcc -static-libstdc++ 这将直接告诉编译器,使用静态链接来处理关联。编译之后,就不需要再次将DLL文件拷贝到可执行文件的目录中。 如果你是使用CMake来编译,也可以在CMakeLists.txt中添加这两个参数: project(projectName) cmake_minimum_required(VERSION 2.8) #...... ### 添加下面这段代码 if(WIN32) set(CMAKE_CXX_FLAGS "-static-libgcc -static-libstdc++") endif(WIN32) ### 添加结束 #..... #其他代码 这样在编译的时候,就能自动添加这两个参数到编译器上。

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

CentOS网络配置相关文件配置选项说明

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

CentOS 修改IP地址等网络相关的配置文件 找到对应网卡的IP地址配置文件:ifcfg-eth数字. 路径:/etc/sysconfig/network-scripts/ifcfg-eth数字 文件内配置项说明 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为eth0 BOOTPROTO=static #设置网卡获得ip地址的方式,选项有:static(静态),dhcp(通过DHCP获取IP)或bootp(使用BOOTP协议获得IP) BROADCAST=192.168.0.255 #子网广播地址 HWADDR=00:17:F3:05:18:20 #网卡物理地址(MAC) IPADDR=192.168.0.2 #BOOTPROTO=static时,使用此IP地址 IPV6INIT=no #初始化IPv6的功能 IPV6_AUTOCONF=no #是否自动化配置IPv6 NETMASK=255.255.255.0 #网卡对应的网络掩码 NETWORK=192.168.1.0 #网卡对应的网络地址 ONBOOT=yes #系统启动时是否启用此设备,yes时,系统启动时激活 #TYPE=Ethernet #网络类型 #USERCTL=no #非root用户是否可控制该设备 2014年03月18日补充更新:NETWORK这个参数在CentOS中不要设置,官方已经弃用,并且在设置之后可能会出现不能成功添加网关的问题,可以参见最新的博文:CentOS网络配置中NETWORK设置后引起的问题. CentOS官方帮助:http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-networkscripts-interfaces.html   CentOS 网关配置相关的配置文件 路径: /etc/sysconfig/network 文件内配置项说明 NETWORKING=yes # 表示系统是否使用网络,一般为yes。如果为no,则不使用网络,很多系统服务无法启动 #NETWORKING_IPV6=no #是否启用IPv6 #FORWARD_IPV4=no #是否开启IP转发功能 #HOSTNAME=localhost.localdomain #设置本机的主机名,设置的值要和/etc/hosts中设置的主机名对应;注释掉,一般先解析主机名或者域名,再解析DNS GATEWAY=192.168.1.1 #设置网关的IP地址 #GATEWAYDEV=gateway #网关设备名称 CentOS 官方帮助:http://www.centos.org/docs/5/html/5.2/Deployment_Guide/s2-sysconfig-network.html   CentOS DNS相关的的配置文件 路径:/etc/resolv.conf 文件内配置项说明 #最重要的就是nameserver,其他可以忽略 nameserver 8.8.8.8 #google域名服务器 nameserver 8.8.4.4 #google域名服务器 #search mitchellchu.com www.mitchellchu.com #定义域名的搜索列表 #domain mitchellchu.com #定义本地域名 #sortlist #对返回的域名进行排序 网络设备重启 service network restart 或 /etc/init.d/network restart IP地址修改 即时生效: ifconfig eth0 192.168.0.2 netmask 255.255.255.0 重新启动网络设备后生效 参见 /etc/sysconfig/network-scripts/ifcfg-eth数字 的修改 修改当前网关 Default Gateway 即时生效: route add default gw 192.168.0.1 dev eth0 重启网络设备后生效: 参见:/etc/sysconfig/network的配置 修改DNS 参见:/etc/resolv.conf配置 修改后即时生效 修改主机名 即时生效: hostname centos1 重新启动生效: 参见:/etc/sysconfig/network配置,注意这里还有/etc/hosts的配置 网络配置的CentOS官方帮助:http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-networkscripts.html

Ubuntu 12.04.2 LTS x64在文本模式下无法正常登陆

MitchellChu 2013-05-28 其他技术 Unix & Linux

  今天安装的Ubuntu 12.04.2 LTS x64,在图形界面下非常正常的能进行登陆登出操作,但是在切换到文本模式下,却完全无法进行正常的登录操作,经过再三确认,用户名,密码均正确的很,就是一直登录不了,提示Login incorrect!    在进行过尝试和Google之后,发现可能的问题是:使用了小键盘! —— 不能使用小键盘?Ok,认了,于是再次到文本模式下测试,按理说,这个问题应该解决了,但结果令人非常的让人崩溃,还是登陆不了!难道还有其他问题,应该没有了啊,我安装选择的是美式键盘,即使小键盘无法识别,那其他键应该是认的啊。   在文本模式下测试了小键盘,的确会有问题,主要表现为: 1. 在刚切换到小键盘的时候,可能会出现小键盘无法识别的情况; 2. 文本模式下如果没有识别小键盘的状态下,不断的按Num Lock键,我们会发现键盘上的Num Lock灯会错乱几下(偶尔),而后如果切换到Num Lock On 的状态下,是能够正常输入数字的。 3. 接上面第2点,如果处于Num Lock Off的状态下,会发现小键盘其实编程了光标键,这个时候可以将光标移动到***login:这个提示符之前,也可以是上一行,当然,移动不要紧,回来就是,但如果移动之后,将会发现其实你即使再切回Num Lock On的状态,输入用户名之后,你也没有办法登陆的 —— 整个界面现在处于文本编辑状态?!   本人是Linux文盲,对于这个还真是非常好奇,之后还多测试了一下,连Caps Lock也试过,发现也会错乱,当然,这些和解决问题都没有任何关系!问题终归还是要解决的,因此非常努力的思考方法。   黄天总是不会辜负有心人啊,在经过不知道多少个脑细胞之后,脑残的将登陆用户名小写,尝试登录 ——成功!竟然成功了,难道Linux系不是大小写敏感的吗?后来经过搜寻,遭到网上一位朋友的一句话,大意是:Unix和Linux下的用户名都必须是小写的。但我觉得这个欠妥当,后面在这里看到好像用户名都是小写的,这个让我疑惑的是,我安装的时候是大写的,而且系统显示的也是大写的用户名。怎么登陆就会是要小写的呢?   系统虽然能够登陆了,但为什么我填写的是大写,最后还是小写,但系统又显示大写的这个问题却困扰着我,作为菜鸟的我,暂时还没有办法了解到这个问题的根源,只好暂时搁置了。

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

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

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

LUbuntu,Ubuntu下设置自定义桌面分辨率

MitchellChu 2013-03-26 其他技术 Unix & Linux

用户在lubuntu/ubuntu下自定义桌面分辨率的方法。

关于博主

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