标签: linux

centos安装SNMP使用监控宝监控主机性能的方法

安装 Net-SNMP

CentOS及其它RedHat系列产品提供了net-snmp的二进制包。我们可以直接从源里安装。

yum install net-snmp net-snmp-devel net-snmp-utils

说明:net-snmp-devel是为了使用net-snmp-config, net-snmp-utils是为了使用snmpwalk

配置 Net-SNMP

CentOS下的net-snmp无法在selinux环境下正常使用v3。如果您想使用snmp v3,请先禁用selinux。

net-snmp-config --create-snmpv3-user -ro -A snmp@jiankongbao -a MD5 jiankongbao

以上命令,创建一个snmpv3用户,只读,使用MD5,用户名为jiankongbao,密码为snmp@jiankongbao。

注意:运行之前请先停用net-snmp服务。

service snmpd stop

运行 Net-SNMP
运行 Net-SNMP 服务的方法比较简单,不过Net-SNMP服务的名字是snmpd

service snmpd start

您可能需要把它加入开机自动运行服务列表。

chkconfig snmpd on

检测 Net-SNMP
我们可以使用 snmpwalk 来检测snmp服务是否正常开启。

snmpwalk -v 3 -u jiankongbao -a MD5 -A "snmp@jiankongbao" -l authNoPriv 127.0.0.1 sysDescr

配置iptables防火墙
Net-SNMP 使用 udp 协议,161端口。在/etc/sysconfig/iptables 中添加如下规则

-A RH-Firewall-I INPUT -p udp -s 60.195.249.83 --dport 161 -j ACCEPT
-A RH-Firewall-I INPUT -p udp -s 60.195.252.107 --dport 161 -j ACCEPT
-A RH-Firewall-I INPUT -p udp -s 60.195.252.110 --dport 161 -j ACCEPT

解决unknown limit item ‘noproc’

这段时间为了对付攻击,看了几天的日志,发现每次看/var/log/secure这个日志的时候,都比上次增加了很多,除了被攻击出现的尝试登陆SSH外,还有一些东西

Apr 27 20:01:06 www crond[9449]: pam_limits(crond:session): unknown limit item ‘noproc’
Apr 27 20:01:06 www crond[9449]: pam_limits(crond:session): unknown limit item ‘noproc’
Apr 27 21:01:03 www crond[9541]: pam_limits(crond:session): unknown limit item ‘noproc’
Apr 27 21:01:03 www crond[9541]: pam_limits(crond:session): unknown limit item ‘noproc’
Apr 27 21:04:04 www sshd[9562]: pam_limits(sshd:session): unknown limit item ‘noproc’
Apr 27 21:04:04 www sshd[9562]: pam_limits(sshd:session): unknown limit item ‘noproc’
就是上边这些东西,占据了日志的大部内容,几乎1分钟就出一堆。”unknown limit item ‘noproc’”意思是未知的限制单位,看样子是关于limit session的,就是限制对话数的最大上限。查了一下资料,这东西归/etc/security/limits.conf这个配置文件管的,打开看了一下,里面有配置说明

# can be one of the following:\r\n
# – core – limits the core file size (KB)\r\n
# – data – max data size (KB)\r\n
# – fsize – maximum filesize (KB)\r\n
# – memlock – max locked-in-memory address space (KB)\r\n
# – nofile – max number of open files\r\n
# – rss – max resident set size (KB)\r\n
# – stack – max stack size (KB)\r\n
# – cpu – max CPU time (MIN)\r\n
# – nproc – max number of processes\r\n
# – as – address space limit (KB)\r\n
# – maxlogins – max number of logins for this user\r\n
# – maxsyslogins – max number of logins on the system\r\n
# – priority – the priority to run user process with\r\n
# – locks – max number of file locks the user can hold\r\n
# – sigpending – max number of pending signals\r\n
# – msgqueue – max memory used by POSIX message queues (bytes)\r\n
# – nice – max nice priority allowed to raise to values: [-20, 19]\r\n
# – rtprio – max realtime priority
看到高亮的部分没,是不是和我们的出错的信息”noproc“这东西很像,应该它就是罪魁祸首了。再往下看这个配置文件

# End of file\r\n
* soft noproc 65535
* hard noproc 65535
* soft nofile 65535
* hard nofile 65535

