zoukankan      html  css  js  c++  java
  • Linux常见疑难问答

    Linux常见疑难问答

    1)按a~z顺序排列启动服务进程。

    #exportLC_ALL=C           #英文环境变量设置,主要用于解决乱码问题

    #chkconfig –list | grep [z-a] : | grepon $ sort

    2)显示运行级别为5的所有服务。

    #chkconfig –list | grep 5: on | sort

    3)如何停止某个(如cups)服务。

    #chkconfig cups off ; /etc/init.d/cups stop

    4)修改了/etc/profile文件配置,怎么立即生效。

    #source/etc/profile以及“/etc/profile”点后面是空格。

    5)如何使用find工具找到用户cgweb30天内的文件并备份归档。

    #find / -user cgweb –ctime -30 –exec tar azvf /home/backup/cgweb -new-files.tgz {} ;

    6)如何将分区表信息转成文件。

    #fdisk –l /dev/sda > /etc/config-data/sda-fdisk.txt     #注意:要先建立config-data目录

    如何将硬盘分区表和MBR备份到文件:

    #dd if=/dev/sda of=/etc/config-data/sda-boot.img bs=512 count=1

    7)如何提高TCP/IP堆栈安全。

    通常有个办法是通过“#echo1>/proc/sys/net/ipv4/tcp_syncookied”来阻止SYNFlood攻击,其实这并不安全,可靠的做法是发送到/etc/sysctl.conf文件中,需要将下列代码加到/etc/sysctl.conf中:

    net.ipv4.tcp_syncookies=1

    net.ipv4.ip_default_ttl=61

    net.ipv4.conf.all.accept_redirects=0

    net.ipv4.conf.all.send_redirects=0

    如果机器多的话可以将这个配置文件存储在FTP服务器(如sysctl-add,服务器IP:10.10.10.1),然后从FTP中提取出来,追加到现有的/etc/sysctl.conf文件尾:

    wge tftp://10.10.10.1/pub/sysctl-add

    catsystl-add >>/etc/sysctl.conf

    8)如何把/var目录下的所有RPM文件找出来并删除。

    #find /var –name "*.rpm" –exec rm {};

    9)如何使用SSH在远程主机(10.10.10.1)上建立目录(upload)并上传文件。

    #ssh root@10.10.10.1 mkdir/var/www/html/upload

    #scp *.cfg root@10.10.10.1 : /var/www/html/upload/

    10)如何用find命令查找某个文件夹下包含所有指定关键字的所有文件。

    例如需要查找/etc/tomcat5目录下,包含JAVA_OPTS关键字的所有文件:

    #find /etc/tomcat5 -name "*" | xargs grep "JAVA_OPTS"

    11)把旧系统上的/etc/passwd/etc/shadows复制到新系统里,可以继续使用吗。

    千万不要在新的机器上复制原来的/etc/apsswd,通常在新旧两个系统之间有很多服务都会产生冲突,如果是同一张盘安装出来的系统,那么可以验证一下系统的crypt/hash函数是否相同(即密码采用相同的算法加密的),切忌不要在新系统中的配置文件上复制整个/etc/的配置文件。

    12)如何实时查看日志文件的信息(排除网络故障时常用,例如DNSDHCP调试问题)。

    #tail –f /var/log/messages        #如不用-f选项,默认状态的tail只能列出文件的最后10

    13)如何找到/etc/目录下所有文件中,内容包括字符串“ip_forward”的文件,并打印到屏幕。

    #find /etc/ -exec grep "ip_forward" '{}' ;-print

    14)如何搜索当前系统里文件大小超过1GB的文件(排除磁盘空间方面的故障时常用)。

    #find / -size +1024000k –exec du –h '{}' ; -print

    15)远程服务器上没有磁带机,怎么对它进行异地备份。

    #tar cvf -/home/etc | ssh root@10.101.10.1 "cat > /mnt/backup/remoteserver 1_$
    (date+%Y-%m-%d).tar"

    SSH对于管理员来说是再熟悉不过了,那么如何利用它从Linux服务器通过网络传输标准输出(stdout)到备份服务器呢?以上命令即可,注意date后面有个空格。

    16)普通用户cgweb登录系统后如何在根用户才能访问的位置中新建目录呢。

    # su --c "mkdir /root/cgwebtmp"

    17)如何只显示top里的几个进程。

    如果只显示几个进程,可在top中输入要查看进程的PID

    #top –p 4300 –p4500

    18)如何查看一个命令在执行期间发生了什么系统调用。

    #strace /bin/ping 10.10.10.12 > /tmp/ping_out

    在这行命令中,通过在strace命令中运行ping命令并将标准错误定向到/tmp/ping_out文件,很多处理消息就会发送到ping_out文件中。如果要查看ping从哪里获得了它的信息,则将找到所有出现open的地方来查看它打开过哪些文件:

    #grep ^open /tmp/ping.out

    除此之外,还可以让它跟踪子进程,例如要跟踪open系统在上面例子中的调用:

    # strace –e trace= open/bin/ping 10.10.10.1

    除了打开库之外,ping命令还打开了配置文件resolv.conf来查找IP地址,进而找出它从何处将域名解析为IP地址。

    19)如何测定X server服务器的性能。

    当显卡驱动装好后可使用下列命令来检测Xserver服务器的性能:

    # X11perf –repeat 3 –reps 10 –subs 10 100 –circulate

    上述例子的X11perf命令从下至上运行一套窗口。circulate动作将重复3次,第一组有10个窗口,分别运行10次(共100次循环运行),第二组有100个窗口,依然分别循环运行10次(共1000次循环)。在每组的最后,将显示出重复的总次数和完成整套动作所花费的时间。

    还可以用下列命令来测试性能:

    #X11perf –repeat 2 –reps 1000 –ftext

    1000个包含80个字符的文本发送给显示器(-ftext):

    #X11perf –repeat2 –reps 500 –copywinwin 500

    从一个窗口把500×500平方像素大小的方块复制到另一个窗口(-copywinwin500):

    #X11perf –repeat2 –reps 800 –scroll 500

    垂直滚动500×500平方像素大小的框800次。

    20)如何查看安装的GPG密钥。

    #rpm –qa gpg-pubkey*

    gpg-pubkey-0dfb3188-41ed929b

    其中gpg-pubkey-0dfb3188-41ed929b代表RedHat公司用于签名软件包的共有密钥。如果想获得有关这种公有密钥的信息,可以继续使用RPM命令:

    #rpm –qi gpg -pubkey -0dfb3188-41ed929b|less

    在输出的Summary代码行中密钥表示为适用于OpenEnterpriseServer,最后输入q退出。

    21)如何检查包的签名信息。

    通过以下命令可以检查RPM遭破坏和修改的内容:

    # rpm –check sig– vv fedora-logos-1.2.-1.noarch.rpm

    22)在Xen下安装虚拟机。

    #virt-install-nvm-mysql-r512-f/vm/vm-mysql.img-s10--nographics-p-lftp://ip/pub/iso

    通过上面很简单的一句代码就可以在Xen下安装虚拟机了。

    23)查看当前的TCP连接数。

    除了使用常规的netstat-na|more等命令以外,还可利用以下命令实现精确统计连接数量:

    #netstat -n|awk'/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}'

    TIME_WAIT29

    FIN_WAIT1152

    FIN_WAIT22

    ESTABLISHED26

    SYN_RECV16

    24)访问远程共享的目录。

    将如下代码放到/etc/fstab中:

    //ip/share1/mnt/dsmbfsdefaults,auto,username=name,password=pass00

    其中,IP是远程机器的IP地址,是共享目录的共享名,“/mnt/d”是要将该分区mount到本地Linux的目录,namepass是可以访问该共享目录的用户名和密码。

    25)如何加大Tomcat连接数。

    Tomcat配置文件server.xml中,应同时加大maxProcessorsacceptCount这两个参数的值。

    26)如何修改Tomcat的端口数。

    编辑/etc/tomcat5/server.xml找到其中的connectorport="8080"maxHttpHeaderSize="8192",这一行更改8080这个值为其他1024以上未用端口即可。

    27)如何加大Tomcat的内存。

    Tomcat默认的内存为128,在一些大型应用上,显然不够用,所以我们需要手动加大内存:

    #vi /etc/tomcat5/tomcat5.conf

    找到“JAVA_OPTS=-Xmin0.1–Xmaxf0.3代码,Xmin0.1表示初始内存大小,更改成Xmin256mXmaxf0.3表示最大内存大小,修改为512m,退出重启即可生效。

    28)如何将大的tar包分卷压缩或合并。

    以每卷500MB为例,tar分卷压缩:

    #tar cvz pf -somedir | split -d -b 500m

    -d不是split的选项,是Shell的选项,表示将tar命令的输出作为split的输入。

    tar多卷合并:

    catx*>mytarfile.tar.gz

    29)如何去掉文本中多余的回车符(尤其是从Windows复制到Linux的情况)。

    sed's/^M//'test.sh>back.sh

    注意“^M”是敲“ctrl+V+M”得到的。

    或者:

    dos2unixtest.sh

    30)如何改变RedHat的系统语言/字符集。

    vi/etc/sysconfig/i18n文件修改成:LANG="en_US"X-window会显示英文界面,修改为:LANG="zh_CN.GB18030"X-window会显示中文界面。

    31)查找权限位为S的文件。

    #find . -typef(-perm-04000-o-perm-02000)-execls-lg{};

    32)查找或删除正在使用某文件的进程。

    fuserfilename

    fuser-kfilename

    33)如何让用户的密码必须具有一定的长度,并且符合复杂度。

    vi/etc/login.defs

    修改PASS_MIN_LEN

    34如何删除3天以前的所有内容包括目录名和目录中的文件)。

    1find.-ctime+3-execrm-rf{};

    2find./-mtime+3-print|xargsrm-f–r

    35)如何不改变inode而清空一个文件。

    >filename

    36Oracle的安装程序为什么显示乱码。

    现在Oracle的安装程序对中文的支持存在问题,建议使用英文界面来安装,在执行runinstaller之前,执行:

    export;exportLC_ALL=C

    37Linux下文件和目录的颜色代表什么含义。

    蓝色表示目录;绿色表示可执行文件;红色表示压缩文件;浅蓝色表示链接文件;灰色表示其他文件;红色闪烁表示链接的文件有问题了;黄色是设备文件,包括blockcharfifo。利用dircolors–p可查看默认的颜色设置,包括各种颜色和“粗体”、下划线、闪烁等定义。

    38)如何查看有多少活动httpd的脚本,每隔3s刷新一次。

    编辑如下脚本:

    #!/bin/sh

    while(true)

    do

    pstree|grep"*[httpd]$"|sed's/.*-([0-9][0-9]*)*[httpd]$/1/'

    sleep3

    done

    39)如何让cp命令在运行中显示进度。

    cp-r-vdir1dir2

    cp-a-d-vdir1dir2

    40)编辑/etc/inittab后不重启电脑,配置直接生效。

    initq

    41)让Linux连续执行几个命令,出错停止执行。

    command1&&command2&&command3

    42)屏幕变花时怎么办。

    当不小心cat了一个并不是文本的文件时,屏幕会变花,那么可以按两下“Enter”键,以及“Reset”键,屏幕就可恢复正常了。

    43)在命令行中列出本机IP地址,而不是得到网卡信息。

    #ifconfig | grep "inet"|cut-c0-36|sed-e's/[a-zA-Z:]//g'

    hostname–i

    44)如何不显示grep进程本身。

    #ps -aux | grep httpd | grep -v grep

    grep-vgrep可以取消显示所执行的grep本身这个进程,-v参数是不显示所列出的进程名。

    45)删除目录中含输入关键字的文件。

    #find /mnt/ebook/ -typef -exec grep"输入关键字"{};-print-execrm{};

    46)让cron中的任务不回馈信息,假设5分钟检查一次邮件。

    0-59/5****/usr/local/bin/fetchmail>/dev/null2>&1

    47)如何开启多个X-window

    startx默认以display0.0开启第一个X-window,通过传递参数给Xserver可以开启多个X-window

    #startx--:1.0

    #startx--:2.0

    ...

    然后利用Ctrl+Alt+F7/F8键进行切换。

    48)如何产生一个长度固定(例如文件长度为1MB)的空文件,即每个字节的值全为0x00

    #dd if=/dev/zero of=/tmp/zero_file bs=1024 count=1024

    49)查找当前目录下的文件并更改扩展名。

    例如将当前目录下的所有扩展名为.cf的文件更改为.conf

    #find ./ -name "*.cf"-execrename.conf'{}';

    50)如何删除RPM-e删除不了的包。

    如果在删除包之前删除了包的目录,执行以下代码:

    #rpm -e --noscripts

    如果系统里一个包被装两次(由于某些异常引起的),则执行以下代码:

    #rpm -emulti-installed-pkgs–allmatches

    51)如何防止某个关键文件被修改。

    Linux下,有些配置文件是不允许任何人(包括root)修改的。为了防止被误删或修改,可以设定该文件的“不可修改位(Immutable)”。命令如下:

    #chattr+i/etc/fstab

    如果需要修改文件则采用下面的命令:

    #chattr-i/etc/fstab

    52)怎样限制一个用户可以启动的进程数。

    先确定一下/etc/pam.d/login文件中如下一行代码是否存在:

    sessionrequired/lib/security/pam_limits.so

    然后编辑/etc/security/limits.conf,在其中可以设置限制用户的进程数、CPU占用率和内存使用率等,如hardnproc30就是指限制30个进程。

    53)如何限制Shell命令记录的大小。

    在默认情况下,bash会在文件$HOME/.bash_history中存放多达500条命令记录。有时根据具体的系统不同,默认记录条数也不同。系统中每个用户的主目录下都有一个这样的文件。为了系统的安全,在此强烈建议用户限制该文件的大小,如果是root用户,更应该减小这个条目数。用户可以编辑/etc/profile文件,修改其中的选项如下:HISTFILESIZE=5HISTSIZE=5,这样就将记录的命令条数减少到5条。

    54)使用RPM命令时没有任何响应,怎么办。

    #rm -rf /var/lib/rpm/__db.*

    55)如何防止用户修改某文件。

    对系统中的一些关键文件和个人重要资料,可以通过文件权限来保护,例如将文件属性设为600。另外,如果Linux使用的是ext2ext3文件系统,还可以使用chattr命令,给文件加上i属性,即使root用户也不能直接修改或删除这类文件,以有效防止意外修改情况的发生。具体命令如下:

    #chattr +i passwd

    可使用如下命令去除i属性:

    #chattr –i passwd

    56)解决WebLogicLinux下启动关闭很慢的问题。

    启动、关闭WebLogic时,时间非常长,其原因是JDK中存在一个Bug,解决办法是在WebLogic启动脚本里setDomainEnv.sh加入以下内容:

    JAVA_OPTIONS="${JAVA_OPTIONS}-Djava.security.egd=file:/dev/./urandom"

    exportJAVA_OPTIONS

    建议操作前先将setDomainEnv.sh进行备份。

    57)如何实时查看某一进程的资源消耗情况。

    首先查看这个进程的PID,假设PID500。利用“top-p500命令,就可以实时查看这个进程的资源消耗情况了。

    58)如何删除一类进程。

    #ps -efww|grepLOCAL=NO|grep-vgrep|cut-c9-15|xargskill-9

    59)如何手动修改IP

    编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件,然后执行如下命令:

    ifdowneth0;ifupeth0

    60)如何查看22端口现在运行什么程序。

    #lsof -i :22

    61)如何开启IP转发。

    编辑/etc/sysctl.conf,例如:

    net.ipv4.ip_forward=0

    将其修改为:

    net.ipv4.ip_forward=1

    重启后生效,利用“sysctl-a”查看可知已开启IP转发。

    62)如何允许/禁止root通过SSH登录系统。

    通过修改“sshd_config:PermitRootLoginno|yes”即可实现。

    63)如何让Linux自动同步时间。

    #vi /etc/crontab

    添加以下代码

    0001**rootrdate-stime.nist.gov

    64)如何让SSH登录系统永久不断开。

    修改自己HOME目录下的.bash_profile文件,加上exportTMOUT=1000000(以s为单位),然后运行source.bash_profile

    65)防止任何人使用su命令成为root

    vi/etc/pam.d/su中加入以下代码:

    authsufficient/lib/security/pam_rootok.sodebug

    authrequired/lib/security/pam_wheel.sogroup=wheel

    /etc/pam.d/su配置文件中定义wheel组。

    66)如何给一块网卡绑定多个IP

    Linux系统中的一块网卡,最多支持256IP,执行以下代码:

    #cd /etc/sysconfig/network-scripts

    #cp ifcfg-eth0 ifcfg-eth0:1

    #vi ifcfg-eth0:1

    修改IP和设备名即可。

    67Linux下清空ARP表的命令。

    #arp-d-a (适用于BSD)

    forHOSTinarp|sed'/Address/d'|awk'{print$1}';doarp-d$HOST;done

    68)如何使Linux支持NAT

    #echo1>/proc/sys/net/ipv4/ip_forward

    #iptables-tnat-IPOSTROUTING-jMASQUERADE

    69)临时修改网卡MAC地址的方法。

    l关闭网卡:/sbin/ifconfig eth0 down

    l修改地址:/sbin/ifconfig eth0 hwether 00:AA:BB:CCD:EE

    l启动网卡:/sbin/ifconfig eth0 up

    70)更改eth0为混杂模式。

    打开网卡eth0,改成混杂模式:

    #ifconfig eth0 promisc

    关闭混杂模式:

    #ifconfig eth0 –promisc

    71)如何让SSH只允许指定的用户登录。

    /etc/pam.d/sshd文件中加入:

    authrequiredpam_listfile.soitem=usersense=allowfile=/etc/sshusersonerr=fail

    然后在/etc下建立sshusers文件,编辑这个文件,加入允许使用SSH服务的用户名,重新启动SSHD服务即可。

    72)在Linux下如何绑定IP地址和硬件地址。

    可以编辑一个地址对应文件,里面记录了IP地址和硬件地址的对应关系,然后执行“arp–f地址对应文件”。如果没有指定地址对应文件,则通常情况下以默认文件/etc/ethers为准。地址对应文件的格式如下:

    192.168.12.100:0D:61:27:58:E3

    192.168.12.200:40:F4:2A:2E:DC

    192.168.12.300:0A:EB:5E:BA:AE

    73)已知网络中一个机器的硬件地址,如何知道它所对应的IP地址。

    Linux下,假定要查“00:0A:EB:27:17:B9这样一个硬件地址所对应的IP地址,可以使用以下命令:

    #cat /proc/net/arp|grep00:0A:EB:27:17:B9

    192.168.2.540x10x600:0A:EB:27:17:B9*eth2

    另外,还可以利用“arp-a”命令查询:

    #arp–a|grep00:0A:EB:27:17:B9

    192.168.2.54at00:0A:EB:27:17:B9[ether]oneth2

    74)基于ApacheHTTPDSendmail服务在启动时被挂起了,如何解决此问题。

    遇到此类问题,请确认/etc/hosts文件中是否包含如下一行:

    127.0.0.1localhost.localdomainlocalhost

    注意:127.0.0.1是网络的回路地址

    75)如何使Linux系统对ping不回应。

    要使Linuxping没反应,也就是使Linux系统忽略ICMP包,可用如下命令实现:

    #echo1>/proc/sys/net/ipv4/icmp-echo-ignore-all

    若想恢复,可用如下命令实现:

    #echo 0>/proc/sys/net/ipv4/icmp-echo-ignore-all

    76rsync同步压缩传输文件或目录。

    rsync-azessh--deletesample_dir/remote_host:remote_dir/sample_dir/

    77)无须输入密码使用SSH密钥登录。

    ssh-keygen-b1024-trsa

    sshserver"mkdir.ssh;chmod0700.ssh"

    scp~/.ssh/id_rsa.pubserver:~/.ssh/authorized_keys

    这样就不再提示输入密码,直接可以登录Server了,对文件复制、同步等操作都比较方便。

    78)命令行下发送带附件的邮件。

    #cat<mailcontent.txt>|mutt-s"title"-a<attachfile>mail@address

    这里:<mailcontent.txt>代表邮件正文内容。<attachfile>代表本地需要作为附件的文件名。

    79)如何增加httpd动态模块,而不重新编译Apache(以deflate模块为例)。

    进入httpd源代码目录:

    #cd /usr/local/src/httpd-2.2.6

    执行httpd安装后目录中的bin/apxs文件:

    /usr/local/apache2/bin/apxs-ciamodules/metadata/mod_deflate.c

    重新启动httpd

    #service httpd restart

    80)如何变更sendmail邮件的默认存储位置。

    如果sendmail使用Procmail作为MDA(邮件投递代理)的话,可以使用Procmail来指定接收邮件的默认存储位置。方法如下:

    建立/etc/procmailrc文件。

    编辑/etc/procmailrc文件,指定环境变量MAIL的路径,如设为“$HOME/mbox”等。

    81)新编译生成的GCC,使用的标准连接库都位于/usr/local/lib下,但使用的默认连接路径是/usr/lib,怎样添加。

    exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

    将其写到“~/.bash_profile”里面即可。

    82)为什么编写的Shell脚本无法运行。

    脚本权限要为可执行“#chmod+xtest.sh”。且脚本所在的目录在环境变量PATH中,或者直接执行“#./test.sh”。

    83MySQL的数据库存放在什么地方。

    如果使用RPM包安装,应该位于/var/lib/mysql目录下,以数据库名为目录名。

    如果源码安装在/usr/local/mysql中,应该位于/usr/local/mysql/var中,以数据库名为目录名。

    84)忘记了MySQLroot口令怎么办。

    #service mysql stop

    #mysqld_safe--skip-grant-tables&

    #mysqladmin -u user password'newpassword''

    #mysqladminflush -privileges

    85)让MySQL以大内存方式启动。

    /usr/share/mysql下的某个“mysql-*.cnf”(如1GB内存时为mysql-huge.cnf)复制为“/etc/mysql.cnf”文件,并重启MySQL

    86)通过SSH挂载远程主机上的文件夹。

    sshfsname@server:/path/to/folder/path/to/mount/point

    87)显示消耗内存最多的10个运行中的进程,以内存使用量排序。

    #ps aux |sort -nk +4 | tail

    88)利用Shell邮件通知。

    #echo "Testmail" | mail -s“主题测试root@sampl.com

    注意:主机的SMTP服务需要启用。

    89)如何在OracleRAC环境中找出由于系统程序崩溃而产生的core文件。

    由于系统程序发生崩溃时,内核会把当前内存映射到core文件中,我们以X86环境为例,使用下面命令找到core的位置,还能看出是由哪个文件引起的。

    #find /u01 -name core.* -exec ls -l thr {}; | awk'{print$9}' | xargs file

    /u01/oracle/product/crs/log/rac1/crsd/core.4107:ELF32-bitLSBcorefileIntel80386,version1(SYSV),SVR4-style,from'crsd.bin'

    由上面这条命令,可以看出core.4107的产生,是由“crsd.bin”文件引起的。

    90)如何快速扫描出某网段(例如:192.168.150.0/24)内开机的服务器。

    第一种简单方法:

    #nmap –sP 192.168.150.*

    第二种简单方法,使用一行Shell脚本:

    for((i=1;i<=254;i++)); do ping 192.168.150.$i;done

    91)如何禁止某个进程的网络连接。

    我们可以先根据进程找到端口号,然后把发出去的包直接丢掉,或者使用owner功能。

    #iptables –m owner –pid -owner <processid> -j REJECT

    92)如何快速关闭SELinux

    #/usr/sbin/setenforce0立刻关闭SELinux

    #/usr/sbin/setenforce1立刻启用SELinux

    也可以编辑配置文件达到同样的目的:

    #vi /etc/selinux/conf

    setSELINUX=disabled

    93)如何监听80端口发给client-A或从client-A发送过来的数据包

    #tcpdump –i eth0 host client-A and port80

    如果你的计算机有多个网卡,请在-i后面指定好网卡。

    (94)如何实现系统某用户登陆后不显示用户名称?
    我们将系统用户的shell环境变量中/sbin/bash改成/sbin/nologin即可,注意不能将root用户,改成/sbin/nologin,否则无法登陆。nologin的作用还可以限制某些用户通过ssh登陆到shell上

  • 相关阅读:
    Ubuntu 16 安装redis客户端
    crontab 参数详解
    PHP模拟登录发送闪存
    Nginx配置端口访问的网站
    Linux 增加对外开放的端口
    Linux 实用指令之查看端口开启情况
    无敌的极路由
    不同的域名可以指向同一个项目
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
    Redis 创建多个端口
  • 原文地址:https://www.cnblogs.com/chenguang/p/3741212.html
Copyright © 2011-2022 走看看