最近在网上看到一些Linux系统管理员的题目,于是整理了一下,未完待续。
1、Linux挂载Winodws共享文件夹
windows IP 192.168.1.200
windows用户administrator 密码P@ssw0rd
将C下的share设置成共享
在linux下用root执行:
mount -t cifs -o username=administrator,password=P@ssw0rd //192.168.1.200/share /mnt
cd /mnt
可以查看windows share下的内容
2、查看http的并发请求数及其TCP连接状态:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
还有ulimit -n 查看linux系统最大的tcp连接,这里默认1024,不修改这里web服务器修改再大也没用。若要用就修改很几个办法,这里说其中一个:
修改/etc/security/limits.conf
* soft nofile 10240
* hard nofile 10240
或者修改/etc/profile
加入
ulimit -n 10240
source /etc/profile
3、用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -5
4、统计/var/log/下文件个数
ls /var/log/ -lR| grep "^-" |wc -l
统计某文件夹下文件的个数
ls -l |grep "^-"|wc -l
统计某文件夹下目录的个数
ls -l |grep "^d"|wc -l
统计文件夹下文件的个数,包括子文件夹里的
ls -lR|grep "^-"|wc -l
如统计/home/han目录(包含子目录)下的所有js文件则:
ls -lR /home/han|grep js|wc -l 或 ls -l "/home/han"|grep "js"|wc -l
统计文件夹下目录的个数,包括子文件夹里的
ls -lR|grep "^d"|wc -l
说明:
ls -lR
长列表输出该目录下文件信息(R代表子目录注意这里的文件,不同于一般的文件,可能是目录、链接、设备文件等)
grep "^-"
这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d
wc -l
统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数。
======================================
如果只查看文件夹
ls -d 只能显示一个.
find -type d 可以看到子文件夹
ls -lF |grep / 或 ls -l |grep '^d' 只看当前目录下的文件夹,不包括往下的文件夹
5、查看当前系统每IP连接数
6、shell下32位随机密码生成
cat /dev/urandom | head -1 | md5sum | head -c 32 >> /pass
7、统计出apache的access.log中访问量最多的5个IP
cat access_log_2011_06_26.log |awk '{print $1}'|uniq -c|sort -n |head 5
8、如何查看二进制文件的内容
打开终端
vim 文件名称 例如: vim aaa.zip
执行命令 :%!xxd
或者
我们一般通过hexdump命令 来查看二进制文件的内容。
hexdump -C XXX(文件名) -C是参数 不同的参数有不同的意义
-C 是比较规范的 十六进制和ASCII码显示
-c 是单字节字符显示
-b 单字节八进制显示
-o 是双字节八进制显示
-d 是双字节十进制显示
-x 是双字节十六进制显示等等等等
9、ps aux 中VSZ代表什么意思 RSS代表什么
VSZ:虚拟内存集,进程占用的虚拟内存空间
RSS:物理内存集,进程战用实际物理内存空间
10、检测并修复/dev/hda5
fsck -P /dev/hda5
11、Linux开机启动顺序
开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程。分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径。
启动第一步--加载BIOS
当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。在BIOS将系统的控制权交给硬盘第一个扇区之后,就开始由Linux来控制系统了。
启动第二步--读取MBR
硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,可里面却存放了预启动信息、分区表信息。可分为两部分:第一部分为引导(PRE-BOOT)区,占了446个字节;第二部分为分区表(PARTITION PABLE),共有66个字节,记录硬盘的分区信息。预引导区的作用之一是找到标记为活动(ACTIVE)的分区,并将活动分区的引导区读入内存。
系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。
启动第三步--Boot Loader
Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。通常,BootL oade:是严重地依赖于硬件而实现的,不同体系结构的系统存在着不同的Boot Loader。
Linux的引导扇区内容是采用汇编语言编写的程序,其源代码在arch/i386/boot中(不同体系的CPU有其各自的boot目录),有4个程序文件:
◎bootsect.S,引导扇区的主程序,汇编后的代码不超过512字节,即一个扇区的 大 小
◎setup.S, 引导辅助程序
◎edd.S,辅助程序的一部分,用于支持BIOS增强磁盘设备服务
◎video.S,辅助程序的另一部分,用于引导时的屏幕显示
Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader,这里以Grub为例来讲解吧。
系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。
启动第四步--加载内核
根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。
系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。
start_kenrel()定义在init/main.c中,它就类似于一般可执行程序中的main()函数,系统在此之前所做的仅仅是一些能让内核程序最低限度执行的初始化操作,真正的内核初始化过程是从这里才开始。函数start_kerenl()将会调用一系列的初始化函数,用来完成内核本身的各方面设置,目的是最终建立起基本完整的Linux核心环境。
start_kernel()中主要执行了以下操作:
(1) 在屏幕上打印出当前的内核版本信息。
(2) 执行setup_arch(),对系统结构进行设置。
(3)执行sched_init(),对系统的调度机制进行初始化。先是对每个可用CPU上的runqueque进行初始化;然后初始化0号进程(其task struct和系统空M堆栈在startup_32()中己经被分配)为系统idle进程,即系统空闲时占据CPU的进程。
(4)执行parse_early_param()和parsees_args()解析系统启动参数。
(5)执行trap_in itQ,先设置了系统中断向量表。0-19号的陷阱门用于CPU异常处理;然后初始化系统调用向量;最后调用cpu_init()完善对CPU的初始化,用于支持进程调度机制,包括设定标志位寄存器、任务寄存器、初始化程序调试相关寄存器等等。
(6)执行rcu_init(),初始化系统中的Read-Copy Update互斥机制。
(7)执行init_IRQ()函数,初始化用于外设的中断,完成对IDT的最终初始化过程。
(8)执行init_timers(), softirq_init()和time_init()函数,分别初始系统的定时器机制,软中断机制以及系统日期和时间。
(9)执行mem_init()函数,初始化物理内存页面的page数据结构描述符,完成对物理内存管理机制的创建。
(10)执行kmem_cache_init(),完成对通用slab缓冲区管理机制的初始化工作。
(11)执行fork_init(),计算出当前系统的物理内存容量能够允许创建的进程(线程)数量。
(12)执行proc_caches_init() , bufer_init(), unnamed_dev_init() ,vfs_caches_init(), signals_init()等函数对各种管理机制建立起专用的slab缓冲区队列。
(13 )执行proc_root_init()Wl数,对虚拟文件系统/proc进行初始化。
在 start_kenrel()的结尾,内核通过kenrel_thread()创建出第一个系统内核线程(即1号进程),该线程执行的是内核中的init()函数,负责的是下一阶段的启动任务。最后调用cpues_idle()函数:进入了系统主循环体口默认将一直执行default_idle()函数中的指令,即CPU的halt指令,直到就绪队列中存在其他进程需要被调度时才会转向执行其他函数。此时,系统中唯一存在就绪状态的进程就是由kerne_hread()创建的init进程(内核线程),所以内核并不进入default_idle()函数,而是转向init()函数继续启动过程。
启动第五步--用户层init依据inittab文件来设定运行等级
内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。
其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启
启动第六步--init进程执行rc.sysinit
在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件。
线程init的最终完成状态是能够使得一般的用户程序可以正常地被执行,从而真正完成可供应用程序运行的系统环境。它主要进行的操作有:
(1) 执行函数do_basic_setup(),它会对外部设备进行全面地初始化。
(2) 构建系统的虚拟文件系统目录树,挂接系统中作为根目录的设备(其具体的文 件系统已经在上一步骤中注册)。
(3) 打开设备/dev/console,并通过函数sys_dup()打开的连接复制两次,使得文件号0,1 ,2 全部指向控制台。这三个文件连接就是通常所说的“标准输入”stdin,“标准输出”stdout和“标准出错信息”stderr这三个标准I/O通道。
(4) 准备好以上一切之后,系统开始进入用户层的初始化阶段。内核通过系统调用execve()加载执T子相应的用户层初始化程序,依次尝试加载程序"/sbin/initl"," /etc/init"," /bin/init',和“/bin/sh。只要其中有一个程序加载获得成功,那么系统就将开始用户层的初始化,而不会再回到init()函数段中。至此,init()函数结束,Linux内核的引导 部分也到此结束。
启动第七步--启动内核模块
具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。
启动第八步--执行不同运行级别的脚本程序
根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
启动第九步--执行/etc/rc.d/rc.local
你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.
rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。
启动第十步--执行/bin/login程序,进入登录状态
此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了。
1: 启动电源后,主机第一步先做的就是查询BIOS(全称:basic input/output system 基本输入输出系统)信息。了解整个系统的硬件状态,如CPU,内存,显卡,网卡等。嗯,这一步windows算和它是一家。不分彼此。
2: 接下来,就是主机读取MBR(硬盘的第一个扇区)里的boot loader了。这个可是重点哦,据说troubleshooting里就会考这点,给个坏了的loader,叫你修正。windows不支持linux的分区格式。所以,用windows的boot。ini是查不到linux的系统的。一般我装系统都是先装 windows再装linux,然后用grub来做boot loader。两个字:省心!因为linux不像windows那么小气。grub可是支持windows分区格式的哦。
3: 接上一步,主机读取boot loader后,会读取里面的信息,知道谁跟谁是待在哪,假如主机想进入linux系统,读取到linux核心是在/boot文件目录中后,将此核心加载到内存中。开始了接下来的分析启动之旅。
4: OK,第一个运行程序是谁?就是/sbin/init程序。不信,就用top程序看下,是不是PID为1的就是这个东东,它,可是万物之祖啊,我简称它是女娲娘娘(不喜欢亚当夏娃)。
· 5: init首先查找启动等级(run-level)。因为启动等级不同,其运行脚本(也就是服务)会不同。默认的等级有以下几项:
0 - halt (系统直接关机)
1 - single user mode (单人模式,用于系统维护时使用)
2 - Multi-user, without NFS (类似3模式,不过少了NFS服务)
3 - Full multi-user mode (完整模式,不过,是文本模式)
4 - unused (系统保留功能)
5 - X11 (与3模式类似,不过,是X终端显示)
6 - reboot (重新开机)
(不要选择0或4,6 否则,进步了系统的)
· 6: OK。系统知道自己的启动等级后,接下来,不是去启动服务,而是,先设置好主机运行环境。读取的文件是/etc/rc。d/rc。sysinit文件。那究竟要设置哪些环境呢?
· 设置网络环境/etc/sysconfig/network,如主机名,网关,IP,DNS等。
· 挂载/proc。此文件是个特殊文件,大小为0,因为它是在内存当中。里面东东最好别删。
· 根据内核在开机时的结果/proc/sys/kernel/modprobe。开始进行周边设备的侦测。
· 载入用户自定义的模块/etc/sysconfig/modules/*。modules
· 读取/etc/sysctl。conf文件对内核进行设定。
· 设定时间,终端字体,硬盘LVM或RAID功能,以fsck进行磁盘检测。
· 将开机状况记录到/var/log/dmesg中。(可以用命令dmesg查看结果)
· 7: OK,接下来,就是启动系统服务了,不同的run-level会有不同的服务启动。到/etc/rc。d目录中,不同的level会有不同的目录。如启动 3模式,会有个rc3。d目录,里面就保存着服务。其中,S(start)开头的表明开机启动,K(kill)开头的表明开机不启动。数字表示启动顺序。数字越小,启动越早。
注意,他们都是连接到etc/rc。d/init。d/目录中的相关文件。所以,想手工启动某一服务,可以用"/etc/rc。d/init。 d/某个服务 start"启动哦。相反,我们也可以把某个服务ln(链接命令)到不同run-level的目录中。记得打上S或者K+数字哦。
· 8: 读取服务后,主机会读取/etc/rc。d/rc。local文件。所以,如果需要什么开机启动的话,可以写个脚本或命令到这里面来。就不用像上面那么麻烦。以后删除也方便。
OK,经过一番长途跋涉后,系统终于可以安心的开启shell了。
12、符号链接和硬链接的区别
1。不允许给目录创建硬链接
2。只有在同一文件系统中的文件之间才能创建连接.
13、保存当前磁盘分区的分区表
[root@portal01 ~]# mkdir /mnt/sdb
You have new mail in /var/spool/mail/root
[root@portal01 ~]# mount /dev/sdb /mnt/sdb/
mount: you must specify the filesystem type
[root@portal01 ~]# mkfs
mkfs mkfs.ext2 mkfs.ext4 mkfs.msdos
mkfs.cramfs mkfs.ext3 mkfs.ext4dev mkfs.vfat
[root@portal01 ~]# mkfs.ext4 -t /dev/sdb
Usage: mkfs.ext4 [-c|-l filename] [-b block-size] [-f fragment-size]
[-i bytes-per-inode] [-I inode-size] [-J journal-options]
[-G meta group size] [-N number-of-inodes]
[-m reserved-blocks-percentage] [-o creator-os]
[-g blocks-per-group] [-L volume-label] [-M last-mounted-directory]
[-O feature[,...]] [-r fs-revision] [-E extended-option[,...]]
[-T fs-type] [-U UUID] [-jnqvFKSV] device [blocks-count]
[root@portal01 ~]# mkfs /dev/sdb
mke2fs 1.41.12 (17-May-2010)
/dev/sdb is entire device, not just one partition!
无论如何也要继续? (y,n) y
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
正在写入inode表: 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@portal01 ~]# mount /dev/sdb
sdb sdb1
[root@portal01 ~]# mount /dev/sdb /mnt/sdb/
[root@portal01 ~]# fdisk -l
Disk /dev/sda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00068e62
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 7833 62401536 8e Linux LVM
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sdb doesn't contain a valid partition table
Disk /dev/mapper/vg_portal01-lv_root: 30.5 GB, 30463229952 bytes
255 heads, 63 sectors/track, 3703 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/vg_portal01-lv_root doesn't contain a valid partition table
Disk /dev/mapper/vg_portal01-lv_swap: 8422 MB, 8422162432 bytes
255 heads, 63 sectors/track, 1023 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/vg_portal01-lv_swap doesn't contain a valid partition table
Disk /dev/mapper/vg_portal01-lv_home: 25.0 GB, 25010634752 bytes
255 heads, 63 sectors/track, 3040 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/vg_portal01-lv_home doesn't contain a valid partition table
[root@portal01 ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/mapper/vg_portal01-lv_root
28G 17G 11G 61% /
tmpfs 2.9G 264K 2.9G 1% /dev/shm
/dev/sda1 485M 36M 424M 8% /boot
/dev/mapper/vg_portal01-lv_home
23G 432M 22G 2% /home
df: "/mnt/hgfs": 输入/输出错误
/dev/sdb 5.0G 10M 4.7G 1% /mnt/sdb
15、手动安装grub
16、改内核参数
由于Linux的内核参数信息都存在内存中,因此可以通过命令直接修改,并且修改后直接生效。但是,当系统重新启动后,原来设置的参数值就会丢失,而系统每次启动时都会自动去/etc/sysctl.conf文件中读取内核参数,因此将内核的参数配置写入这个文件中,是一个比较好的选择。
首先打开/etc/sysctl.conf文件,查看如下两行的设置值,这里是:
kernel.shmall = 2097152 kernel.shmmax = 4294967295 如果系统默认的配置比这里给出的值大,就不要修改原有配置。同时在/etc/sysctl.conf文件最后,添加以下内容:
fs.file-max = 6553600 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 1024 65000 net.core.rmem_default = 4194304 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 262144 这里的"fs.file-max = 6553600"其实是由"fs.file-max = 512 * PROCESSES"得到的,我们指定PROCESSES的值为12800,即为"fs.file-max =512 *12800"。
sysctl.conf文件修改完毕后,接着执行"sysctl -p"使设置生效。
[root@localhost ~]# sysctl -p 常用的内核参数的含义如下。
kernel.shmmax:表示单个共享内存段的最大值,以字节为单位,此值一般为物理内存的一半,不过大一点也没关系,这里设定的为4GB,即"4294967295/1024/1024/1024=4G"。
kernel.shmmni:表示单个共享内存段的最小值,一般为4kB,即4096bit。
kernel.shmall:表示可用共享内存的总量,单位是页,在32位系统上一页等于4kB,也就是4096字节。
fs.file-max:表示文件句柄的最大数量。文件句柄表示在Linux系统中可以打开的文件数量。
ip_local_port_range:表示端口的范围,为指定的内容。
kernel.sem:表示设置的信号量,这4个参数内容大小固定。
net.core.rmem_default:表示接收套接字缓冲区大小的缺省值(以字节为单位)。
net.core.rmem_max :表示接收套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_default:表示发送套接字缓冲区大小的缺省值(以字节为单位)。
net.core.wmem_max:表示发送套接字缓冲区大小的最大值(以字节为单位)。
17、在1-39内取随机数
#!/bin/bash
declare -i number=$RANDOM%39+1echo $number
18、限定apache每秒钟连接数为1,峰值为3
19、FTP主动与被动模式
FTP是仅基于TCP的服务,不支持UDP。与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21(命令端口)和20(数据端口)。但FTP工作方式的不同,数据端口并不总是20。这就是主动与被动FTP的最大不同之处。
(一)主动FTP
主动方式的FTP是这样的:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:
1. 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)
2. FTP服务器的21端口到大于1024的端口。 (服务器响应客户端的控制端口)
3. FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)
4. 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)
(二)被动FTP
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。
在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。
当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
1. 从任何大于1024的端口到服务器的21端口(客户端初始化的连接)
2. 服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的连接)
3. 从任何大于1024端口到服务器的大于1024端口(客户端初始化数据连接到服务器指定的任意端口)
4. 服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)
以上关于主动和被动FTP的解释,可以简单概括为以下两点:
1、主动FTP:
命令连接:客户端 >1024端口 -> 服务器 21端口
数据连接:客户端 >1024端口 <- 服务器 20端口
2、被动FTP:
命令连接:客户端 >1024端口 -> 服务器 21端口
数据连接:客户端 >1024端口 -> 服务器 >1024端口
(三)主动与被动FTP优缺点:
主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。
20、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
21、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
grep “\:[0-9]\{1\}\:” /etc/inittab
22、怎么把自己写的脚本添加到服务里面,即可以使用service命令来调用
23、写一个脚本,实现批量添加20个用户,用户名为user1-20,密码为user后面跟5个随机字符
#!/bin/bash
#author:ligths
pd=$RANDOM
if [ ${#pd} \> 4 ];then
for ((i=1;i<=20;i++));
do
useradd user$i
passwd user$pd
done
else
echo “error”
fi
24、写一个脚本,实现判断192.168.1.0/24网络里,当前在线的IP有哪些,能ping通则认为在线
#!/bin/bash
for ip in `seq 1 255`
do
{
ping -c 1 192.168.1.$ip > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo 192.168.1.$ip UP
else
echo 192.168.1.$ip DOWN
fi
}&
done
wait
25、写一个脚本,判断一个指定的脚本是否是语法错误;如果有错误,则提醒用户键入Q或者q无视错误并退出其它任何键可以通过vim打开这个指定的脚本;
[root@localhost tmp]# cat checksh.sh
#!/bin/bash
read -p “please input check script-> ” file
if [ -f $file ]; then
sh -n $file > /dev/null 2>&1
if [ $? -ne 0 ]; then
read -p “You input $file syntax error,[Type q to exit or Type vim toedit]” answer
case $answer in
q | Q)
exit 0
;;
vim)
vim $file
;;
*)
exit 0
;;
esac
fi
else
echo “$file not exist”
exit 1
fi
26、写一个脚本:
1、创建一个函数,能接受两个参数:
1)第一个参数为URL,即可下载的文件;第二个参数为目录,即下载后保存的位置;
2)如果用户给的目录不存在,则提示用户是否创建;如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本;
3)如果给的目录存在,则下载文件;下载命令执行结束后测试文件下载成功与否;如果成功,则返回0给调用脚本,否则,返回52给调用脚本;
27、写一个脚本:
1、创建一个函数,可以接受一个磁盘设备路径(如/dev/sdb)作为参数;在真正开始后面步骤之前提醒用户有危险,并让用户选择是否继续;
而后将此磁盘设备上的所有分区清空(提示,使用命令dd if=/dev/zero of=/dev/sdb bs=512 count=1实现,注意其中的设备路径不要写错了
;如果此步骤失败,返回67给主程序;
接着在此磁盘设备上创建两个主分区,一个大小为100M,一个大小为1G;如果此步骤失败,返回68给主程序;
格式化此两分区,文件系统类型为ext3;如果此步骤失败,返回69给主程序;
如果上述过程都正常,返回0给主程序;
2、调用此函数;并通过接收函数执行的返回值来判断其执行情况,并将信息显示出来;
linux查看某一个文件里面的内容
grep -i "342623198703167514" -A 0 *.csv
阅读(2066) | 评论(0) | 转发(2) |