不用我说,你也知道是什么原因了吧,应该把noproc改成nproc,意思就是最大的进程数(对话数)。

按理说原来肯定是没有错的,可能是LNMP一键按装包里有错误,希望作者可以把这个错误修正了,不然广大使用者都不知道错在什么地方。

转自http://www.noisyguy.com/archives/214.html

个别自动备份脚本不执行的解决方法

个别自动备份脚本不执行的解决方法

在添加crontab命令定时启动脚本的后面,加上” > /dev/null 2>&1″。
如:
00 03 * * * /home/AutoBackupToFtp.sh > /dev/null 2>&1

下面是一个关于”/dev/null 2>&1″的解释

cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。
他们的不同点在于:

cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
而cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率更高。

****************************************
经常可以在一些脚本,尤其是在crontab调用时发现如下形式的命令调用

/tmp/test.sh > /tmp/test.log 2>&1
前半部分/tmp/test.sh > /tmp/test.log很容易理解,那么后面的2>&1是怎么回事呢?

要解释这个问题,还是得提到文件重定向。我们知道>和<是文件重定向符。那么1和2是什么?在shell中,每个进程都和三个系统文件 相关联:标准输入stdin,标准输出stdout和标准错误stderr,三个系统文件的文件描述符分别为0,1和2。所以这里2>&1 的意思就是将标准错误也输出到标准输出当中。

下面通过一个例子来展示2>&1有什么作用:

$ cat test.sh
t
date
test.sh中包含两个命令,其中t是一个不存在的命令,执行会报错,默认情况下,错误会输出到stderr。date则能正确执行,并且输出时间信息,默认输出到stdout

./test.sh > test1.log
./test.sh: line 1: t: command not found

$ cat test1.log
Tue Oct 9 20:51:50 CST 2007
可以看到,date的执行结果被重定向到log文件中了,而t无法执行的错误则只打印在屏幕上。

$ ./test.sh > test2.log 2>&1

$ cat test2.log
./test.sh: line 1: t: command not found
Tue Oct 9 20:53:44 CST 2007
这次,stderr和stdout的内容都被重定向到log文件中了。

实际上, > 就相当于 1> 也就是重定向标准输出,不包括标准错误。通过2>&1,就将标准错误重定向到标准输出了,那么再使用>重定向就会将标准输出和标准错误信息一同重定向了。如果只想重定向标准错误到文件中,则可以使用2> file。

linux shell 中”2>&1″含义脚本是:
nohup /mnt/Nand3/H2000G >/dev/null 2>&1 &
对于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,实际上这个操作就是一个dup2(2)调用.他标准输出到all_result ,然后复制标准输出到文件描述符2(STDERR_FILENO),其后果就是文件描述符1和2指向同一个文件表项,也可以说错误的输出被合并了.其中0 表示键盘输入 1表示屏幕输出 2表示错误输出.把标准出错重定向到标准输出,然后扔到/DEV/NULL下面去。通俗的说,就是把所有标准输出和标准出错都扔到垃圾桶里面。
command >out.file 2>&1 &
command >out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。

试想2>1代表什么,2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出;
换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出.

你可以用
ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1测试,没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。
为何2>&1要写在后面?
command > file 2>&1
首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出的行为,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。
command 2>&1 >file
2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

用strace可以看到:
1. command > file 2>&1
这个命令中实现重定向的关键系统调用序列是:
open(file) == 3
dup2(3,1)
dup2(1,2)

2. command 2>&1 >file
这个命令中实现重定向的关键系统调用序列是:
dup2(1,2)
open(file) == 3
dup2(3,1)

可以考虑一下不同的dup2()调用序列会产生怎样的文件共享结构。请参考APUE 3.10, 3.12

————————

/dev/null 2>&1 解释
crontab内容 :50 18 5-30 * * /script/myscript.sh 1> /dev/null 2>&1
其中 1> /dev/null 2>&1是什么意思??
dev/null 为系统垃圾箱
&为后台运行
但是 myscript 后面的1 和 /null后面的2 还有 &后面的1是什么意思?
1代表标准输出,2代表错误信息输出.
1>/dev/null 就是指将标准输出定向到空设备,
2>&1,的意思是将错误输出定向到和1一样的输出设备,也同样是空.
换句话说,就是不显示该程序执行过程中的任何信息
cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开
他们的不同点在于:
cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
而cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率更高。
————————————-

为什么要用 /dev/null 2>&1 这样的写法.这条命令的意思是将标准输出和错误输出全部重定向到/dev/null中,也就是将产生的所有信息丢弃.下面我就为大家来说一下, command > file 2>file 与command > file 2>&1 有什么不同的地方.
首先~command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道.
而command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容.
从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会用command > file 2>&1 这样的写法.
****************************************************
in UNIX
0 = stdin
1 = stdout
2 = stderr

>/dev/null 2>&1 means
redirect all the standard out and standard error messages/output/results from the programs/scripts to /dev/null ( which means they go to a bottomless pit)

*****************************************************

/dev/null 2>&1

You need to understand the theory first and then its upto you how and where you want to apply that theory. I’ll try to explain above to you.

The greater-than (>) in commands like these redirect the program’s output somewhere. In this case, something is being redirected into /dev/null, and something is being redirected into &1.

Standard in, out and error:

There are three standard sources of input and output for a program. Standard input usually comes from the keyboard if it’s an interactive program, or from another program if it’s processing the other program’s output. The program usually prints to standard output, and sometimes prints to standard error. These three file descriptors (you can think of them as “data pipes”) are often called STDIN, STDOUT, and STDERR.

Sometimes they’re not named, they’re numbered! The built-in numberings for them are 0, 1, and 2, in that order. By default, if you don’t name or number one explicitly, you’re talking about STDOUT.

That means file descriptor 0 or fd0 denotes STDIN or standard input and file descriptor 1 or fd1 denotes STDOUT or standard output and file descriptor 2 or fd2 denotes STDERR or standard error.

You can see the command above is redirecting standard output into /dev/null, which is a place you can dump anything you don’t want (often called the bit-bucket), then redirecting standard error into standard output (you have to put an & in front of the destination when you do this).

The short explanation, therefore, is “all output from this command should be shoved into a black hole.” That’s one good way to make a program be really quiet!

*********************************************
When in a shell, you can do various things with the output and input to commands. You can run them through a pipe:

grep root /var/log/messages | less

This takes the output of the ‘grep’ commands, and uses the ‘less’ paginator to finally display it on the screen.

To go into further detail, this sends the STDOUT of ‘grep’ to less.

If you wanted to send the output to a file, you’d use a redirect:

grep root /var/log/messages > /tmp/file

This takes the STDOUT, and sticks it into ‘/tmp/file’. I won’t go into detail about the > and >> options etc. as they are all covered in the man page.

There are 3 file descriptors for every process. STDIN, STDOUT and STDERR. These map to 0, 1 and 2 respecitvly.

Strangely enough, the above command can also be written as:

grep root /var/log/messages 1> /tmp/file

The first command makes the assumption that you want to redirect STDOUT. This one clears up that assumption.

Now we’ll look at STDERR:

grep root /var/log/mseeagse > /tmp/file

This will spit out an error to your tty, even though you’ve redirected the output.

grep root /var/log/mseeagse 2> /tmp/file

This one will output nothing, and ‘/tmp/file’ will contain the error. If we didn’t miss-spell the messages file name, any errors that might occur would go to the file, but the output will go to the TTY.

Now we’ll do the last confusing thing, moving a file descriptor to a different one. This is where the & comes in:

grep root /var/log/mseeagse 2> &1

This moves STDERR so it comes out in the same place as STDOUT. It says “Move file descriptor 2 to file descriptor 1”.

Thus where we get to your tail. We mix and match the STDOUT and STDERR redirections:

grep root /var/log/messages > /tmp/file 2> &1
grep root /var/log/mseeagse > /tmp/file 2> &1

With both of these commands, both the regular output (STDOUT), and any errors that occur (STDERR) will go into ‘/tmp/file’.

When stacking redirects like this, there is one major thing to be aware of. When you move a file descriptor, you have to make sure the descriptor you are moving too has already been redirected to where you want, otherwise you can get some… interesting results.
************************************************************
This is from memory.
Everything in Linux is a file, including I/O. There are three standard file descriptors, Standard In (STDIN, file descriptor 0), Standard Output (STDOUT, file descriptor 1) and Standard Error (STDERR, file descriptor 2). /dev/null is the null device, which is like “write only memory”. > will write to the specified file (overwriting its contents) and >> will append to the specified file.

2> redirects STDERR to the specified file. >> is used to append to the end of the file.

& only means to run the process in the background if it appears at the end of the line.

2>&1 redirects STDERR to STDOUT. Since in this case, STDOUT is being redirected to /dev/null, 2>&1 causes both STDERR and STDOUT to /dev/null.

linux网卡设置文章集合

最近面临增加IP,还有加入IPv6,设置网卡网关掩码等信息的问题,总是对linux不熟,找了3篇文章贴在下面,以备以后查询。
另外配置好后,一定要重启一下网卡,命令为/etc/init.d/network restart

CentOS Linux XEN / OpenVZ VPS 增加额外IP

手头有2台vps,分别是基于xen与openvz虚拟化技术,系统为centos linux。

需要对他们增加额外的ip,XEN的默认网卡为eth0,OpenVZ的默认网卡为venet0,网卡的配置文件均位于/etc/sysconfig/network-scripts/目录下。

对XEN VPS进行操作如下:

cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 ifcfg-eth0:0
vi ifcfg-eth0:0
将其中属于eth0的信息修改为eth0:0然后退出保存
ifup eth0:0
eth0一般配置如下:

DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=111.111.111.111
NETMASK=255.255.255.0
对OpenVZ VPS进行操作如下:

OpenVZ VPS有点特别,默认的venet0网卡存放的是ip为127.0.0.1,绑定ipv6地址(如果有),ipv4地址绑定在venet0:0上。以venet0:0为例,增加额外ipv4的ip。

cd /etc/sysconfig/network-scripts/
cp ifcfg-venet0:0 ifcfg-venet0:1
vi ifcfg-venet0:1
将其中属于venet0:0的信息修改为venet0:1然后退出保存
ifup venet0:1
venet0:0一般配置如下:

DEVICE=venet0:0
ONBOOT=yes
IPADDR=222.222.222.222
NETMASK=255.255.255.255

在Linux下有时候需要给一个网卡绑定多个IP,本文介绍在Redhat系列(redhat,Fedora Core,Centos)中的实现方法和一种在Gentoo等其他Linux中普遍适用的方法。

1、单网卡绑定多IP在Redhat系列中的实现方法
  假设需要绑定多IP的网卡是eth0,请在/etc/sysconfig/network-scripts目录里面创建一个名为ifcfg-eth0:0的文件,
  内容样例为:

  DEVICE=”eth0:0″
  IPADDR=”192.168.0.2″
  BROADCAST=”172.168.0.255″
  NETMASK=”255.255.255.0″
  ONBOOT=”yes”
  其中的DEVICE为设备的名称,
  IPADDR为此设备的IP地址,
  BROADCAST是广播地址,
  NETMASK为子网掩码,
  ONBOOT 表示在系统启动时自动启动。
  如果需要再绑定多一个IP地址,
  只需要把文件名和文件内的DEVICE中的eth0:x加一即可。
  LINUX最多可以支持255个IP别名
  
2、普遍适用的单网卡绑定多IP实现方法

  ifconfig eth0:1 192.168.0.3 broadcast 192.168.0.255 netmask 255.255.255.0
  可以把上述命令加在启动自运行文件里面,在Gentoo下是/etc/conf.d/local.start,而某些版本的Linux是/etc/rc.d/rc.local。
  
3、多网卡共用单IP的实现方法
  使用多块网卡虚拟成为一块网卡,具有相同的IP地址。这项技术其实在sun和cisco中已经存在,分别称为Trunking和 etherchannel技术,在linux中,这种技术称为bonding。因为bonding在内核2.4.x中已经包含了,只需要在编译的时候把网络设备选项中的 Bonding driver support选中就可以了。
  然后,重新编译核心,重新起动计算机,执行如下命令:
  ismod bonding
  ifconfig eth0 down
  ifconfig eth1 down
  ifconfig bond0 ipaddress
  ifenslave bond0 eth0
  ifenslave bond0 eth1
  现在两块网卡已经象一块一样工作了,这样可以提高集群节点间的数据传输。
  你最好把这几句写成一个脚本,再由/etc/rc.d/rc.local或者/etc/conf.d/local.start调用,以便一开机就生效。
  bonding对于服务器来是个比较好的选择,在没有千兆网卡时,用两三块100兆网卡作 bonding,可大大提高服务器到交换机之间的带宽。但是需要在交换机上设置连接bonding 网卡的两个口子映射为同一个虚拟接口。

近日在进行Aapche的虚拟站点设置时,因为想使用单网卡上绑定多个IP,通过研究发现,SUSUE 10与RED HAT有所不同,在SUSE10中并没有/etc/sysconfig/network-scripts目录,所以只能另辟方法.

SUSE 10中设定单网卡绑定多个IP需要在配置文件/etc/sysconfig/network/ifcfg-eth-id-xx.xx.xx.xx.xx的配置文件中添加如下几行:

IPADDR_1=’192.168.2.151′
NETMASK_1=’255.255.255.0′
LABEL_1=’1′
IPADDR_2=’192.168.2.152′
NETMASK_2=’255.255.255.0′
LABEL_2=’2′
IPADDR_3=’192.168.2.153′
NETMASK_3=’255.255.255.0′
LABEL_3=’3′
注意:

IPADDR_X 指定所需要的IP地址

NETMASK_X 指定对应IP地址的子网掩码

LABEL_X 指定该网卡的别名,如此处的数字1、2、3,对应通过ifconfig命令查看到的名称为:eth0:1、eth0:2、eth0:3

通过以上的设置,我们就在单网卡上绑定了四个IP地址

linux网卡配置文件

联网其实就3个步骤
1.配ip
2.配dns
3.指定gateway
——————————————————————————————–
主机IP
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=
NM_CONTROLLED=yes
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
USERCTL=NO #设置root以外的人是否可以控制eth0网卡
IPADDR=192.168.168.168
NETMASK=255.255.255.0
NETWORK=192.168.168.0 #设置IP地址段

网络DNS
/etc/resolv.conf
nameserver 192.168.168.1 #指定dns

主机网络
/etc/sysconfig/network
NETWORK=yes #网络是否可以被配置,设为No将不能配置网络,service network restart无效
HOSTNAME=localhost.localdomain
GATWAYEV=eth0 #设置属于eth0网卡
GATEWAY=192.168.168.1 #设置默认网关,很重要
RORWARD_IPV4=YES #是否开启ip地址转发功能
这一步可以用命令代替:route add default gw 192.168.168.1
——————————————————————————————–
/etc/networks
暂时我也不是很明白,说是表示网络名之类的,网络编号,没用过
——————————————————————————————–
host.conf配置文件一般不用
/etc/host.conf
multi on #指定主机是否可以有多个ip地址
order bind,hosts #指定解析顺序
——————————————————————————————–
本地解析文件
/etc/hosts
#格式:
IP 主机域名 主机别名
127.0.0.1 www.baidu.com baidu
——————————————————————————————–

增强VPS主机安全linux主机使用密匙验证关闭密码认证的方法

注意,此方法未经测试,转自李思思博客,原文链接已不存在。

平时我们登录VPS都是帐号加密码的方式登录,但是这样呢很不安全,知道密码的人就能登录,不知道的还可以无限尝试,也就是被扫描,为了更加安全,所以出了这文章

好了废话少说,简单的说就三步
第一步 生成一对锁匙
密匙有公匙和私匙,形象的说就是钥匙和锁头,虽然这样说不太对,不过为了便于理解,我这里把公匙比喻为锁头,私匙比喻为钥匙
生成这一对锁匙有多种方法,先来最简单的,
我们先密码登录到我们的linux VPS上,键入如下命令
ssh-keygen -t rsa
然后会得到提示 叫你输入密码,如果你不想为这对锁头再加密码就直接输入2次回车即可,如果你为了更加安全希望这对锁匙加密的话可以输入自己的密码,也就是把你的钥匙变成高级的带密码的钥匙
提示画面应该是这样的
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
你得到了2个文件 在/root/.ssh/下面应该有 id_rsa(钥匙)和id_rsa.pub(锁头).
我们需要把锁头id_rsa.pub 改名字为 authorized_keys
(如果你需要这一对钥匙在别的VPS上也可以使用,而不是一个机子一个钥匙的话,可以把锁头和钥匙一起复制下来,在别的机子上直接把authorized_keys上传到/root/.ssh/下面即可)
好了 上面这些就是第一步 生成一对锁匙

第二步其实是因为putty.exe这个东西不能正确识别linux弄出的钥匙才需要的操作,
我们打开puttygen.exe 把我们的
钥匙id_rsa进行一下处理 如图显示

导入以后 点击 Save private key 得到的就是putty能正常使用的钥匙了(如果你前面加了密码需要你输入密码)

现在呢打开putty 尝试密匙登录

在连接那里可以输入自动登录的用户名,就可以免去输入用户名的烦恼
登录的时候会有如下提示
login as: root
Authenticating with public key “imported-openssh-key”
表示密匙登录成功
第三步就是关闭密码登录
远程Linux主机的/etc/ssh/sshd_config配置文件
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes    #======》这里把注释去掉,并改成no

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes #========>把注释去掉,并改成no
修改后/etc/init.d/sshd reload #加载修改后的配置文件并生效
如果是debian的话使用 /etc/init.d/ssh reload 来重新加载配置文件
这样其他远程客户端如果没有私钥,那么这些用户连输入密码的机会都没有,就会被本主机直接断开

就这样教程完毕了

附加其他生成密匙的方法,有兴趣的继续看吧
方案一:使用puttygen.exe生成的密匙
1、用puttygen.exe生成一对密匙
1)、打开puttygen.exe,直接点击Generate,鼠标在Key区空白的位置频繁的晃动
加快随机数的产生,这样几秒钟就可以生成我们需要的密匙
2)、点击Save public key->id_rsa.pub(保存密匙)
因为puttygen.exe生成的格式和Linux系统使用的key格式不同,需要对生成的数据作些简单的修改:
比如源数据:
—- BEGIN SSH2 PUBLIC KEY —-
Comment: “rsa-key-gliethttp”
AAAAB3NzaC1yc2EAAAABJQAAAIEAg2Nx1dBZBypLXY1S78plfmPmwlQj1Ckuoz8o
4vAWjJfOy3i6t2+o7aZMbGN+yUbQY5ScyJu3bK7Wg3ZxXP6qps14J2CAXbdrT9VH
2AA3FIOgbLHii7Bwmjkr5+hVYp7Vazm7cPsGpKnmCWihqX7rkQdY7xq3mOCJI3ry
Nnfkrh0=
—- END SSH2 PUBLIC KEY —-
修改成:(我使用的Linux主机名为gliethttp)
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAg2Nx1dBZBypLXY1S78plfmPmwlQj1Ckuoz8o4vAWjJfOy3i6t2+
o7aZMbGN+yUbQY5ScyJu3bK7Wg3ZxXP6qps14J2CAXbdrT9VH2AA3FIOgbLHii7Bwmjkr5+hVYp7Vazm7cPsGpK
nmCWihqX7rkQdY7xq3mOCJI3ryNnfkrh0= root@gliethttp
(注意:修改后的数据不能有回车换行)
3)、将生成的id_rsa.pub拷贝到远程主机gliethttp的/root/.ssh上
重命名为authorized_keys
[root@gliethttp root]#cd .ssh
[root@gliethttp .sh]#mv id_rsa.pub authorized_keys
这样sshd服务程序当接收到远程客户端的连接申请时会自动匹配.ssh/authorized_keys文件中的密匙
4)、点击Save private key->id_rsa.ppk(保存私钥)
如果安全级别不是很苛刻,可以不设置Key passphrase
2、打开putty.exe
1)、Session –> Host Name (填写服务器地址或者域名)
2)、Connection –> SSH –> Auth (点Browse选择刚生成的id_rsa.ppk)
3)、open
成功打开后出现如下提示:
login as: root
Authenticating with public key “imported-openssh-key”

shell进度条显示之循序渐进

直接COPY运行
1. 显示个小棍
代码:

#/bin/bash
i=0
while [ $i -lt 10 ]
do
  for j in '-' '\\' '|' '/'
  do
    echo -ne "\033[1D$j"
    usleep 50000
  done
  ((i++))
done

2. 显示类似wget 的进度
代码:

#!/bin/bash
i=0
while [ $i -lt 20 ]
do
       ((i++))
       echo -ne "=>\033[s"
       echo -ne "\033[40;50H"$((i*5*100/100))%"\033[u\033[1D"
   usleep 50000
done
echo

3. 为什么可以在cp -a 时显示进度条及为什么应该避免这种设计
进度条显示依赖于两个关键,一是总工作量,一是当前进度量。 对于
wget 来说, 如果要获取的资源在头部有Content-Length, 那么它可以认为获得了“总工作量”, 而具体下载过程中下载了多个字节它是知道的,这种情况下得到进度百分比是轻负担的,可承受的。
对于wget获取一个使用http协议的URL来说, 如果Content-Length没有指定, 则wget 也无法获取总工作量, 它所能做的只是下载一点是一点,直到收到一个结束标志。而这种情况下即使wget也无法正确显示进度条。
注: Content-Length 头在Http协议中是可选的.

对于cp -a 这样的任务来说, 可能很多用把它用作备份的手段, 执行这个命令一般都是大宗买卖, 源往往是一个目录。 而获取这样一个目录的总大小是可能但不可负担的,你可以du -csh /usr/src/linux 试试看。 在这段时间内你差不多可以复制完成了。
另一种情况, 即使要复制的源是单个的大文件,此时总工作量易于得到, 但整个copy 过程中每时每刻的工作进度则要通过不断地轮询目标文件的大小来实现。 这需要至少两个进程/线程来实现, 比较wget在内部获得这一指标来说, cost太大了。

实际情况中这些因素的划分没有这么泾渭分明, 但作为一个简单的原因, 应该避免去选择编程代价大,维护难,消耗资源多的方案, 即使它在技术上是可行的

附:
代码:

"\033[;H"  其中代表此处应该是一个数字,表示坐标行, C为纵坐标, 定位光标
"\033[A"      以当前光标为参照,上移N行, 水平方向不动
"\033[B"      同上,下移
"\033[C"      同上,右移
"\033[D"      同上,左移
"\033[2J"        清屏

注意上面中的<>不要输入

转自http://centos.blog.51cto.com/242642/201615

自己的路面板添加php扩展

屡次实验ssl都没有成功,怀疑是openssl的问题,于是就看看怎么安装的,安装问题是解决了,但是ssl还是没有用起来,郁闷中……

下面是用自己的路(zijidelu)面板装php扩展的方法,此例为mysql。

1.下载LuNamp_last.tar.gz(如果本地已经存在LuNamp/code/php/php_extension.sh文件,则无需下载。如果是FreeBSD系统,请用fetch代替wget ):
wget http://down4.zijidelu.org/projects/zijidelu-lunamp/files/LuNamp2.2/LuNamp_last.tar.gz

2.解压LuNamp_last.tar.gz:tar -zxvf LuNamp_last.tar.gz

3.进入LuNamp/code/php/目录:cd LuNamp/code/php/

4.执行:./php_extension.sh “mysqli” “5.2.17” “/usr/local/php_fcgi” (注意修改为英文双引号)

参数解释:
第一个参数为扩展名称(解压php-5.2.17.tar.gz后,会有一个ext目录,里面包括了很多扩展,目录名即为扩展名,如pdo_mysql,xsl,bcmath等),此处为mysqli,请用半角双引号包围
第二个参数为PHP版本号,此处为5.2.17
第三个参数为PHP的路径,此处为/usr/local/php_fcgi。如果使用了apache,请同时将/usr/local/php安装上扩展

5.登陆LUM后台,更新网站

注意:
其实本文的重点在这里,第四步的时候会出错,原因为没有把config0.m4改名为config.m4。
vi php_extension.sh
在出现/usr/local/bin/phpize的地方之前,加上下面的语句。
mv config0.m4 config.m4
之后脚本可以成功运行。

linux下通过phpize不重新编译增加openssl.so模块

切换到php安装目录的etx/openssl目录

cd /home/tao/soft/php-5.2.13/ext/openssl
openssl目录下有个config.w32和config0.m4,把config0.m4改名为config.m4(不清楚什么原因,必须这么改,很重要!!!)
mv config0.m4 config.m4
$PHP_PREFIX/bin/phpize或直接/usr/local/bin/phpize
./configure --with-openssl --with-php-config=/usr/local/php/bin/php-config
make
make test
make install

在php.ini内加入以下内容:

extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
extension = "openssl.so"

重启php、nginx后生效

注意:

pcre、zlib等模块目录下也是config0.m4。

如果执行
/usr/local/bin/phpize
出现
Cannot find config.m4.
Make sure that you run ‘/usr/local/bin/phpize’ in the top level source directory of the module
是因为openssl目录下没有把config0.m4改名为config.m4。
mv config0.m4 config.m4

linux下php编译添加相应的动态扩展模块so

LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)

网上我看到有很多相关的文章都是简述这个问题的,但毕竟因为LINUX版本众多,很多LIUNX命令或路径都有所差别,有时同样的命令却不能执行一样的操作。

这篇文章是我在实际运用当中配置成功的实例,希望对大家有所帮助,开源是来自每个人的无私帮助,每个人的成长都是需要别人的扶植!废话就说到这了!

http://php.net/downloads.php (相应PHP版本下载)

1、首先确定LINUX下已安装的PHP版本,因为不同PHP版本对于追加动态模块有兼容性问题(可能路径,配置?其他?),往往报错不能安装,追加的模块必须版本一致。

查看PHP版本有多种方法:

①运行php -v(但在我的64位LIUNX测试过没作用,原因你知道的了!)

②在已安装好的PHP路径下找到php-config并进行查看,可以vi或cat (关键字:version=”XXXXXXX”为PHP版本号)

vi 或cat php-config

2、下载好的PHP源代码包需人工上传到FTP网络服务器上,这时你的tar包可能只是放在WWW下,为了你自己方便查找和使用,建议建立自己的source文件夹进行存放。

建立文件夹:mkdir XXXXXX(文件夹名)

移动或复制文件:mv或cp php.tar /sourece(注意路径,”/“我是在根目录下创建的临时文件夹!)

解压tar包:tar zxfv php.tar(源代码tar包)

3、现在进入正题了,以追加动态模块openssl.so为例,进入PHP源码文件夹后,执行phpize生成configure进行模块追加:

#cd /source/php/ext/openssl 进入源码包的OPENSSL模块文件夹

#/var/www/php/bin/phpize 注意这个是已安装好的PHP路径(有些是版本可能是在/usr/local/******下,每个人的安装习惯不同)

如出现以下错误:Cannot find config.m4. *****************************************

解决方法:

查看源码包OPENSSL文件夹下是否有config0.m4,如果有可执行,
#mv config0.m4 config.m4

4、进入最后的编译阶段了,我编译时是比较顺利的(有时ERROR如果出现,我也不好做阐述,只能靠自己查看errorlog日志了)

#./configure –with-openssl –with-php-config=/var/www/php/bin/php-config(注意:这个参数后的是你本机已安装好的PHP路径)
#make

#make test (测试编译结果)

#make install

当成功时会返回成功信息(注意查看,SO文件的所在位置):

Installing shared extensions: /usr/lib/20060613/(这路径是我虚拟的,正确请自己查找,会生成openssl.so文件)

一般规范点的话,会把追加的SO模块放在一个指定的文件夹里,就在PHP安装好的目录下的extensions文件夹内

#mv /*****/*****/openssl.so /var/www/php/lib/php/extensions

动态模块追加编译已全部完成了。。。。

最后就是要PHP支持加载这些追加的动态模块了,vi编辑PHP下的配置文件php.ini。

#vi /*******/*******/php.ini

进入编辑器后可以看到PHP的所有相关配置,查找extension_dir这个配置的选项,

vi后可直接‘/extension_dir '查找,找到后可能是这样的:

extension_dir  = "./"

需修改成: 

extension_dir  = "/var/www/php/lib/php/extensions/"   (注意是so文件的所在)

extension=openssl.so (so模块文件名)
最后保存退出! :wq!

接着就是重启 apache服务器了!(有说人不用,但也就一个命令,我觉得配置好重启还是安心点!)

可以用命令查看下PHP的运行加载: /var/www/php/bin/php -m|grep openssl (路径啥的我就不说了,就是安装好的PHP路径就是了)

出现的信息可能会出现一些错误,但都是没关系的:类似找不到什么DLL文件啊(openssl.dll之类的),别管他,DLL是WINDOWS主机服务器模块加载的类型,UNIX和LINUX是以SO为模块加载名的!

ubuntu下用非root用户执行rc.local

在一个技术交流群上有人问这样的问题,特此记录一下。
ubuntu /etc/rc.local用非root用户执行命令。
即给没有授权的用户授权可以使用的命令。
参考命令如下。
nohup sudo -u -i &