Skip to content Skip to main navigation Skip to footer

Linux

How to Upgrade Ubuntu 18.04 LTS to 20.04 LTS

This post will guide you how to upgrade your Ubuntu operating system from 18.04 LTS to the latest 20.04 LTS through command line and Ubuntu GUI successfully. Linux 18.04 or 16.04.

Ubuntu 20.04 LTS was officially released on Apri 23, 2020. And this version is the latest Ubuntu Long Term Support release. And it will provide support with security patches and updates available until 2025. If you are using an older version, such as: 18.04, 19.04, and maybe you wish to upgrade it to the latest version. And the below steps will guide you how to safely upgrade Ubuntu operating system from Ubuntu 18.04 LTS to the latest version through two methods.

 Prerequisites


Before you upgrade, and you need first upgrade your current Ubuntu 18.04 to the latest point release version. Just run the following commands using command line,type:

$ sudo apt update
$ sudo apt upgrade

Then you need to reboot your Ubuntu system with the following command:

$ sudo reboot
  • You also need to make sure your computer has sufficient free disk space. And you should have 25 GB of free space for a new installation of Ubuntu.
  • The upgrade process can take 2 hours time or more.

Upgrade to Latest 20.04 LTS using a Graphical Guided Wizard


You can run the following command in a terminal window, and it will then lauch the graphical guided wizard.

$ sudo do-release-upgrade -d -f DistUpgradeViewGtk3

It will launch the upgrade process using a Gtk3-based GUI.

upgrade ubuntu 1804 to 2004

Then click “upgrade” button to start upgrading.

upgrade ubuntu 1804 to 2004_2

You may be asked one or two questions during the upgrade, and you just need to answer every question with “yes” or “y”.

upgrade ubuntu 1804 to 2004_3

Clicking “Start Upgrade” button to start the upgrade.

upgrade ubuntu 1804 to 2004_4

From the above screenshot, you can see that the upgrade process will download up to more than 1900 new packages. So you need to make sure that the disk space is enough.

upgrade ubuntu 1804 to 2004_5

after all new packages were installed on your computer, and you still need to restart the system to complete the upgrade. click “Restart Now” button.

upgrade ubuntu 1804 to 2004_6

Then the upgrade should complete, and you should see that you have logged into the latest Ubuntu 20.04 desktop.

upgrade ubuntu 1804 to 2004_7

Upgrade to Latest 20.04 LTS on the Command Line


If you want to upgrade Ubuntu 18.04 to 20.04 via command line interface, and you can use the following command. The upgrade process on the command line is very similar to what we have already upgraded via GUI wizard.

$ sudo do-release-upgrade -d

Conclusion


You should know that how to upgrade from Ubuntu 18.04 LTS to 20.04 LTs through two methods: graphical wizards and command line utilities.

Linux 删除文件的特定行(第一行,前n行,最后一行)

当我们编辑文件的时候时候,我们通过可以vi/vim编辑器删除文件中的特定行,比如删除第一行或者删除最后行或者符合某个模式的行。 但是如何在shell脚本里来删除特定的符合条件的行呢。 这时候,我们可以使用linux下强大的文本处理工具sed。 我们可以通过该命令删除指定的行,或者通过sed命令提供的正则表达式,来查找符合模式匹配的行,然后将其删除。

删除文件的第一行

如果要删除文件的行,并将其立即应用到源文件,在sed命令里需要使用-i 选项,否则,只是将删除文件内容显示出来,但不会真正的删除文件的内容。 执行下面的命令:

# sed -i '1d' fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line3  c
root@devops:~/osetc# sed -i '1d' fio.txt
root@devops:~/osetc# cat fio.txt
line2  b
line3  c

删除文件的最后一行

通过sed命令删除文件里的最后一行,和上面的删除行的命令类似,都是需要-i选项,并结合d选项进行删除操作,但需要指定要删除行的行号,最后一行可以用$来表示,执行下面命令:

# sed -i '$d' fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line3  c
root@devops:~/osetc# sed -i '$d' fio.txt
root@devops:~/osetc# cat fio.txt
line1  a
line2  b

删除文件中指定行

通过上面的两个例子,我们应该知道要删除特定行号的行,只需要将行号跟着d命令的前面即可,比如要删除第3行的内容,可以执行下面的命令:

# sed -i '3d' fio.txt

删除包含特定字符的行

如果你想删除包含特定字符的行,只要通过sed命令的模式匹配部分指定特定字符,然后通过d命令将其删除。
比如要删除包含line2的行,执行下面的命令:

# sed -i '/line2/d' fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line3  c
root@devops:~/osetc# sed -i '/line2/d' fio.txt
root@devops:~/osetc# cat fio.txt
line1  a
line3  c

在文件中增加一行内容

我们可以通过sed命令在特定的某行后面增加新行,比如要在包含line1的行后增加一行“line2   b”, 执行下面的命令:

# sed -i '/line1/a line2  b' fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
line1  a
line3  c
root@devops:~/osetc# sed -i '/line1/a line2  b' fio.txt
root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line3  c
root@devops:~/osetc#

在文件中替换特定的行

如果想把文件中的包含line3的行中line3 字符串替换成line4, 可以通过sed工具下的s命令来实现,执行下面的命令:

# sed -i 's/line3/line4/g' fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line3  c
root@devops:~/osetc# sed -i 's/line3/line4/g' fio.txt
root@devops:~/osetc# cat fio.txt
line1  a
line2  b
line4  c

从上面的例子我们可以看到sed是一个非常易用好用的linux文本行处理工具。


99%的人还阅读了:

Linux下通过grep命令恢复被删文件的内容

我们之前已经介绍了在linux下通过构建一个类似于windows的回收站来恢复被删除的文件。 今天我们再来介绍一个通过grep命令来恢复被删除文件的内容的方法。 我们都知道,当linux的删除命令rm执行删除文件操作后,文件数据并没有从磁盘存储上移除,所以只要文件内容没有被覆盖掉,文件内容依然有被恢复的可能性。
因为linux下一切数据皆以文件的形式存放,依旧是说磁盘设备也是以文件的形式存在。所以我们可以通过grep命令来过滤查找出我们删除文件的内容,并将其重定向到另一个文件里,这也也就能达到恢复文件的目的。
1# 确定根目录所在的磁盘
执行命令:

#mount | grep sda

命令输出如下:

root@devops:~/osetc# mount | grep sda
/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

2# 删除文件
执行rm命令:

#rm fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
delete line 1
delete line 2
delete line 3
delte line 4
delete line 5
root@devops:~/osetc# rm fio.txt

3# 通过grep命令恢复被删除文件fio.txt 的内容到recovery.txt里
执行下面命令:

#grep -a -B 10 -A 10 'delete line 1' /dev/sda1 >recovery.txt

参数介绍
-a 将二进制文件作为普通文件看待
-B, –before-content 过滤出指定模式串之前的特定数目的行
-A, –after-content 过滤出指定模式匹配之后的特定数目的行


99%的人还阅读了:

Linux 快速删除百万级文件(rsync命令)

当我们想在linux下删除文件的时候,我们会想到通过rm命令来进行删除操作。 而当我们要删除的文件很多的时候,我们会遇到“/bin/rm: Argument list too long“的问题,上一篇文章我们已经介绍了通过find命令或者xargs命令或者自定义shell脚本的方法来避免这种错误。但是如果你想删除几十万或者上百万的文件的话,如果使用之前介绍的方法,效率会很低,删除所需要的时间也会很长。本文会介绍一种通过rsync命令来快速删除大批量文件的方法,并与之前的find命令结合rm命令删除文件的方法进行比较。

Find命令结合rm 命令删除文件

假如要删除当前目录下的上百万个文件(下面的例子以删除1000个文件做比较),执行下面的命令,并通过time命令来查看find /rm命令组合删除文件所需要的时间, 执行命令如下:

#time find  ./ -name * --exec rm –rf {} \;

命令输出如下:

root@devops:~/osetc# time find  ./ -name "*.txt" -exec rm  {} \;
real    0m0.543s
user    0m0.475s
sys     0m0.062s

通过rsync 命令快速删除百万级文件

首先要创建一个空的目录文件,执行命令:

#mkdir   /root/tmp

再通过rsync命令删除当前目录下的大批量文件,执行下面的命令:

#time rsync --delete-before -a -H --stats /root/tmp/  ./

命令输出如下:

root@devops:~/osetc# time rsync --delete-before -a -H --stats /root/tmp/  ./
Number of files: 1 (dir: 1)
Number of created files: 0
Number of deleted files: 1,002 (reg: 1,001, dir: 1)
Number of regular files transferred: 0
Total file size: 0 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total byes sent: 47
Total bytes received: 13,942
sent 47 bytes  received 13,942 bytes  27,978.00 bytes/sec
total size is 0  speedup is 0.00
real    0m0.058s
user    0m0.013s
sys     0m0.022s
root@devops:~/osetc#

从上面两个命令输出的执行时间,我们可以看到find命令运行时间是rsync命令删除文件所需要时间的9倍之多。故而,如果以后我们有这种删除百万级别的文件操作的时候,可以考虑使用rsync命令。


99%的人还阅读了:

Linux 下/bin/rm: Argument list too long 解决方法(最全)

本文将会通过不同方法来解决在Linux命令行下通过rm命令删除大批量文件的时候遇到的“Argument list too long”的问题。 因为linux命令对传入的参数个数有限制,所以超过限制的时候,系统就会输出参数过长的问题。

查看命令行参数允许的长度大小

执行命令如下:

#getconf ARG_MAX

命令输出如下:

root@devops:~# getconf ARG_MAX
2097152

通过AWK命令结合RM命令来删除大批量文件

当通过rm命令直接删除大批量文件的时候,系统会报错,那么可以将rm命令结合AWK命令来进行删除操作,避免“/bin/rm: Argument list too long”的问题。
例如要删除当前目录下所有文件,执行下面命令:

# ls -l |awk '{print "rm -rf" , $9}'| sh

命令输出如下:

root@devops:~/osetc# ls -l
总用量 24
-rw-r--r-- 1 root root 24202 3月  18 23:30 fio1.txt
-rw-r--r-- 1 root root     0 3月  24 23:53 fio.txt
root@devops:~/osetc# ls -l |awk '{print "rm -rf" , $9}'| sh
root@devops:~/osetc# ls -l
总用量 0

通过xargs命令结合rm命令删除大批量文件

我们可以通过执行ls命令将要删除命令列出,并将其输出通过管道符传给xargs命令,然后再调用rm命令来删除传过来的文件,进而解决 “/bin/rm: Argument list too long”的问题。执行命令如下:

# ls | xargs rm -rf

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio.txt
root@devops:~/osetc# ls | xargs rm -rf
root@devops:~/osetc# ls

通过find命令结合xargs命令来删除大批量文件

我们也可以通过find命令查找要删除的文件,然后将查找到的文件传给xargs命令,并通过rm命令删除,这样也可以解决“/bin/rm: Argument list too long”的问题。
执行下面的命令:

# find ./ -name "*.txt" | xargs rm -rf

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio.txt
root@devops:~/osetc# find ./ -name "*.txt" | xargs rm -rf
root@devops:~/osetc# ls
root@devops:~/osetc#

通过自定义shell脚本来删除大批量文件

我们也可以通过自己编写一个shell 脚本来实现大批量文件的删除,比如通过for循环来删除每个文件,这也就可避免““/bin/rm: Argument list too long”的问题。
要执行的脚本如下:

#!/bin/bash
DIR='/root/osetc'  # 指定要删除的文件的目录
cd $DIR   # 切换目录到指定删除文件的目录
for I in `ls`
do      #将ls命令的输出传给for循环
    rm -rf $I
done

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio.txt
root@devops:~# vi delF.sh
root@devops:~# chmod u+x delF.sh
root@devops:~# ./delF.sh
root@devops:~# ls /root/osetc/
root@devops:~#

99%的人还阅读了:

5 种Linux下清空大文件的方法(删除大文件内容)

本文将会讲述如何在linux系统下清空大文件或者说删除大文件内容的5种不同的方法。 当我们想要清空一个大文件里的内容的时候,我们通常会通过vi编辑器打开这个文件,然后将其内容删除,但是如果文件内容太多,或者文件太大的话,打开文件有可能会很慢或者清空文件的内容会很费时间。 下面我们将会介绍5种简单易用的清空文件的内容的方法呢?

通过重定向来清空文件内容

在linux清空普通文件内容尤其是大文件内容,最简单的方法是通过重定向来实现, 比如要清空当前目录下的大文件fio.txt 内容,执行下面的命令:

# > fio.txt

命令输出如下:

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1.0G 3月  24 23:35 fio.txt
root@devops:~/osetc# >fio.txt
root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 0 3月  24 23:36 fio.txt

 通过true命令重定向清空文件

通过true命令的输出结果重定向到指定要清空的大文件里,执行命令如下:

#true > fio.txt

命令输出如下:

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1.0G 3月  24 23:42 fio.txt
root@devops:~/osetc# true > fio.txt
root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 0 3月  24 23:42 fio.txt

通过cat /dev/null 设备重定向来清空文件内容

Linux 下的/dev/null 文件是一种特设的设备文件,该命令可以将任何写入其中的数据丢弃掉。 我们可以将该空设备的输出重定向到要清空的大文件里,就可。 执行下面的命令:

#cat /dev/null > fio.txt

命令输出如下:

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1.0G 3月  24 23:42 fio.txt
root@devops:~/osetc# true > fio.txt
root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 0 3月  24 23:42 fio.txt

通过echo命令清空文件内容

使用echo命令将一个空字符串重定向到指定的文件,也可以将该文件清空。
执行命令:

#echo “ “ > fio.txt

命令输出如下:

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1.0G 3月  24 23:50 fio.txt
root@devops:~/osetc# echo "" >fio.txt
root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1 3月  24 23:51 fio.txt

通过truncate 命令清空内容

通过linux下truncate命令将指定的文件大小缩小到给定的大小,比如大小为0,这样就达到清空文件的内容的目的。
执行下面的命令:

#truncate –s 0 fio.txt

命令输出如下:

root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 1.0G 3月  24 23:53 fio.txt
root@devops:~/osetc# truncate -s 0 fio.txt
root@devops:~/osetc# ls -alh fio.txt
-rw-r--r-- 1 root root 0 3月  24 23:53 fio.txt
root@devops:~/osetc#

99%的人还阅读了:

Linux 自动删除N小时或分钟前的文件

在前一篇文章我们介绍了如何在Linux系统下自动删除N天前的日志文件,那么本文将会讲述如何在Linux系统下自动删除N小时之前的特定文件或者日志文件。
在日常工作中,经常会有定时清空相关程序目录下特定时间前生成的日志文件的需求。当然实现的具体方法和上篇文章类似,但唯一不同的是find命令查找文件的依据的条件或者参数不同,-mtime是要查找n*24之前或者之内的相关文件,该参数无法实现小于24小时的特定时间的文件查找,当然find命令提供了另一个类似的参数-mmin, 该参数可以让find命令按指定的分钟来查找文件。

Linux下自动删除2小时之前的日志文件

将上篇文章的find 命令更新如下:

find /var/log/ -mmin +120 -name message* -exec rm -rf {} \;

执行完上面的命令后,在/var/log/目录下所有的120分钟或者说2小时以前生成的或者更改过的以message开头的日志文件都会被删掉。
如果要删除两小时之内的日志文件,使用下面的命令:

find /var/log/ -mmin -120 -name message* -exec rm -rf {} \;

将上面的find命令加到Linux系统的任务计划crontab里,即可实现自动定时删除文件。


99%的人还阅读了:

Linux 自动删除日志文件(N天或特定日期)

本文将会讲述如何在Linux系统下自动删除特定日期或者N天系统生成的日志文件或者归档文件或者特定某类文件。
Linux系统和windows系统一样,在系统的运行过程中,会不断的产生日志文件或者日志归档文件,或者其它不同类型的日志文件。随着日志的不断输出到文件里,文件的大小也会越来越大,这样该日志文件就会占据越来多的磁盘空间,而且有可能会将可用存储空间全部占用,这样就有可能导致你的机器越来越慢,相应的服务也会停止。为了防止日志文件变大后,导致的系统不能正常访问,我们需要定期的清理或者删除这些日志文件。

查看Linux系统日志文件

对于Linux 下APACHE服务器里,系统会产生访问时的日志文件,错误访问日志文件,MySQL数据库服务也会产生相应的日志文件, 大多数Linux系统的默认系统日志文件都会放在/var/log/目录下,通过下执行下面的命令来查看Linux系统的日志文件:

#ls /var/log/*

命令输出如下:

root@devops:~# ls /var/log/*
alternatives.log bootstrap.log gpu-manager.log syslog.2.gz
alternatives.log.1 btmp installer syslog.3.gz
......

Linux系统下自动删除日志文件的方
首先我们要查找到你要删除的N天生成日志文件,之后再通过Linux rm命令删除日志文件。 之前我们已经介绍过Linux如何根据文件日期删除文件的方法,所以我们现在只需要在该方法的基础上,实现如何自动删除就可以了。我们可通过Linux下的定时任务命令crontab来实现特定日期日志文件的自动删除。
实例:Linux 下自动删除5天前更改或生成的系统日志文件,参照下面的几个步骤,
1# 确定删除特定日期的日志文件的命令,可以使用下面的命令

find /var/log/ -mtime +5 -name message* -exec rm -rf {} \;

该命令解释如下:

find 是Linux下的查找文件命令
/var/log/ 是指定要查找的文件路径
-mtime 是find 命令下参数,用来指定find命令要根据文件的更改日期来进行查找
+5 是指查找五天前生成或更改过的所有文件(如果是-5, 是指查找五天内生成或更改过的文件)
-name 是指定要查找的文件的模式匹配
-exec 是指当find查找到文件后,要执行的动作。比如删除操作
rm -rf 是指要删除查找到的文件

2# 创建shell脚本文件,将上面的命令加入到脚本里,方便以后调用
执行下面命令:

#vi autoDeleteLog.sh

输入下面的脚本内容:

#!/bin/bash
find /var/log/ -mtime +5 -name message* -exec rm -rf {} \;

保存退出。
3# 为脚本文件增加可执行权
执行下面命令:

#chmod u+x autoDeleteLog.sh

4# 定制计划任务,自动执行autoDeleteLog.sh 脚本
执行命令:

#crontab -e

输入下面的内容:

00 02 * * * /root/autoDeleteLog.sh >/dev/null 2>&1

这样在每天的凌晨2点钟的时候,系统会自动执行日志删除脚本对过期的日志文件进行删除操作。
4# 查看定制的计划任
执行命令如下:

#crontab -l

如果要自动删除特定目录下特定日期的归档文件,只需要将第二步中删除日志文件的命令换成下面的命令:

find /var/log/ -mtime +5 -name *.tgz -exec rm -rf {} \;

如果需要自动删除特定日期的Nginx服务器的日志文件,可以执行下面的脚本,并按照上面的方法,将其通过crontab命令加到系统的计划任务里即可。

#!/bin/bash
find /usr/local/nginx/logs -mtime +5 -type f -name *.log | xargs rm -f

Linux 删除文件名为乱码的文件

本文将会讲述如何通过Linux rm命令删除文件名包含特殊字符或者乱码文件的方法。

在Linux系统下我们主要用来删除文件的命令是rm或者unlink命令,但是当文件名为乱码或者包含乱码的文件是,我们就无法选择要删除的文件名,这样就会导致无法删除这些文件名为乱码或者包含特殊字符的文件。
当然这种乱码文件名的文件大多数情况都是由于不正常的操作,比如突然中断从服务器文件上传或者下载某些文件的时候,就有可能导致乱码文件名的出现。

Linux下删除以短横杠或者减号“-””开头的文件名的文件

当文件名以减号“-”开头的时候,如果我们使用rm 命令来删除该文件的时候,系统会报错,那么删除这种文件,可以通过rm命令后面接–, 来删除。
执行命令如下:

#rm -- -fio.txt

Linux下删除文件名包含特殊字符的文件

如果文件名包含的是系统里可以打印的特殊字符的文件,这个时候我们可以使用转义字符或者双引号来传给rm命令。
如果要删除当前目录下的名为“!”的文件,那么可以执行下面的命令:

# rm  \!

或者

# rm “!“

命令输出日下:

root@devops:~# ls !
!
root@devops:~# ls -al !
-rw-r--r-- 1 root root 0 3月  20 22:20 !
root@devops:~# rm \!
root@devops:~# ls !
ls: 无法访问'!': 没有那个文件或目录
root@devops:~# rm "!"
root@devops:~#

Linux 中删除文件名为乱码的文件

对于文件名包含乱码的文件,这些乱码字符大多数都是系统里无法打印出来的,所以你也无法选择或者从键盘输入,这个时候我们可以通过文件的inode号,再结合find命令,将文件删除。
首先我们通过执行ll -i 命令来获取当前目录下的文件的inode号,比如inode号为131104,然后执行下面的find命令,将该inode所对应的文件删除。执行命令如下:

# find ./ -inum 131104 -print -exec rm {} \;

命令输出如下:

root@devops:~/osetc# ll -i
总用量 32
131103 drwxr-xr-x 2 root root  4096 3月  20 22:28 ./
131073 drwx------ 7 root root  4096 3月  20 22:22 ../
131104 -rw-r--r-- 1 root root     0 3月  20 22:28 $%^%$^
131089 -rw-r--r-- 1 root root 24202 3月  18 23:30 fio1.txt
root@devops:~/osetc# find ./ -inum 131104 -print -exec rm {} \;
./$%^%$^
root@devops:~/osetc# ll -i
总用量 32
131103 drwxr-xr-x 2 root root  4096 3月  20 22:30 ./
131073 drwx------ 7 root root  4096 3月  20 22:22 ../
131089 -rw-r--r-- 1 root root 24202 3月  18 23:30 fio1.txt

或者使用另一个命令,如下:

#find -inum 131104 -delete

命令输出如下:

root@devops:~/osetc# find -inum 131104 -delete
root@devops:~/osetc# ll -i
总用量 32
13113 drwxr-xr-x 2 root root  4096 3月  20 22:32 ./
131073 drwx------ 7 root root  4096 3月  20 22:22 ../
131089 -rw-r--r-- 1 root root 24202 3月  18 23:30 fio1.txt

从上面我们可以看到,inode号为131104的文件被删除了。


Linux 下回收站实现(恢复删除文件)

本文主要讲述通过shell 脚本来实现Linux系统下的类似于windows系统中的回收站的功能。 默认情况下,大多数的Linux发型版本都没有实现回收站的功能,这样就会导致当你错误的删除了系统里某个文件或者错误的执行rm –rf * 命令将某些文件删除后, 我们没有很好的办法恢复已经被误删掉的文件。
下面我们通过简单的shell 脚本函数来重新定义一个trash函数,该函数将会实现当我们执行rm命令删除文件的时候,只是将文件先移动到某个临时的目录文件里,这样就可以起到一个简单回收站功能,如果需要撤销文件删除操作,我们也可以通过重新定义的另一个函数undo,来恢复被删掉的文件,该函数会将你指定的文件从临时目录里恢复到当前目录。
下面是我们实现的shell 函数:

undo( ) # 该函数用来撤销或者恢复被删掉的文件
{
    mv –i ~/.tmp/$@ ./
}
trash( ) # 该函数用来删除指定文件,并将其移动到临时目录~/.tmp/目录里
{
    mv $@  ~/.tmp/
}
cleartrash()  # 该函数用来删除回收站(临时目录)里的所有文件
{
    read -p "要删除回收站里的所有文件吗?[n]" confirm
    [ $confirm == 'y' ] || [ $confirm == 'Y' ]  && /bin/rm -rf ~/.Trash/*
}

具体的执行步骤如下
1# 创建临时目录文件或者回收站文件
该目录用来临时存放被删除的文件,执行命令:

#mkdir –p  ~/.tmp

2# 将下面的脚本添加到bash shell 的环境变量设置文件.bashrc 里, 保存退出

alias rm=trash
alias ud=undo
alias tl='ls  ~/.tmp'
undo() # 该函数用来撤销或者恢复被删掉的文件
{
    mv -i ~/.tmp/$@ ./
}
trash() # 该函数用来删除指定文件,并将其移动到临时目录~/.tmp/目录里
{
    mv $@  ~/.tmp/
}
cleartrash()  # 该函数用来删除回收站(临时目录)里的所有文件
{
    read -p "要删除回收站里的所有文件吗?[n]" confirm
    [ $confirm == 'y' ] || [ $confirm == 'Y' ]  && /bin/rm -rf ~/.Trash/*
}

3# 执行 .bashrc 脚本

# source ./bashrc

现在我们可以放心的使用rm命令来删除文件了,如果需要恢复被删掉的某个文件,可以使用ud 命令进行撤销删除操作,如果需要列出回收站里的文件,那么可以使用tl 命令。当回收站里的文件确实需要删除了,可以使用cleartrash命令进行清空操作。
下面来看实例操作:

$ rm fio1.txt  fio2.txt     # 删除当前目录下的fio1.txt 和fio2.txt 文件
$ tl                                # 查看回收站里文件
$ ud fio1.txt       #从回收站里恢复之前删掉的fio1.txt 文件
$ cleartrash     # 清空回收站

 
命令输出如下:

root@devops:~/osetc# rm fio1.txt fio2.txt
root@devops:~/osetc# ls
root@devops:~/osetc# tl
fio1.txt  fio2.txt
root@devops:~/osetc# ud fio1.txt
root@devops:~/osetc# tl
fio2.txt
root@devops:~/osetc# ls
fio1.txt
root@devops:~/osetc# cleartrash
要删除回收站里的所有文件吗?[n]y
root@devops:~/osetc#

99%的人还阅读了:

5 种Linux下 删除除指定文件外的所有文件的方法

本文将会讲述Linux系统下通过rm命令删除除指定文件外的其它所有的文件的5中不同的方法。 当我们在当前目录下或者指定目录下,想删除同类文件或者符合同一模式匹配规则的文件,但需要排除其中的某个或多个文件,只是简单的使用rm命令是无法实现。所以我们需要结合其它的linux命令来实现我们的删除文件操作。
下面我们通过5中不同的方法来介绍删除指定文件外的文件的方法:
方法一: 可以先将需要排除的文件,从当前目录中移动到一个临时目录里,然后执行rm命令将其与的文件删除,最后再将刚才移动走的文件从新拷贝回来。
执行的命令如下:

#mv  保留文件 /tmp
# rm –rf  删除文件
#mv  /tmp/保留文件 .

方法二:使用Linux中的通配符来排除保留文件
我们可以使用Linux系统中的通配符 !来排除指定的文件,
比如我们要删除当前目录下除了fio1.txt文件的所有其它文件, 执行下面的命令:

#rm –i  !(fio1.txt)

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt
root@devops:~/osetc# rm -i !(fio1.txt)
rm:是否删除普通文件 'fio2.txt'? y
root@devops:~/osetc# ls
fio1.txt

如果要删除当前目录下,除fio2.txt 和fio3.txt两个文件外的所有文件,可以执行下面的命令:

#rm -i   !(fio2.txt|fio3.txt)

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio3.txt
root@devops:~/osetc# rm -i !(fio2.txt|fio3.txt)
rm:是否删除普通文件 'fio1.txt'? y
root@devops:~/osetc# ls
fio2.txt  fio3.txt

方法三:  通过结合grep和xargs命令来删除指定文件外的所有文件
在linux里grep命令里有一个-v 的参数, 该参数可以排除通过grep命令输出的特定的文件,这样grep命令输出的其它文件就是需要删除的。 然后将输出结果过通过管道符传给xargs命令,将其删除。比如要删除除fio1.txt 文件的所有其它文件,执行下面命令:

#ls | grep –v fio1.txt | xargs rm

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio3.txt
root@devops:~/osetc# ls | grep -v fio1.txt | xargs rm
root@devops:~/osetc# ls
fio1.txt

方法四:改进方法三, 用find命令来替换ls命令,查找要删除的文件然后通过grep –v在过滤掉需要排除的文件
执行命令如下:

#find ./ | grep –v fio1.txt | xargs rm

方法五:通过fing命令结合xargs 或者其exec参数删除除指定文件外的文件
我们可以通过执行下面的两个find命令组合来删除除指定文件外的所有其它文件,比如要删除除fio1.txt外的所有其它文件,执行命令如下:

# find ./ ! -name fio1.* -exec rm -rf {} \;

或者

#find ./ ! –name fio1.*  | xargs rm –rf

99%的人还阅读了:

Linux unlink命令

本文将会讲述Linux系统下unlink删除文件命令的用法。 Unlink 命令会直接调用linux系统下的unlink系统函数,来删除指定的某一个文件。

Linux unlink 命令格式及参数

命令格式如下:

Unlink {文件名}
Unlink {选项}

Unlink 参数如下:

--help – 显示该命令的帮助信息并退出命令
--version –显示命令的版本信息并退出命令

Unlink命令只有提供了上面的两个参数。

Linux unlink命令实例

1# 删除当前目录下的名为fio.txt 的文件,执行下面的命令:

# unlink fio.txt

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio.txt
root@devops:~/osetc# unlink fio.txt
root@devops:~/osetc# ls
fio1.txt  fio2.txt

上面我提到过,unlink 命令只能同时删除一个文件,当你指定多个文件时,系统会提示错误信息。 如下:

root@devops:~/osetc# unlink fio1.txt fio2.txt
unlink: 额外的操作数 "fio2.txt"
Try 'unlink --help' for more information.
root@devops:~/osetc#

Linux unlink系统函数

Unlink函数会从文件系统中删除一个指定的文件名称。如果名称是文件的最后一个连接,并且没有其它进程将文件打开,名称对应的文件会实际被删除。
Unlink函数用法:

#include
int unlink(const char *pathname);

Unlink函数参数:
pathname:指向需解除连接的文件名。
返回说明:

成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EACCES:权能不足
EFAULT: 内存空间不可访问
EIO:发生输入输出错误
EISDIR:pathname索引的是目录
ELOOP :路径解析的过程中存在太多的符号连接
ENAMETOOLONG:路径名超出可允许的长度
ENOENT:路径名部分内容表示的目录不存在,或者是悬浮的连接
ENOMEM: 核心内存不足
ENOTDIR:路径名的部分内容不是目录
EPERM : 文件系统不支持文件或者目录的解除连接,也有可能是权限步允许
EROFS :文件系统只读

当文件的连接数为0的时候,并且没有任何进程打开这个文件,这个文件的存储数据才会被真正的删除。

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
    int fd;
    char buf[32];
    struct stat buff;
    if((fd=open("temp.txt",O_RDWR|O_CREAT|O_TRUNC,S_IRWXU))<0){
        printf("create file error!\n");
    }
    stat("temp.txt",&buff);
    printf("temp.link=%d\n",buff.st_nlink);
    link("temp.txt","test.txt");
    stat("test.txt",&buff);
    printf("after link the tem.link =%d\n",buff.st_nlink);
    if(unlink("temp.txt")<0){
        printf("unlink error !\n");
    }
    stat("temp.txt",&buff);
    printf("after unlink tem.link=%d\n",buff.st_nlink);
    if(write(fd,"temp",5)<0){
        printf("write wrror!\n");
    }
    if((lseek(fd,0,SEEK_SET))==-1){
       printf("lseek error!\n");
    }
    if((read(fd,buf,5))<0){
        printf("read error!\n");
    }
    printf("%s\n",buf);
    return 0;
}

99%的人还阅读了:

Linux rm 删除命令

当我们在Linux系统下,如果要删除某个特定的文件或者特定目录下的特定文件,那么首先会想到的是Linux系统的系统命令rm。 本文将会对rm删除文件命令的使用方法做详细的介绍,包括rm命令的命令格式,包含的命令选项,并且通过实例来介绍rm命令的不同选项。

Linux rm 命令介绍

rm 命令在英语里就是remove单词的缩写,就是删除的意思, 该命令主要用来删除linux文件系统下的文件。当使用rm命令的递归参数-rf的话,也可用来删除目录文件。
我们可以在命令行下通过rm命令来删除指定的每一个文件。 默认情况下,该命令不会删除目录文件。
Linux rm命令删除文件的处理过程只是删除文件所对应的inode链接,但并不会删除或者清空文件的存储数据,当删除完成后,系统会将该文件的存储空间标记为空闲状态,这样就别的程序就可以将数据写入这个空间里了。 也就是说,当你删除一个文件的时候,文件数据并没有被改变,只是不会再关联到这个文件名了。
因为文件数据本身并没有被销货,所以当rm命令将指向数据区域的指针删除掉后, 该数据就不能再被访问了, 而且也没法注销该删除操作。不像我们在windows系统里, 我们可以去回收站里将删除的文件恢复到以前的存储位置。
注意: 如果你想彻底的将文件数据从磁盘里删掉,我们可以通过使用Linux系统的shred命令将指定文件所在存储数据测试重新覆盖,这样数据就彻底无法再恢复了。

Linux rm 命令格式及参数

rm [参数] {文件名}

参数如下:

-f, –force 强制删除文件, 不做任何删除操作的提示
-I, –interactive  进行交互式的删除操作
-r, -R, –recursive 将对指定目录中的所有目录或子目录进行递归性的删除
-v, –verbose 显示删除操作的详细信息
–help 显示命令的使用帮助信息
-d, 删除空目录文件,rm –d 和rmdir命令的效果是一样的。

对于-I选项,当rm 命令在删除文件的时候,如果指定的文件超过3个话,rm 命令在删除文件前,会做出删除提示。

Linux rm命令删除目录文件

默认情况下,rm命令不会删除目录文件的。 但是如果使用了-r/-R/–recursive 选项的话, rm命令将会删除所有匹配到的文件或者目录。
如果指定的目录是个空目录,那么可以使用rm命令的-d/–dir 参数来删除。
如果需要删除当前目录下的空目录文件fio1,执行下面的命令:

#rm –d  fio1

命令输出如下:

root@devops:~/osetc# rm fio1/
rm: 无法删除'fio1/': 是一个目录
root@devops:~/osetc# rm -d fio1/
root@devops:~/osetc#

如果要删除目录下的所有普通文件或者子目录文件,并不做删除确认提示,可以使用rm命令的-rf选项做递归删除,执行下面命令:

#rm –rf  fio

Linux rm命令删除普通文件

如果要删除当前目录下的普通文件 fio.txt, 当要删除的文件是写保护的,系统会做出删除确认提示,执行下面的命令:

#rm fio.txt

命令输出如下

root@devops:~/osetc# ll
总用量 16
drwxr-xr-x 2 root root 4096 3月  17 22:01 ./
drwx------ 6 root root 4096 3月  15 21:48 ../
-rw-r--r-- 1 root root    5 3月  15 21:24 fio5.txt
-r--r--r-- 1 root root    5 3月  17 22:01 fio.txt
root@devops:~/osetc# rm fio.txt
root@devops:~/osetc#

Linux rm 命令强制删除文件

如果想在删除文件的时候,不想有任何确认提示,那么可以使用rm命令的-f选项,执行下面的命令:

#rm –f fio.txt

命令输出如下:

root@devops:~/osetc# ls
fio5.txt  fio.txt
root@devops:~/osetc# rm -f fio.txt
root@devops:~/osetc# ls
fio5.txt
root@devops:~/osetc#

Linux rm 命令结合通配符删除所有.txt 文件

如果想删除目录下所有的文件名以.txt 结尾的文件,那么可以使用Linux下通配符来匹配要删除的文件,然后结合rm命令进行删除。执行下面的命令:

# rm *.txt

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio3.txt
root@devops:~/osetc# rm *.txt
root@devops:~/osetc# ls
root@devops:~/osetc#

Linux rm 命令交互式删除文件

如果想在删除文件的时候,让系统做出删除文件的确认提示,这样可以做交互式的确认,当输入Y的时候,就进行文件删除,当输入N的时候,文件不会被删除。 可以使用linux rm 命令的-i选项,执行命令如下:

# rm –i fio5. Txt

命令输出如下:

root@devops:~/osetc# ls
fio5.txt
root@devops:~/osetc# rm -i fio5.txt
rm:是否删除普通文件 'fio5.txt'? y
root@devops:~/osetc# ls
root@devops:~/osetc#

Linux rm 命令删除文件时并排除特定的某个文件或某类文件

当我们在删除某类文件的时候,想排除特定的文件,此时如果简单的执行rm命令是无法完成的。 我们需要通过结合其它的Linux命令,比如grep命令来实现。 比如我们先删除目录下的除了fio.txt文件的所有.txt文件,那么可以执行下面的命令:

# rm `ls *.txt|grep –v fio.txt`

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio3.txt
root@devops:~/osetc# rm -i `ls *.txt| grep -v fio1.txt`
rm:是否删除普通文件 'fio2.txt'? y
rm:是否删除普通文件 'fio3.txt'? y
root@devops:~/osetc# ls
fio1.txt

Linux rm命令和unlink命令的不同之处

Linux里rm 命令 和unlink 命令主要功能都是用来删除指定的文件。 但是unlink命令只能同时删除一个文件,而且不能删除目录文件,并且该命令没有任何的附加选项。只是用来通过调用unlink函数来删除指定的一个文件。而在大多数版本的linux系统中的rm命令包含了我们上面介绍的参数,并可以做交互式操作,安全检查,条件删除以及递归操作等。

root@devops:~/osetc# unlink fio1.txt fio2.txt
unlink: 额外的操作数 "fio2.txt"
Try 'unlink --help' for more information.

99%的人还阅读了:

Linux 删除文件

本文将会讲述如何在Linux系统下删除文件的方法,以及如何在命令行下删除某个文件中特定的内容行, 或者删除特定日期创建的文件或者目录。
目录如下:

Linux 删除文件命令

在CentOS,Redhat,或者Ubuntu等类Unix系统下,我们主要用来删除文件或文件夹目录的方法是通过执行rm 命令或者 unlink命令。 下面我们来看删除文件命令rm的用法介绍:
rm 命令是Unix或者Linux系统下的主要用来文件系统中删除文件的命令。 当然,在大多数的系统里, 当我们想删除一个文件的时候,需要当前用对对该文件或者目录有写或者可执行的权限。
rm 命令格式:

rm {文件名}
rm [参数] {文件名}
unlink {文件名}
rm –f –r  {文件名}

 
rm 命令参数:
-f, –force 强制删除文件, 不做任何删除操作的提示
-I, –interactive  进行交互式的删除操作
-r, -R, –recursive 将对指定目录中的所有目录或子目录进行递归性的删除
-v, –verbose 显示删除操作的详细信息
–help 显示命令的使用帮助信息
通常情况下,我们会将-r 和-f来同时使用,这样就可以删除所有指定的文件或者目录,并且没有任何的操作提示信息输出。

Linux 删除单个文件夹或目录

让我们来看一个使用rm命令删除指定文件或者目录的例子, 假如你想删除当前目录下的一个文件名为fio.txt 的文件, 执行下面的命令:

# rm fio.txt

Linux 删除多个文件

如果想通过rm命令同时删除多个文件,可以将多个文件的文件名作为rm命令的参数, 执行下面的命令来删除当前目录下的fio1.txt, fio2.txt, fio3.txt 文件:

# rm fio1.txt  fio2.txt fio3.txt

命令输出如下:

root@devops:~/osetc# ls
fio1.txt  fio2.txt  fio3.txt
root@devops:~/osetc# rm fio1.txt fio2.txt fio3.txt
root@devops:~/osetc# ls
root@devops:~/osetc#

Linux 递归删除特定目录下的所有文件

如果要删除的目录里还包含了多层的子目录或者子目录依旧还有目录,那么如果想删除目录里的所有子目录和文件,这个时候我们需要使用rm命令的-rf参数,比如,如果你想删除当前目录下的fio目录,执行下面的命令:

# rm –rf fio

命令输出如下:

root@devops:~/osetc# ls fio
fio1.txt  fio2.txt  fio3.txt  subfio
root@devops:~/osetc# rm -rf fio
root@devops:~/osetc# ls fio
ls: 无法访问'fio': 没有那个文件或目录
root@devops:~/osetc#

Linux 删除文件并做删除前交互确认

如果你想在删除每个文件的时候,让系统都做出确认删除提示,那么这样可以让你不会错误的删除文件,比如要删除当前目录下的fio1.txt, 执行下面的命令:

# rm –I fio1.txt

命令输出如下:

root@devops:~/osetc# ls
fio1.txt
root@devops:~/osetc# rm -i fio1.txt
rm:是否删除普通文件 'fio1.txt'? y
root@devops:~/osetc# ls
root@devops:~/osetc#

Linux 显示删除文件时的信息

如果你想看到linux系统在删除你指定的文件或目录的时候,显示详细的处理信息,那么可以使用rm命令的-v选项,执行命令如下:

$ rm –v fio1.txt

命令输出如下:

root@devops:~/osetc# ls
fio1.txt
root@devops:~/osetc# rm -v fio1.txt
已删除'fio1.txt'
root@devops:~/osetc# ls
root@devops:~/osetc#

Linux系统下删除空目录文件

如果想删除特定目录下的,那么可以使用linux下的另一个命令rmdir, 执行下面命令:

# rmdir fio
# rmdir fio1

Linux下删除文件里的文件列表中的文件

如果某个文件里包含了很多需要删除的特定的文件路径, 那么我们可以使用rm命令并结合下xargs 命令来进行文件删除操作。
例如要删除当前目录下的fio.txt 文件中的列出的所有文件, 那么可以执行下面的命令:

# xargs rm -v < fio.txt

命令输出如下:

root@devops:~/osetc# cat fio.txt
/root/osetc/fio1/file1.txt
/root/osetc/fio1/file2.txt
/root/osetc/fio1/file3.txt
root@devops:~/osetc# xargs rm -v <fio.txt
已删除'/root/osetc/fio1/file1.txt'
已删除'/root/osetc/fio1/file2.txt'
已删除'/root/osetc/fio1/file3.txt'

注意:当你使用rm命令来删除文件的时候,千万不要运行”rm –rf / “ 命令, 因为这个命令会将linux系统的根目录下的所有文件都删除掉,这样的话,就会导致你的系统挂掉。

Linux删除文件名中以连字符或者减号开头的文件名

如果你想删除某个文件名中包含特殊字符的文件,无法直接使用rm 命令进行文件删除。 这个时候我们需要在rm命令后的加上双连字符,再跟文件名即可。 比如要删除-fio.txt文件,就可以执行下面的命令:

# rm -- -fio.txt

 Linux 通过文件的inode号删除文件

当我们在系统里看到文件名里包含乱码或者特殊字符的文件时候,如果简单的通过rm命令来删除文件的话,会失败的。 这个时候该怎么办? 我们可以通过文件唯一的inode号来进行删除操作。
我们需要结合find命令来根据文件的inode号来进行删除文件操作。
查看文件的inode
在linux系统里可以通过命令ll –i 来查看当前目录下的文件的详细信息,输出信息的第一列就是文件的inode号。 执行下面的命令:

#ll –I

命令输出如下:

root@devops:~/osetc# ll -i
总用量 16
131103 drwxr-xr-x 3 root root 4096 3月  14 22:56 ./
131073 drwx------ 6 root root 4096 3月  14 22:56 ../
262172 drwxr-xr-x 2 root root 4096 3月  14 22:57 fio1/
131106 -rw-r--r-- 1 root root   82 3月  14 22:56 fio.txt
131104 -rw-r--r-- 1 root root    5 3月  15 21:23 fio2.txt
131105 -rw-r--r-- 1 root root    5 3月  15 21:23 fio3.txt
131106 -rw-r--r-- 1 root root    5 3月  15 21:23 fio4.txt
131108 -rw-r--r-- 1 root root    5 3月  15 21:24 fio5.txt

通过find命令的delete参数进行文件删除
从上面的输出中,我们可以看到fio.txt 文件的inode号为131106, 通过执行下面的find命令并结合其-inum 参数来删除文件,执行下面的命令:

#find ./* -inum 131106 –delete

命令输出如下:

root@devops:~/osetc# find ./ -inum 131106 -delete
root@devops:~/osetc# ll -i
总用量 12
131103 drwxr-xr-x 3 root root 4096 3月  15 21:17 ./
131073 drwx------ 6 root root 4096 3月  14 22:56 ../
262172 drwxr-xr-x 2 root root 4096 3月  14 22:57 fio1/
131104 -rw-r--r-- 1 root root    5 3月  15 21:23 fio2.txt
131105 -rw-r--r-- 1 root root    5 3月  15 21:23 fio3.txt
131106 -rw-r--r-- 1 root root    5 3月  15 21:23 fio4.txt
131108 -rw-r--r-- 1 root root    5 3月  15 21:24 fio5.txt

通过find命令的exec参数并结合rm命令进行文件删除操作
我们也可以通过find命令的exec参数并结合rm删除命令来根据文件的inode号做文件的删除,执行下面的命令:

#find ./ -inum 131104 –exec rm –i {} \;

命令输出如下:

root@devops:~/osetc# find ./ -inum 131104
./fio2.txt
root@devops:~/osetc# find ./ -inum 131104 -exec rm -i {} \;
rm:是否删除普通文件 './fio2.txt'? y
root@devops:~/osetc# ll -i
总用量 24
131103 drwxr-xr-x 3 root root 4096 3月  15 21:29 ./
131073 drwx------ 6 root root 4096 3月  14 22:56 ../
262172 drwxr-xr-x 2 root root 4096 3月  14 22:57 fio1/
131105 -rw-r--r-- 1 root root    5 3月  15 21:23 fio3.txt
131106 -rw-r--r-- 1 root root    5 3月  15 21:23 fio4.txt
131108 -rw-r--r-- 1 root root    5 3月  15 21:24 fio5.txt

通过find命令并结合xargs来删除文件
当我们使用find命令查看到指定inode号的文件后,还可以结合xargs命令来进行文件的删除,执行命令如下:

# find ./ -inum 131105 |xargs rm -v

命令输出如下:

root@devops:~/osetc# find ./ -inum 131105
./fio3.txt
root@devops:~/osetc# find ./ -inum 131105 |xargs rm -v
已删除'./fio3.txt'

Linux 删除指定日期之前的文件

如果你想删除指定日期之前的所有的文件,这个时候我们需要通过linux下find命令并结合其-mtime参数进行文件的查找,在通过rm命令对查找到的文件进行删除。
执行下面的命令来查找root目录下十天之前创建或更改过的文件:

root@devops:~/osetc# find /root -mtime +10 -name "mysql-server*"
/root/mysql-server_5.7.20-1ubuntu16.04_amd64.deb-bundle.tar
/root/mysql-server_5.7.20-1ubuntu16.04_amd64.deb

下一步就可以使用rm命令对查找到的文件进行删除,执行下面的命令:

# find /root -mtime +10 -name "mysql-server*"  -exec rm -rf {} \;

当然也可以使用find命令的ctime参数。

Linux 通过rm()函数进行文件的删除

在linux系统里可以通过unlink和rmdir函数来进行文件的删除,但是rmdir函数只能删除空目录文件,所有我们需要新写一个函数来先删除目录文件下的所有文件,使其成为一个空目录,进而调用rmdir函数删除空目录。如果是普通文件的话,就可以通过unlink函数进行删除。 通过新函数rm来判断文件类型,目录文件通过rm_dir函数删除,普通文件通过unlink函数删除。
rm_dir函数如下:
//递归删除目录下的所有文件

int rm_dir(std::string dir_full_path)
{
DIR* dirp = opendir(dir_full_path.c_str());
if(!dirp)
{
return -1;
}
struct dirent *dir;
struct stat st;
while((dir = readdir(dirp)) != NULL)
{
if(strcmp(dir->d_name,".") == 0
|| strcmp(dir->d_name,"..") == 0)
{
continue;
}
std::string sub_path = dir_full_path + '/' + dir->d_name;
if(lstat(sub_path.c_str(),&st) == -1)
{
Log("rm_dir:lstat ",sub_path," error");
continue;
}
if(S_ISDIR(st.st_mode))
{
if(rm_dir(sub_path) == -1) // 如果是目录文件,递归删除
{
closedir(dirp);
return -1;
}
rmdir(sub_path.c_str());
}
else if(S_ISREG(st.st_mode))
{
unlink(sub_path.c_str());     // 如果是普通文件,则unlink
}
else
{
Log("rm_dir:st_mode ",sub_path," error");
continue;
}
}
if(rmdir(dir_full_path.c_str()) == -1)//delete dir itself.
{
closedir(dirp);
return -1;
}
closedir(dirp);
return 0;
}

Rm函数如下:

int rm(std::string file_name)
{
std::string file_path = file_name;
struct stat st;
if(lstat(file_path.c_str(),&st) == -1)
{
return -1;
}
if(S_ISREG(st.st_mode))
{
if(unlink(file_path.c_str()) == -1)
{
return -1;
}
}
else if(S_ISDIR(st.st_mode))
{
if(file_name == "." || file_name == "..")
{
return -1;
}
if(rm_dir(file_path) == -1)//删除目录下的所有文件.
{
return -1;
}
}
return 0;
}

Linux 删除文件后 空间没有释放

当Linux系统下的磁盘的使用空间达到100%后,我们肯定会对文件系统里的某些不用的文件或者比较大的日志文件进行清理,比如我们会删除apache服务的日志文件, 但是当我们通过rm命令删除掉日志文件后, 我们通过df命令查看当前磁盘的可用空间依旧没有变化,这是怎么回事呢? 为什么文件删除后,磁盘空间没有被释放?
磁盘空间没有被释放的原因如下
在Linux文件系统里,当我们通过rm命令将文件删除后,系统只会将文件的链接或者指针删除掉,但是数据并没有被从所占用的磁盘空间清除,而如果之前调用这个文件的进程依旧在运行的话,那么指针也不会被删除,因为该进行依然会写数据到该文件里,所以内核依然会认为该文件没有被删除。 所以当我们再次使用df命令查看磁盘空间的时候,空间使用率依旧没有变化。
磁盘空间没有被释放的解决方法:
其实解决办法很简单,那就是找到调用这个文件的进程,将该进程重新启动或者关闭,比如重新启动HTTP服务。当然还有万能的方法,那就是重启Linux系统。
对于不能重启系统或者进程的情况,我们可以通过对日志文件的写操作,对该文件进行重新覆盖,这样就会清空该文件所占用的存储空间。比如要清空HTTP的日志文件,我们可以执行下面的命令:

#echo “”> /tmp/access.log

Linux 删除文件恢复

通过上面的介绍,我们知道文件通过rm命令删除后,系统只是删除了执行该文件inode链接,但并没有删除文件的数据块。 我们可以通过proc文件系统来恢复删除的文件,因为每一个进程在proc文件系统里都会有一个目录和进程名字,里面会包含一个文件描述符子目录,该进程需要打开的所有文件链接都会在这个目录里。 所以当从文件系统里删除文件后,proc文件系统里依然还有一个inode的引用。
下面我们来演示将恢复删除后的/var/log/syslog 日志文件:
1# 删除日志文件/var/log/syslog, 执行下面的命令:

#rm /var/log/syslog

2# 通过lsof命令来查看进程的文件描述符和相关文件名信息,执行下面的命令:

# lsof | grep /var/log/syslog

命令输出如下:

root@devops:~/osetc# lsof | grep /var/log/syslog
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
rsyslogd    972                syslog    5w      REG                8,1    24202    1311921 /var/log/syslog (deleted)

从上面的输出中可以看到进程的pid号为972
3# 进入proc文件系统查看进程号为972的文件描述信息,执行命令:

# ll /proc/972/fd/

命令输出如下:

root@devops:~/osetc# ll /proc/972/fd/
总用量 0
dr-x------ 2 root   root    0 3月  15 21:14 ./
dr-xr-xr-x 9 syslog syslog  0 3月  14 22:22 ../
lr-x------ 1 root   root   64 3月  15 21:14 0 -> /dev/null
l-wx------ 1 root   root   64 3月  15 21:14 1 -> /dev/null
l-wx------ 1 root   root   64 3月  15 21:14 2 -> /dev/null
lrwx------ 1 root   root   64 3月  15 21:14 3 -> socket:[13886]
lr-x------ 1 root   root   64 3月  15 21:14 4 -> /proc/kmsg
l-wx------ 1 root   root   64 3月  15 21:14  5 -> /var/log/syslog (deleted)
l-wx------ 1 root   root   64 3月  15 21:14 6 -> /var/log/auth.log
l-wx------ 1 root   root   64 3月  15 21:14 7 -> /var/log/kern.log

从输出里我们可以看到syslog文件的链接信息,可以通过head -5 命令来查看文件内容。

#head -5  /proc/972/fd/5

命令输出如下:

root@devops:~/osetc# head -5 /proc/972/fd/5
Mar 14 22:23:06 devops anacron[998]: Job `cron.daily' terminated
Mar 14 22:23:13 devops gnome-session[1826]: Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Mar 14 22:27:15 devops anacron[998]: Job `cron.weekly' started
Mar 14 22:27:15 devops anacron[2837]: Updated timestamp for job `cron.weekly' to 2018-03-14
Mar 14 22:27:20 devops anacron[998]: Job `cron.weekly' terminated

4# 执行下面的命令,恢复syslog文件

#cat  /proc/972/fd/5 >/var/log/syslog

命令输出如下:

root@devops:~/osetc# cat /proc/972/fd/5 >/var/log/syslog
root@devops:~/osetc# ls /var/log/syslog
/var/log/syslog

我们可以看到被删除后的syslog文件已经被恢复了。
也可以参考本站的另一篇文章,实现linux系统下的回收站功能,进而更方便的实现删除文件的恢复。


99%的人还阅读了:

PHP中 “Fata error Call to undefined function curl_init()解决方法

本文主要讲述在Centos/RHEL linux系统下运行php时候遇到的错误 Fatal error: Call to undefined function curl_init() 的解决方法。 当你在配置完成一个LEMP(Linux,Nginx, MySQL, PHP)的web环境后,PHP在运行的时候有可能会在/var/log/nginx/error.log文件里看到下面的错误:

Fatal error: Call to undefined function curl_init()

根据错误的提示,我们可以基本判断curl扩展模块没有安装或者启用,所以接下里我们可以去执行下面的命令来检测php-curl 模块包是否安装。
Centos/RHEL 系统检测php-curl是否安装
执行下面的命令:

$ rpm -qa |grep php-curl

ubuntu 系统检测php-curl是否安装
执行下面的命令:

$ sudo dpkg -l |grep php-curl

 
如果没有安装,我们只需要安装或者开启curl module 扩展包。
Ubuntu下安装支持PHP的CURL扩展模块
执行下面的apt install 命令为php 7.x 安装curl 扩展模块:

$ sudo  apt install php-curl

命令输出如下:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:
java-common libappindicator1 libindicator7
使用'apt autoremove'来卸载它(它们)。
将会同时安装下列软件:
php-common php7.0-common php7.0-curl
下列【新】软件包将被安装:
php-common php-curl php7.0-common php7.0-curl
升级了 0 个软件包,新安装了 4 个软件包,要卸载 0 个软件包,有 223 个软件包未被升级。
需要下载 880 kB 的归档。
解压缩后会消耗 4,903 kB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://mirrors.aliyun.com/ubuntu xenial-proposed/main amd64 php-common all 1:35ubuntu6.1 [10.8 kB]
获取:2 http://mirrors.aliyun.com/ubuntu xenial-proposed/main amd64 php7.0-common amd64 7.0.25-0ubuntu0.16.04.1 [840 kB]
获取:3 http://mirrors.aliyun.com/ubuntu xenial-proposed/main amd64 php7.0-curl amd64 7.0.25-0ubuntu0.16.04.1 [27.4 kB]
获取:4 http://mirrors.aliyun.com/ubuntu xenial-proposed/main amd64 php-curl all 1:7.0+35ubuntu6.1 [1,928 B]
已下载 880 kB,耗时 3秒 (289 kB/s)
正在选中未选择的软件包 php-common。
(正在读取数据库 ... 系统当前共安装有 220903 个文件和目录。)
正准备解包 .../php-common_1%3a35ubuntu6.1_all.deb  ...
正在解包 php-common (1:35ubuntu6.1) ...
正在选中未选择的软件包 php7.0-common。
正准备解包 .../php7.0-common_7.0.25-0ubuntu0.16.04.1_amd64.deb  ...
正在解包 php7.0-common (7.0.25-0ubuntu0.16.04.1) ...
正在选中未选择的软件包 php7.0-curl。
正准备解包 .../php7.0-curl_7.0.25-0ubuntu0.16.04.1_amd64.deb  ...
正在解包 php7.0-curl (7.0.25-0ubuntu0.16.04.1) ...
正在选中未选择的软件包 php-curl。
正准备解包 .../php-curl_1%3a7.0+35ubuntu6.1_all.deb  ...
正在解包 php-curl (1:7.0+35ubuntu6.1) ...
正在设置 php-common (1:35ubuntu6.1) ...
正在设置 php7.0-common (7.0.25-0ubuntu0.16.04.1) ...
Creating config file /etc/php/7.0/mods-available/calendar.ini with new version
…
Creating config file /etc/php/7.0/mods-available/tokenizer.ini with new version
正在设置 php7.0-curl (7.0.25-0ubuntu0.16.04.1) ...
Creating config file /etc/php/7.0/mods-available/curl.ini with new version
正在设置 php-curl (1:7.0+35ubuntu6.1) ...

Centos下安装支持PHP的CURL 模块
在centos或者Redhat系统下,可以通过yum install 命令执行下面的命令来安装curl模块:

$ sudo yum install php-curl

或者执行下面的命令:

$ sudo yum install php-common

安装完php-curl 模块后,需要重启下Apache/Nginx 服务
执行下面的命令:

$ sudo service nginx restart

或者

$ sudo /etc/init.d/nginx restart

对于centos7.x 系统,执行下面命令:

$ sudo systemctl  restart nginx

 
99%的人还阅读了:
Linux:用腻了 wget 或 curl,有什么更好的替代品吗?
Mac OS:终端下使用curl命令下载文件
Ubuntu 下curl安装及使用指南
Linux 下curl命令post传递表单数据
参考地址:https://curl.haxx.se/download.html

Linux 下curl命令post传递表单数据

本文将会讲述如何在linux或者unix系统下使用cURL工具或者命令在命令行下发送post请求传递数据。 比如上传一个文件到远程的服务器的特定目录下。如何通过cURL 命令在linux命令行下创建一个post请求来上传文件。
CURL是一个可以用来从本地传递数据请求到远程服务器的非常好用的工具,可以通过多种协议(http,https,ftp等)从远程web服务器上上传或者下载所需要的文件。 可以通过cURL工具来创建post或者get 请求来创建请求或者测试不同的请求操作。

cRURL 命令post传递参数给相应表单字段

当我们只是需要传递相应的值给表单里的特定字段,我们可以使用cURL命令的–data 或者-d选项,命令格式如下:

curl -d "key=value1&key2=value2" "url"

或者

curl --data "key=value1&key2=value2" "url"

对于上述命令,如果只是通过curl post请求传递一个参数值,那么可以不适用双引号,如果是两个以上的参数就必须使用双引号扩起来。
下面我们来看一个实例:
假如我们想向一个登陆页面传递用户名和密码数据,那么我们来看看如何创建cURL post请求来发送数据。
登陆表单的数据如下:

<form  action="login" method="post">
<input type="text"  name="username"  value="user1"/>
<input type="password"  name="password"  value="123"/>
<button type="submit"  value="登陆" />
</form>

那么可以在linux命令行下执行下面的cURL命令创建一个post请求来传递相应的字段值给表单:

curl -d "username=user1&password=123" "www.test.com/login"

如果需要跟踪做了重定向的表单网页,那么需要使用-L 选项,命令如下:

curl -L -d "username=user1&password=123" "www.test.com/login"

cURL保存当前的cookie数据

如果当前已经进行了登录操作,那么可能我们需要保存下当前已经生产的cookie数据,供其它的请求操作来使用,使用curl命令以及-c 选项进行保存当前的cookie信息:

curl -c cookie -d "username=user1&password=123" "www.test.com/login"

命令执行完成后,会在当前目录下生产一个包含cookie信息的文件。
如果需要使用已有的cookie文件来进行post请求操作,那么需要使用curl 的-b选项,执行命令如下:

curl -L -b cookie -d "key3=value3" "url"

通过cURL命令上传文件

如果需要通过cURL 工具上传某个文件到相应表单,可以使用-F 选项,命令格式如下:

curl -F "data=@filename" "url"

例如你想上传一个文件到远程的服务器表单(http://www.test.com/upload),接收文件的表单参数名为img,那么我们可以执行下面的命令:

curl -F “img=@linux.gif" "http://www.test.com/upload"

如果要同时上传多个文件,可以执行下面的命令:

curl -F "img1=@linux1.gif" -F "img2=@linux2.gif" "http://www.test.com/upload"

PHP中通过cURL建立post请求获取数据

因为PHP支持curl中的库,所有可以在php中模拟curl的post请求来抓取到想要的数据。 下面我们通过curl post方式来打开特定页面并获取页面数据,代码如下:

$url = "http://localhost/test.php";
//curl post请求所需要传递的参数值
$post_data = array ("username" => "user1","key" => "test");
$ch = curl_init(); // curl post 请求操作初始化
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// post数据
curl_setopt($ch, CURLOPT_POST, 1);// post的变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
print_r($output); //打印抓取到的页面数据

通过上面的php程序返回的数据是json格式。
更多关于curl的用法可以参看帮助文档,执行下面命令:

$ man curl

99%的人还阅读了:
Linux:用腻了 wget 或 curl,有什么更好的替代品吗?
Mac OS:终端下使用curl命令下载文件
Ubuntu 下curl安装及使用指南

Ubuntu 下curl安装及使用指南

对于linux用户,可能经常会用到curl工具从远程的服务器上通过http,https, SCP, SFTP,SMB或者其它支持的协议来下载或传输文件。 本文将会讲述如何下载到你需要的curl 程序文件,以及如何在ubuntu系统下安装curl工具,并对curl的一些常用的命令做介绍。

Curl 是什么

CURL是Linux系统下常用的功能强大的网络工具,可以通过多种协议(http,https,ftp等)从远程web服务器上上传或者下载所需要的文件。 我们可以通过curl工具来抓取网页来监控可能会遇到的问题。curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。 curl是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中,并且有DOS和Win32、Win64下的移植版本。
curl 工具常用的参数如下

-a/--append 上传文件时,附加到目标文件
-A/--user-agent <string> 设置用户代理发送给服务器
- anyauth 可以使用“任何”身份验证方法
-b/--cookie <name=string/file> cookie字符串或文件读取位置
- basic 使用HTTP基本验证
-B/--use-ascii 使用ASCII /文本传输
-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
-C/--continue-at <offset> 断点续转
-d/--data <data> HTTP POST方式传送数据
--data-ascii <data> 以ascii的方式post数据
--data-binary <data> 以二进制的方式post数据
--negotiate 使用HTTP身份验证
--digest 使用数字身份验证
--disable-eprt 禁止使用EPRT或LPRT
--disable-epsv 禁止使用EPSV
-D/--dump-header <file> 把header信息写入到该文件中
--egd-file <file> 为随机数据(SSL)设置EGD socket路径
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer 来源网址
-E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)
--cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)
--key <key> 私钥文件名 (SSL)
--key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)
--pass <pass> 私钥密码 (SSL)
--engine <eng> 加密引擎使用 (SSL). "--engine list" for list
--cacert <file> CA证书 (SSL)
--capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)
--ciphers <list> SSL密码
--compressed 要求返回是压缩的形势 (using deflate or gzip)
--connect-timeout <seconds> 设置最大请求时间
--create-dirs 建立本地目录的目录层次结构
--crlf 上传是把LF转变成CRLF
-f/--fail 连接失败时不显示http错误
--ftp-create-dirs 如果远程目录不存在,创建远程目录
--ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
--ftp-pasv 使用 PASV/EPSV 代替端口
--ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址
--ftp-ssl 尝试用 SSL/TLS 来进行ftp数据传输
--ftp-ssl-reqd 要求用 SSL/TLS 来进行ftp数据传输
-F/--form <name=content> 模拟http表单提交数据
-form-string <name=string> 模拟http表单提交数据
-g/--globoff 禁用网址序列和范围使用{}和[]
-G/--get 以get的方式来发送数据
-h/--help 帮助
-H/--header <line>自定义头信息传递给服务器
--ignore-content-length 忽略的HTTP头信息的长度
-i/--include 输出时包括protocol头信息
-I/--head 只显示文档信息
从文件中读取-j/--junk-session-cookies忽略会话Cookie
- 界面<interface>指定网络接口/地址使用
- krb4 <级别>启用与指定的安全级别krb4
-j/--junk-session-cookies 读取文件进忽略session cookie
--interface <interface> 使用指定网络接口/地址
--krb4 <level> 使用指定安全级别的krb4
-k/--insecure 允许不使用证书到SSL站点
-K/--config 指定的配置文件读取
-l/--list-only 列出ftp目录下的文件名称
--limit-rate <rate> 设置传输速度
--local-port<NUM> 强制使用本地端口号
-m/--max-time <seconds> 设置最大传输时间
--max-redirs <num> 设置最大读取的目录数
--max-filesize <bytes> 设置最大下载的文件总量
-M/--manual 显示全手动
-n/--netrc 从netrc文件中读取用户名和密码
--netrc-optional 使用 .netrc 或者 URL来覆盖-n
--ntlm 使用 HTTP NTLM 身份验证
-N/--no-buffer 禁用缓冲输出
-o/--output 把输出写到该文件中
-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
-p/--proxytunnel 使用HTTP代理
--proxy-anyauth 选择任一代理身份验证方法
--proxy-basic 在代理上使用基本身份验证
--proxy-digest 在代理上使用数字身份验证
--proxy-ntlm 在代理上使用ntlm身份验证
-P/--ftp-port <address> 使用端口地址,而不是使用PASV
-Q/--quote <cmd>文件传输前,发送命令到服务器
-r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围
--range-file 读取(SSL)的随机文件
-R/--remote-time 在本地生成文件时,保留远程文件时间
--retry <num> 传输出现问题时,重试的次数
--retry-delay <seconds> 传输出现问题时,设置重试间隔时间
--retry-max-time <seconds> 传输出现问题时,设置最大重试时间
-s/--silent静音模式。不输出任何东西
-S/--show-error 显示错误
--socks4 <host[:port]> 用socks4代理给定主机和端口
--socks5 <host[:port]> 用socks5代理给定主机和端口
--stderr <file>
-t/--telnet-option <OPT=val> Telnet选项设置
--trace <file> 对指定文件进行debug
--trace-ascii <file> Like --跟踪但没有hex输出
--trace-time 跟踪/详细输出时,添加时间戳
-T/--upload-file <file> 上传文件
--url <URL> Spet URL to work with
-u/--user <user[:password]>设置服务器的用户和密码
-U/--proxy-user <user[:password]>设置代理用户名和密码
-v/--verbose
-V/--version 显示版本信息
-w/--write-out [format]什么输出完成后
-x/--proxy <host[:port]>在给定的端口上使用HTTP代理
-X/--request <command>指定什么命令
-y/--speed-time 放弃限速所要的时间。默认为30
-Y/--speed-limit 停止传输速度的限制,速度时间'秒
-z/--time-cond 传送时间设置
-0/--http1.0 使用HTTP 1.0
-1/--tlsv1 使用TLSv1(SSL)
-2/--sslv2 使用SSLv2的(SSL)
-3/--sslv3 使用的SSLv3(SSL)
--3p-quote like -Q for the source URL for 3rd party transfer
--3p-url 使用url,进行第三方传送
--3p-user 使用用户名和密码,进行第三方传送
-4/--ipv4 使用IP4
-6/--ipv6 使用IP6
-#/--progress-bar 用进度条显示当前的传送状态

ubuntu curl 安装

在ubuntu系统下最简单的curl工具安装是通过apt命令或 apt-get 命令, 执行下面的apt命令:

$sudo apt install curl

命令输出如下:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:
java-common libappindicator1 libindicator7
使用'apt autoremove'来卸载它(它们)。
将会同时安装下列软件:
libcurl3-gnutls
下列【新】软件包将被安装:
curl
下列软件包将被升级:
libcurl3-gnutls
升级了 1 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 357 个软件包未被升级。
需要下载 138 kB/323 kB 的归档。
解压缩后会消耗 340 kB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://mirrors.aliyun.com/ubuntu xenial-security/main amd64 curl amd64 7.47.0-1ubuntu2.5 [138 kB]
已下载 138 kB,耗时 0秒 (915 kB/s)
(正在读取数据库 ... 系统当前共安装有 185776 个文件和目录。)
正准备解包 .../libcurl3-gnutls_7.47.0-1ubuntu2.5_amd64.deb  ...
正在将 libcurl3-gnutls:amd64 (7.47.0-1ubuntu2.5) 解包到 (7.47.0-1ubuntu2.2) 上 ...
正在选中未选择的软件包 curl。
正准备解包 .../curl_7.47.0-1ubuntu2.5_amd64.deb  ...
正在解包 curl (7.47.0-1ubuntu2.5) ...
正在处理用于 libc-bin (2.23-0ubuntu9) 的触发器 ...
正在处理用于 man-db (2.7.5-1) 的触发器 ...
正在设置 libcurl3-gnutls:amd64 (7.47.0-1ubuntu2.5) ...
正在设置 curl (7.47.0-1ubuntu2.5) ...
正在处理用于 libc-bin (2.23-0ubuntu9) 的触发器 ...

当然你也可以直接从curl官方下载源码包进行安装,执行下面的wget命令来下载curl源码文件:

wget http://archive.ubuntu.com/ubuntu/pool/main/c/curl/curl_7.52.1.orig.tar.gz

或者直接下载curl的二进制安装包,执行下面命令:

wget http://security.ubuntu.com/ubuntu/pool/main/c/curl/curl_7.52.1-4ubuntu1.4_amd64.deb

Curl 命令GET请求

当curl命令安装完成后,我们:通过执行下面的命令来查看HTTP的header信息:

$curl -I https://www.bing.com

命令输出如下:

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Length: 119115
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
P3P: CP="NON UNI COM NAV STA LOC CURa DEVa PSAa PSDa OUR IND"
Set-Cookie: SRCHD=AF=NOFORM; domain=.bing.com; expires=Thu, 23-Jan-2020 09:16:18 GMT; path=/
Set-Cookie: SRCHUID=V=2&GUID=52B6738D04434E1DA43017741146CB8F&dmnchg=1; domain=.bing.com; expires=Thu, 23-Jan-2020 09:16:18 GMT; path=/
Set-Cookie: SRCHUSR=DOB=20180123; domain=.bing.com; expires=Thu, 23-Jan-2020 09:16:18 GMT; path=/
Set-Cookie: _SS=SID=29B9E200E45061CF08A6E980E5E76063; domain=.bing.com; path=/
Strict-Transport-Security: max-age=10886400; includeSubDomains; preload
X-MSEdge-Ref: Ref A: 1FEEFC982E894C71AEC43DB3ED5118FF Ref B: BJ1EDGE0210 Ref C: 2018-01-23T09:16:18Z
Set-Cookie: _EDGE_S=F=1&SID=29B9E200E45061CF08A6E980E5E76063; path=/; httponly; domain=bing.com
Set-Cookie: _EDGE_V=1; path=/; httponly; expires=Sun, 17-Feb-2019 09:16:18 GMT; domain=bing.com
Set-Cookie: MUID=3D6BD680705A62C12D1DDD0071ED6374; path=/; expires=Sun, 17-Feb-2019 09:16:18 GMT; domain=bing.com
Set-Cookie: MUIDB=3D6BD680705A62C12D1DDD0071ED6374; path=/; httponly; expires=Sun, 17-Feb-2019 09:16:18 GMT
Date: Tue, 23 Jan 2018 09:16:17 GMT

curl显示页面的全部信息

curl -i http://www.osetc.com

命令输出如下:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
HTTP/1.1 200 OK
Date: Tue, 23 Jan 2018 09:17:38 GMT
Server: Apache/2.2.22 (Unix) PHP/5.2.17p1
X-Powered-By: PHP/5.2.17p1
Link: <https://www.osetc.com/wp-json/>; rel="https://api.w.org/"
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html lang="en-US" class="no-js no-svg">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="profile" href="http://gmpg.org/xfn/11">
<script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>
<title>OSETC 技术网 | 专注于Linux/Unix系统技术</title>
……

 

显示GET请求的解析过程

curl -v http://www.osetc.com

ubuntu curl 下载 文件

如果你想通过curl命令来下载远程服务器上的文件,那么你需要使用-o 选项,将远程文件保存到本地,执行下面的命令:

curl -o fio.html    https://www.osetc.com/archives/20394.html

命令输出如下:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100 90306    0 90306    0     0  64524      0 --:--:--  0:00:01 --:--:-- 64550

上面的命令将会把远程服务器上的20394.html 文件下载到当前目录并保存为 fio.html.
执行下面命令来查看文件是否下载成功:

root@devops-virtual-machine:~# ls fio.html
fio.html

你也可以使用下面的命令来恢复之前断开的curl下载过程,需要使用curl命令的选线组合:-L -O -C -:

curl -L -O -C - https://www.osetc.com/fio.txt

ubuntu curl 上传文件

如果需要通过curl命令来上传文件到远程的web服务器,可以使用curl命令的 -T选项,执行命令如下:

curl -T "{文件1,文件2}“ ftp://www.osetc.com/upload/

99%的人还阅读了:
Linux:用腻了 wget 或 curl,有什么更好的替代品吗?
Mac OS:终端下使用curl命令下载文件
参考地址:https://curl.haxx.se/download.html

Linux 查看发行版本信息以及内核版本的方法(CentOS/Ubuntu)

本文主要讲述如何在linux系统下查看不同发型版本的版本信息(centos/ubuntu),以及查看linux内核版本号的方法。当前已经存在了很多的linux 版本,那么这些版本直接到底有什么区别,有什么特点,到底哪个linux发行版本更好用呢。

linux 发行版本概念

Linux 主要作为Linux发行版(通常被称为”distro”)的一部分而使用。这些发行版由个人,松散组织的团队,以及商业机构和志愿者组织编写。它们通常包括了其他的系统软件和应用软件,以及一个用来简化系统初始安装的安装工具,和让软件安装升级的集成管理器。大多数系统还包括了像提供GUI界面的XFree86之类的曾经运行于BSD的程序。 一个典型的Linux发行版包括:Linux内核,一些GNU程序库和工具,命令行shell,图形界面的X Window系统和相应的桌面环境,如KDE或GNOME,并包含数千种从办公套件,编译器,文本编辑器到科学工具的应用软件。-来自百度百科

linux 版本信息查看命令(centos/ubuntu)

查看linux发行版系统的信息
1# 使用lsb_release –a 命令
这个命令基本使用与所有其它的linux发型版本(redhat,centos, fedora, Ubuntu,suse等)

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:     Ubuntu 16.04.3 LTS
Release:  16.04
Codename:      xenial

2# 查看/etc/issue 文件的信息
执行下面命令:

#cat /etc/issue
Ubuntu 16.04.3 LTS \n \l

3#  查看/etc/redhat-release 文件
执行下面命令:

# cat /etc/redhat-release
CentOS release 6.5 (Final)

查看linux系统架构
在日常工作中我们有时会需要查看当前 Linux 系统是 32 位还是 64 位系统架构类型,下面将会介绍5个命令来查看系统的架构信息。无论你使用的是桌面版或是只装了文本界面的 Linux 环境,以下命令几乎可以通吃所有 Linux 发行版,例如:RHEL、CentOS、Fedora、Scientific Linux、Debian、Ubuntu、Linux Mint、OpenSUSE 等等。
1# uname 命令
uname -a 命令可以直接显示 Linux 系统架构的命令,安几乎可以工作在所有 Linux/Unix 系统当中。
执行命令:

# uname –a
Linux devops-virtual-machine 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

2# dpkg 命令
dpkg 的命令可用于查看 Debian/ Ubuntu 操作系统是 32 位还是 64 位,此命令只适用于基于 Debian 和 Ubuntu 的 Linux 发行版。
执行下面命令:

#dpkg –print-architecture
amd64

3# getconf命令
getconf 命令主要用于显示系统变量配置,我们也可使用如下参数来查看 Linux 系统架构
执行下面的命令:

#getconf LONG_BIT
64

4# arch 命令
arch 命令主要用于显示操作系统架构类型,与 uname -m 命令非常类似。如果输出 x86_64 则表示为 64 位系统,如果输出 i686 或 i386 则表示为 32 位系统。
执行下面的命令:

#arch
x86_64

5# file 命令
file 命令可以配合 /sbin/init 这个特殊参数来查看系统架构类型(/sbin/init 在 Ubuntu 15.10 里面是链接到/lib/systemd/systemd 的)
执行下面的命令:

#file /sbin/init

linux 内核版本号查看命令

下面我们通过两个方法来介绍如何查看linux系统的内核版本号。
1# 使用命令: uname -a
该命令可以用来 查看系统内核版本号及系统名称
执行命令:

# uname –a
Linux devops-virtual-machine 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

从上面的命令输出,我们可以看到linux的内核版本号为:4.10.0-28
2# 使用命令 cat /proc/version
作用: 查看目录”/proc”下version的信息,也可以得到当前系统的内核版本号及系统名称

# cat /proc/version
Linux version 4.10.0-28-generic (buildd@lgw01-12) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017

另外:
/proc文件系统,它不是普通的文件系统,而是系统内核的映像,也就是说,该目录中的文件是存放在系统内存之中的,它以文件系统的方式为访问系统内核数据的操作提供接口。而我们使用命令“uname -a”的信息就是从该文件获取的,当然用方法二的命令直接查看它的内容也可以达到同等效果.另外,加上参数”a”是获得详细信息,如果不加参数为查看系统名称。

linux发行版本有哪些

发行版为许多不同的目的而制作, 包括对不同计算机结构的支持, 对一个具体区域或语言的本地化,实时应用,和嵌入式系统,甚至许多版本故意地只加入免费软件。已经有超过三百个发行版被积极的开发,最普遍被使用的发行版有大约十二个。
每一款发行版都拥有一大批用户,开发者自愿为相关项目投入精力。Linux发行版可谓是形形色色,它们旨在满足每一种能想得到的需求。下面将会简要介绍述十款常用Linux发行版,并会介绍该发行版的目标用户,以及它与其他发行版相比有什么样的特殊功能。
1. Debian
Debian运行起来极其稳定,这使得它非常适合用于服务器。Debian平时维护三套正式的软件库和一套非免费软件库,这给另外几款发行版(比如Ubuntu和Kali等)带来了灵感。Debian这款操作系统派生出了多个Linux发行版。它有37500多个软件包,这方面唯一胜过Debian的其他发行版只有Gentoo。Debian使用apt或aptitude来安装和更新软件。
Debian这款操作系统无疑并不适合新手用户,而是适合系统管理员和高级用户。Debian支持如今的大多数架构(处理器)。
下载Debian ISO映像文件:http://www.debian.org/distrib/
附有屏幕截图的Debian安装:《Debian 7.0″Wheezy”安装指南
debian linux
2. Gentoo
与Debian一样,Gentoo这款操作系统也包含数量众多的软件包。Gentoo并非以预编译的形式出现,而是每次需要针对每个系统进行编译。连Gentoo社区都觉得Gentoo安装和使用起来很困难;不过它被认为是最佳学习对象,可以进而了解Linux操作系统的内部运作原理。提到Gentoo总有人这么说:”如果你要学用Linux发行版,那就学用该发行版吧;如果你学会了Gentoo,也就学会了Linux。”Gentoo使用portage来安装和更新软件。
Gentoo这款操作系统适合对Linux已经完全驾轻就熟的那些用户。
下载和安装Gentoo:http://www.gentoo.org/main/en/where.xml
gentoo linux
3. Ubuntu
Ubuntu是Debian的一款衍生版,也是当今最受欢迎的免费操作系统。Ubuntu侧重于它在这个市场的应用,在服务器、云计算、甚至一些运行Ubuntu Linux的移动设备上很常见。作为Debian Gnu Linux的一款衍生版,Ubuntu的进程、外观和感觉大多数仍然与Debian一样。它使用apt软件管理工具来安装和更新软件。它也是如今市面上用起来最容易的发行版之一。Ubuntu使用基于apt的程序包管理器。
Ubuntu是新手用户肯定爱不释手的一款操作系统。
下载Ubuntu ISO映像文件:http://www.ubuntu.com/download
附有屏幕截图的Ubuntu安装:《Ubuntu 13.04″Raring Ringtail”安装指南
ubuntu linux
4. Damn Vulnerable Linux
当然,大多数人可能对这款发行版前所未闻,不过该发行版在本文中还是占有一席之地。那么,它有何过人之处呢? Damn Vulnerable Linux恰如其名:其字面意思就是”该死的易受攻击的Linux”。Vulnerable Linux(DVL)根本不是一般意义上的优秀的Linux发行版。它有意捆绑了坏的、配置不当的、过时的、很容易被不法分子攻击的软件。
它的目的在于借机训练Linux管理员。还有什么比给Linux管理员一款坏的发行版去排解问题来得更管用的吗?面对Apache、MySQL、PHP、FTP和SSH等比较旧或破的版本,接受训练的管理员够有得忙了。
Damn Vulnerable Linux堪称旨在训练管理员的实验室。
下载Damn Vulnerable Linux(DVL)ISO映像文件:DVL_1.5_Infectious_Disease.iso
Damn Vulnerable Linux
5. 红帽企业级Linux
这是第一款面向商业市场的Linux发行版。它有服务器版本,支持众多处理器架构,包括x86和x86_64。红帽公司通过课程红帽认证系统管理员/红帽认证工程师(RHCSA/RHCE),对系统管理员进行培训和认证。就全球市场而言,总利润中80%来自支持,另外20%来自培训和认证,不过在印度不是这样。
在印度,红帽的利润中80%来自认证和培训,只有20%来自支持。而Fedora是个平台,而不是开发新产品或新应用程序的测试环境;一旦成为稳定版,就与红帽企业级Linux捆绑在一起,包括支持。红帽提供了非常多的稳定版应用程序,但是众所周知的缺点是,把太多旧程序包打包起来,支持成本确实相当高。不过,如果安全是关注的首要问题,那么红帽企业级Linux的确是款完美的发行版,它使用YUM程序包管理器。
红帽企业级Linux是系统管理员的第一选择,它有众多的程序包,还有非常到位的支持。
由于该发行版是商业化产品,所以不是免费的。不过,你可以下载用于教学用途的测试版。
下载红帽企业级Linux测试版DVD ISO映像文件:RedHat Enterprise Linux(测试版
附有屏幕截图的RHEL 6安装:《RHEL 6安装指南
补充说明:通常认为,开发了该发行版的Marc Ewin将该产品命名为红帽,因为他丢失了似乎很心爱的那顶红色帽子,帽子是他爷爷在他过生日时送的礼物。
redhat linux
6. CentOS
CentOS是一款企业级Linux发行版,它使用红帽企业级Linux中的免费源代码重新构建而成。这款重构版完全去掉了注册商标以及Binary程序包方面一个非常细微的变化。有些人不想支付一大笔钱,又能领略红帽企业级Linux;对他们来说,CentOS值得一试。此外,CentOS的外观和行为似乎与母发行版红帽企业级Linux如出一辙。 CentOS使用YUM来管理软件包。
非常稳定的程序包;谁要是想在桌面端测试一下服务器的运作原理,都应该试试这款操作系统。
下载CentOS 6.4 DVD ISO映像文件:http://wiki.centos.org/Download
附有屏幕截图的CentOS 6.4安装:《CentOS 6.4安装指南
centos linux
7. Fedora
小巧的Fedora适合那些人:想尝试最先进的技术,等不及程序的稳定版出来。其实,Fedora就是红帽公司的一个测试平台;产品在成为企业级发行版之前,在该平台上进行开发和测试。Fedora是一款非常好的发行版,有庞大的用户论坛,软件库中还有为数不少的软件包。Fedora同样使用YUM来管理软件包。
下载Fedora 18(Spherical Cow)DVD ISO映像文件:http://fedoraproject.org/en/get-fedora
附有屏幕截图的Fedora 18(Spherical Cow)安装:《Fedora 18(Spherical Cow)安装指南
fedora linux
8. Kali Linux
Kali Linux是Debian的一款衍生版。Kali旨在用于渗透测试。它大概在三个月前才发行。Kali的前身是Backtrack。用于Debian的所有Binary软件包都可以安装到Kali Linux上,而Kali的魅力或威力就来自于此。此外,支持Debian的用户论坛为Kali加分不少。Kali随带许多的渗透测试工具,无论是Wifi、数据库还是其他任何工具,都设计成立马可以使用。Kali使用APT来管理软件包。
毫无疑问,Kali Linux是一款渗透测试工具,或者是文明黑客(我不想谈论恶意黑客)青睐的操作系统。
下载Kali Linux DVD ISO映像文件:Kali Linux 6
Kali Linux
9. Arch Linux
Arch是一款采用滚动发行方式的操作系统:只要安装一次就够了;每当发行了某个新版本,就可以升级发行版,不需要重新安装。Pacman是Arch Linux的软件包管理器。Arch Linux既支持X86处理器架构,又支持X86_64架构,安装程序可以从光盘或U盘来运行。Arch旨在从开发者的角度而不是从用户的角度做到力求简单。Arch配置和安装起来超容易。它真是一款面向高手的发行版,让你可以了解Linux系统的每一个细枝末节。
下载Arch Linux ISO映像文件:https://www.archlinux.org/download/
Arch Linux
10. OpenSuse
OpenSuse这款Linux发行版是免费的,并不供商业用途使用,仍然供个人使用。OpenSuse的真正竞争对手是红帽企业级Linux。它使用Yast来管理软件包。有了Yast,使用和管理服务器应用程序就非常容易。此外,Yast安装向导程序可以配置电子邮件服务器、LDAP服务器、文件服务器或Web服务器,没有任何不必要的麻烦。它随带snapper快照管理工具,因而可以恢复或使用旧版的文件、更新和配置。由于让滚动发行版本成为可能的Tumbleweed,可将已安装的操作系统更新到最新版本,不需要任何的新发行版。
SUSE在管理员当中的名气更大,因为它有Yast以及让系统管理员能够自动管理任务的其他此类应用程序,同样水准的其他发行版没有这项功能。
下载OpenSuse 12.3 DVD ISO映像文件:http://software.opensuse.org/123/en
附有屏幕截图的OpenSuse 12.3安装:《OpenSuse 12.3安装指南
OpenSuse
市面上有好几百款发行版,每款发行版在某个方面都与众不同。不可能在此全部罗列,本文只罗列了十款最常见的Linux发行版(世界上只有两种人,一种是懂二进制的,另一种是不懂二进制的)。

linux不同版本的区别,都有什么特点(版本比较)

Linux的发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的Redhat(RHEL)为代表,后者以Debian为代表。
下面介绍一下各个发行版本的特点:
Redhat,应该称为Redhat系列,包括RHEL(Redhat Enterprise Linux,也就是所谓的Redhat Advance Server收费版本)、FedoraCore(由原来的Redhat桌面版本发展而来,免费版本)、CentOS(RHEL的社区克隆版本,免费)。Redhat应该说是在国内使用人群最多的Linux版本,甚至有人将Redhat等同于Linux,而有些老鸟更是只用这一个版本的Linux。所以这个版本的特点就是使用人群数量大,资料非常多,言下之意就是如果你有什么不明白的地方,很容易找到人来问,而且网上的一般Linux教程都是以Redhat为例来讲解的。Redhat系列的包管理方式采用的是基于RPM包的YUM包管理方式,包分发方式是编译好的二进制文件。稳定性方面RHEL和CentOS的稳定性非常好,适合于服务器使用,但是Fedora Core的稳定性较差,最好只用于桌面应用。
Debian,或者称Debian系列,包括Debian和Ubuntu等。Debian是社区类Linux的典范,是迄今为止最遵循GNU规范的Linux系统。Debian最早由Ian Murdock于1993年创建,分为三个版本分支(branch): stable, testing和unstable。其中,unstable为最新的测试版本,其中包括最新的软件包,但是也有相对较多的bug,适合桌面用户。testing的版本都经过unstable中的测试,相对较为稳定,也支持了不少新技术(比如SMP等)。而stable一般只用于服务器,上面的软件包大部分都比较过时,但是稳定和安全性都非常的高。Debian最具特色的是apt-get /dpkg包管理方式,其实Redhat的YUM也是在模仿Debian的APT方式,但在二进制文件发行方式中,APT应该是最好的了。Debian的资料也很丰富,有很多支持的社区,有问题求教也有地方可去。
Ubuntu 严格来说不能算一个独立的发行版本,Ubuntu是基于Debian的unstable版本加强而来,可以这么说Ubuntu就是一个拥有Debian所有的优点,以及自己所加强的优点的近乎完美的Linux桌面系统。根据选择的桌面系统不同,有多个版本可供选择,比如基于unity的Ubuntu,基于Gnome的Ubuntu Gnome,基于KDE的Kubuntu,基于LXDE的Lubuntu以及基于Xfce的Xubuntu等。特点是界面非常友好,容易上手,对硬件的支持非常全面,是最适合做桌面系统的Linux发行版本。
Gentoo 伟大的Gentoo是Linux世界最年轻的发行版本,正因为年轻,所以能吸取在她之前的所有发行版本的优点,这也是Gentoo被称为最完美的Linux发行版本的原因之一。
FreeBSD,需要强调的是:FreeBSD并不是一个Linux系统!但FreeBSD与Linux的用户群有相当一部分是重合的,二者支持的硬件环境也比较一致,所采用的软件也比较类似,所以可以将FreeBSD视为一个Linux版本来比较。
FreeBSD拥有两个分支:stable和current。顾名思义,stable是稳定版,而current则是添加了新技术的测试版。FreeBSD采用Ports包管理系统,与Gentoo类似,基于源代码分发,必须在本地机器编后后才能运行,但是Ports系统没有Portage系统使用简便,使用起来稍微复杂一些。FreeBSD的最大特点就是稳定和高效,是作为服务器操作系统的最佳选择,但对硬件的支持没有Linux完备,所以并不适合作为桌面系统。
下面给为选择一个Linux发行版本犯愁的朋友一些建议:
如果你只是需要一个桌面系统,而且既不想使用盗版,又不想花大量的钱购买商业软件,那么你就需要一款适合桌面使用的Linux发行版本了,如果你不想自己定制任何东西,不想在系统上浪费太多时间,那么很简单,你就根据自己的爱好在ubuntu、kubuntu以及xubuntu中选一款吧,三者的区别仅仅是桌面程序的不一样。
如果你需要一个桌面系统,而且还想非常灵活的定制自己的Linux系统,想让自己的机器跑得更欢,不介意在Linux系统安装方面浪费一点时间,那么你的唯一选择就是Gentoo,尽情享受Gentoo带来的自由快感吧!
如果你需要的是一个服务器系统,而且你已经非常厌烦各种Linux的配置,只是想要一个比较稳定的服务器系统而已,那么你最好的选择就是CentOS了,安装完成后,经过简单的配置就能提供非常稳定的服务了。
如果你需要的是一个坚如磐石的非常稳定的服务器系统,那么你的唯一选择就是FreeBSD。
如果你需要一个稳定的服务器系统,而且想深入摸索一下Linux的各个方面的知识,想自己定制许多内容,那么我推荐你使用Gentoo。[3]  参考文献:百度百科

linux系统哪个版本更好用?

至于那个linux 发型版本更好用,这也是因人而异,下面我们给出一个统计图,针对不同发行版本系统的使用比例的对比。
linux 不同发行版本市场占有率排名
本文永久链接:https://www.osetc.com/archives/20394.html

Linux 下apache 服务器安装与配置教程(配置文件虚拟主机多站点详解)

本文主要讲述如何在linux系统下安装及配置APACHE web 服务器(httpd),并讲解如何配置针对apache 配置SSL, PHP,HTTPS等,并会详细介绍apache配置文件以及如何来配置虚拟主机,apache web 多站点配置等。

Apache 是什么

Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python解释器编译到服务器中。 摘自百度百科

Apache 该怎么读

Apache音译为阿帕奇,是北美印第安人的一个部落,叫阿帕奇族,在美国的西南部。也是一个基金会的名称、一种武装直升机等等。 所以我们一般讲apache读作“阿帕奇”。

Apache 安装与配置

1# Apache 服务器安装前的准备工作
检查该环境中是否已经存在httpd服务的配置文件,默认存储路径:/etc/httpd/httpd.conf(这是centos预装的Apache的一个ent版本,一般我们安装源代码版的Apache)。如果已经存在/etc/httpd/httpd.conf,请先卸载或者关闭centos系统自带的web服务,执行命令:chkconfig  httpd off,再或者把centos自带的httpd服务的80端口改为其他端口,只要不与我们安装的Apache服务的端口冲突就可以啦。
停止并卸载Linux系统自带的httpd服务,执行下面的命令:

service httpd stop
ps -ef | grep httpd
kill -9 pid号(逐个删除)
rpm -qa |grep httpd
rpm -e httpd软件包

最后我们来查看下apache默认配置文件httpd.conf是否被删除,执行下面的命令:

find / -name httpd.conf

2# 下载apache源码包(httpd-2.4.28.tar.gz或httpd-2.2.34.tar.gz)
执行下面的命令:

Wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.28.tar.gz

或者

Wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.2.34.tar.gz

3# 安装相关软件包apr、apr-util、pcre
在编译安装apache源码包之前,我们需要先安装三个依赖软件包apr、apr-util、pcre, 否则会出现下面的安装错误。

checking for APR... no
configure: error: APR not found.  Please read the documentation.

首先执行下面的wget命令来下载依赖包的源码包:

Wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.6.2.tar.gzWget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.0.tar.gzWget  https://sourceforge.net/settings/mirror_choices?projectname=pcre&filename=pcre2/10.30/pcre2-10.30.zip

执行下面的命令,编译安装相应软件包:
a)解决apr not found问题

# tar -zxf apr-1.6.2.tar.gz
# ./configure --prefix=/usr/local/apr
# make
# make install

b)解决APR-util not found问题

# tar -zxf apr-util-1.6.0.tar.gz
# ./configure --prefix=/usr/local/apr-util -with-apr=/usr/local/apr/bin/apr-1-config
# make
# make install

c)解决pcre-config for libpcre not found问题

# unzip pcre2-10.30.zip
# cd pcre2-10.30
# ./configure --prefix=/usr/local/pcre
# make
# make install

4# 安装apache 源码包
在安装Apache时,我分别针对不同版本进行了安装,在编译时是不同的,configure后跟的参数不同。
对于httpd-2.2.34版本编译命令如下:

./configure --prefix=/usr/local/apache2 (安装目录参数后面可以不加任何参数,直接安装即可)
make
make install

对于httpd-2.4.28版本编译安装命令如下:

./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre (除了指定Apache的安装目录外,还要安装apr、apr-util、pcre,并指定参数)
make
make install

5#启动apache 服务
执行下面的命令:

# /usr/local/apache2/bin/apachectl start

另外如果想停止或者重启apache服务,可以执行下面的命令:

#/usr/local/apache2/bin/apachectl stop
# /usr/local/apache2/bin/apachectl restart

网站的php程序文件放在/usr/local/apache2/htdocs目录下,下面应该会有一个名为index.php的文件。
6# 验证apache服务器是否配置成功
通过浏览器打开连接http://localhost:80, 如果看到页面中显示“It works!”字样,则代表Apache验证通过。如果网站的index后缀是PHP格式的,则要修改httpd.conf配置文件(/usr/local/apache2/conf),在DirectoryIndex增加 index.php。

#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>

如果网站不能访问,那么可能是防火墙开启导致,执行下面的命令,将防火墙关闭,或者开启80端口。
执行下面命令:

# service iptables stop

Apache 服务器配置文件详解

Apache的主配置文件:/etc/httpd/conf/httpd.conf
下面我们来依次介绍httpd.conf文件中每一项说明
1# ServerRoot 配置
ServerRoot “” 主要用于指定Apache的安装路径,此选项参数值在安装Apache时系统会自动把Apache的路径写入。Windows安装时,该选项的值为Windows安装的路径,Linux安装时该选项值为编译时选择的路径.
Apache 服务器配置文件详解-1-serverroot配置
2# Mutex default:logs
互斥:允许你为多个不同的互斥对象设置互斥机制mutex mechanism和互斥文件目录,或者修改全局默认值
如果互斥对象是基于文件的以及默认的互斥文件目录不在本地磁盘或因为其它原因而不适用,那么取消注释并改变目录。
下面这个命令是改变互斥对象的目录
Apache 服务器配置文件详解-2-Mutex default
3# Listen 配置
Apache 服务器配置文件详解-3-Listen 配置
Listen主要侦听web服务端口状态,默认为:80,即侦听所有的地址的80端口,注意这里也可以写成IP地址的侦听形式,不写即默认的地址:0.0.0.0
4# Dynamic Shared Object (DSO) Support(动态共享对象支持)
Apache 服务器配置文件详解-4-Dynamic Shared Object (DSO) Support
主要用于添加Apache一些动态模块,比如php支持模块。重定向模块,认证模块支持,注意如果需要添加某些模块支持,只需把相关模块前面注释符号取消掉。如图所示,要对Apache添加某个功能模块,把前面的注释符号去掉就行
5# Apache运行用户配置
Apache 服务器配置文件详解-5# Apache运行用户配置
此选项主要用指定Apache服务的运行用户和用户组,默认为:daemon,如图所示下
6# Apache服务默认管理员地址设置
Apache 服务器配置文件详解-6# Apache服务默认管理员地址设置
此选项主要用指定Apache服务管理员通知邮箱地址,选择默认值即可,如果有真实的邮箱地址也可以设置此值
7# Apache的默认服务名及端口设置
Apache 服务器配置文件详解7# Apache的默认服务名及端口设置
此选项主要用指定Apache默认的服务器名以及端口,默认参数值设置为:ServerName localhost:80即可
8# Apache的根目录访问控制设置
Apache 服务器配置文件详解-8# Apache的根目录访问控制设置
此选项主要是针对用户对根目录下所有的访问权限控制,默认Apache对根目录访问都是拒绝访问。后面会继续讲到
9# Apache的默认网站根目录设置及访问控制
Apache 服务器配置文件详解-9# Apache的默认网站根目录设置及访问控制
此区域的配置文件,主要是针对Apache默认网站根目录的设置以及相关的权限访问设置,默认对网站的根目录具有访问权限,此选项默认值即可
10# Apache的默认首页设置
Apache 服务器配置文件详解-10# Apache的默认首页设置
此区域文件主要设置Apache默认支持的首页,默认只支持:index.html首页,如要支持其他类型的首页,需要在此区域添加:如index.php表示支持index.php类型首页
11# Apache关于.ht文件访问配置
Apache 服务器配置文件详解-11# Apache关于.ht文件访问配置
此选项主要是针对.ht文件访问控制,默认为具有访问权限,此区域文件默认即可
12# Apache关于日志文件配置
Apache 服务器配置文件详解-12# Apache关于日志文件配置
此区域文件主要是针对Apache默认的日志级别,默认的访问日志路径,默认的错误日志路径等相关设置,此选项内容默认即可
13# URL重定向,cgi模块配置说明
Apache 服务器配置文件详解-13# URL重定向,cgi模块配置说明1
Apache 服务器配置文件详解-13# URL重定向,cgi模块配置说明1
Apache 服务器配置文件详解-13# URL重定向,cgi模块配置说明1
此区域文件主要包含一些URL重定向,别名,脚本别名等相关设置,以及一些特定的处理程序,比如cgi设置说明。后期会继续说道
14# MIME媒体文件,以及相关http文件解析配置说明
Apache 服务器配置文件详解-14# MIME媒体文件,以及相关http文件解析配置说明
此区域文件主要包含一些mime文件支持,以及添加一些指令在给定的文件扩展名与特定的内容类型之间建立映射关系,比如添加对php文件扩展名映射关系。
15# 服务器页面提示设置
Apache 服务器配置文件详解-15# 服务器页面提示设置
此区域可定制的访问错误响应提示,支持三种方式:1明文 ,2本地重定向 3,外部重定向;另外还包括内存映射或“发送文件系统调用”可被用于分发文件等配置
16# Apache服务器补充设置
Apache 服务器配置文件详解-16# Apache服务器补充设置
此区域主要包括:服务器池管理,多语言错误消息,动态目录列表形式配置,语言设置,用户家庭目录,请求和配置上的实时信息,虚拟主机,Apache Http Server手册,分布式创作和版本控制,多种类默认设置,mod_proxy_html,使其支持HTML4/XHTML1等等补充配置的补充
17# Apache服务器安全连接设置
Apache 服务器配置文件详解-17# Apache服务器安全连接设置
此区域主要是关于服务器安全连接设置,用于使用https连接服务器等设置的地方
-参考资料:http://blief.blog.51cto.com/6170059/1672955

Apache 配置虚拟主机(多站点)

Apache配置虚拟主机的三种方式:基于IP, 基于主机名和基于端口。 下面我们分别来介绍如何通过这三种配置apache虚拟主机的方式来配置多站点虚机主机。
一、基于IP
1#假设服务器有个IP地址为192.168.1.10,使用ifconfig在同一个网络接口eth0上绑定3个IP:

# ifconfig eth0:1 192.168.1.11
# ifconfig eth0:2 192.168.1.12
# ifconfig eth0:3 192.168.1.13

2# 修改hosts文件,添加三个域名与之一一对应:

192.168.1.11   www.test1.com
192.168.1.12   www.test2.com
192.168.1.13   www.test3.com

3# 建立虚拟主机存放网页的根目录,如在/www目录下建立test1、test2、test3文件夹,其中分别存放1.html、2.html、3.html

/www/test1/1.html
/www/test2/2.html
/www/test3/3.html

4#在httpd.conf中将附加配置文件httpd-vhosts.conf包含进来,接着在httpd-vhosts.conf中写入如下配置:

<VirtualHost 192.168.1.11:80>
ServerName www.test1.com
DocumentRoot /www/test1/
<Directory "/www/test1">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow From All
</Directory>
</VirtualHost>
<VirtualHost 192.168.1.12:80>
ServerName www.test1.com
DocumentRoot /www/test2/
<Directory "/www/test2">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow From All
</Directory>
</VirtualHost>
<VirtualHost 192.168.1.13:80>
ServerName www.test1.com
DocumentRoot /www/test3/
<Directory "/www/test3">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow From All
</Directory>
</VirtualHost>

 5# 测试下每个虚拟主机,分别访问www.test1.com、www.test2.com、www.test3.com
二、基于主机名
1# 设置域名映射同一个IP,修改hosts:

192.168.1.10  www.test1.com
192.168.1.10  www.test2.com
192.168.1.10  www.test3.com

2# 跟上面一样,建立虚拟主机存放网页的根目录

/www/test1/1.html
/www/test2/2.html
/www/test3/3.html

3# 在httpd.conf中将附加配置文件httpd-vhosts.conf包含进来,接着在httpd-vhosts.conf中写入如下配置:
为了使用基于域名的虚拟主机,必须指定服务器IP地址(和可能的端口)来使主机接受请求。可以用NameVirtualHost指令来进行配置。 如果服务器上所有的IP地址都会用到, 你可以用*作为NameVirtualHost的参数。在NameVirtualHost指令中指明IP地址并不会使服务器自动侦听那个IP地址。 这里设定的IP地址必须对应服务器上的一个网络接口。
下一步就是为你建立的每个虚拟主机设定<VirtualHost>配置块,<VirtualHost>的参数与NameVirtualHost指令的参数是一样的。每个<VirtualHost>定义块中,至少都会有一个ServerName指令来指定伺服哪个主机和一个DocumentRoot指令来说明这个主机的内容存在于文件系统的什么地方。
如果在现有的web服务器上增加虚拟主机,必须也为现存的主机建造一个<VirtualHost>定义块。其中ServerName和DocumentRoot所包含的内容应该与全局的保持一致,且要放在配置文件的最前面,扮演默认主机的角色。

NameVirtualHost *:80
<VirtualHost *:80>
ServerName *
DocumentRoot /www/
</VirtualHost>
<VirtualHost *:80>
ServerName www.test1.com
DocumentRoot /www/test1/
<Directory "/www/test1">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.test2.com
DocumentRoot /www/test2/
<Directory "/www/test2">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.test3.com
DocumentRoot /www/test3/
<Directory "/www/test3">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

4# 我们来测试下每个虚拟主机,分别访问www.test1.com、www.test2.com、www.test3.com
三、基于端口
1# 修改配置文件
将原来的

Listen 80

改为

Listen 80
Listen 8080

2# 更改虚拟主机设置:

<VirtualHost 192.168.1.10:80>
DocumentRoot /var/www/test1/
ServerName www.test1.com
</VirtualHost>
<VirtualHost 192.168.1.10:8080>
DocumentRoot /var/www/test2
ServerName www.test2.com
</VirtualHost>

参考资料:http://www.cnblogs.com/hi-bazinga/archive/2012/04/23/2466605.html

Apache 配置php

在LAMP环境里,我们需要安装并配置php,特别是当前流行开源的CMS系统,都是基于php语言开发。下面我们介绍如何在linux系统下来安装并配置PHP环境。
1# 下载php源码包

执行下面的命令:
wget http://museum.php.net/php5/php-5.4.10.tar.gz

2# 解压php-5.4.10.tar.gz源码包

 tar -zxvf php-5.4.10.tar.gz

3# 建立安装目标文件夹(也就是说等下安装的php要安装到这个文件夹里面)

mkdir /usr/local/php

4# 配置
回到原来解压后的文件夹

 ./configure --prefix=/usr/local/php  --with-apxs2=/usr/local/apache/bin/apxs

注意这里有一个-with-apxs2=/usr/local/apache/bin/apxs选项,其中apxs是在安装Apache时产生的,apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。我的理解是通过这个工具把PHP模块动态加载到Apache中
出现错误:configure: error: xml2-config not found. Please check your libxml2 installation.
运行yum install libxml2,然后再运行yum install libxml2-devel安装完毕后,重新运行上面的./configure命令。
5#编译并安装

make
make   test
make install

6# 配置文件

cp /usr/local/src/php-5.3.16/php.ini-development  /usr/local/php/lib/php.ini

把原来位于源代码里面的php.ini-development拷贝到/usr/local/php/lib/php.ini下,并且重命名为php.ini
7# 重启apache
8# 测试
在apache的htdocs下建立一个php文件test.php,里面的内容如下:

<?php
 phpinfo();
 ?>

然后在浏览器里输入http://127.0.0.1/test.php
如果出现php的相关配置,成功,如果什么都没有输入,说明失败,重新以上步骤或者查找原因
如果决定在安装后改变配置选项,只需重复最后的三步configure, make, 以及 make install,然后需要重新启动 Apache 使新模块生效。Apache不需要重新编译。
测试结果如下图:
apache php

Apache 和tomcat 有什么不同

经常在用apachetomcat等这些服务器,可是总感觉还是不清楚他们之间有什么关系,在用tomcat的时候总出现apache,总感到迷惑,到底谁是主谁是次,因此特意在网上查询了一些这方面的资料,总结了一下:
解析一:
apache支持静态页,tomcat支持动态的,比如servlet等,一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是由tomcat来处理的。
apche可以支持phpcgiperl,但是要使用java的话,你需要tomcatapache后台支撑,将java请求由apache转发给tomcat处理。
apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。
这两个有以下几点可以比较的:
1、两者都是apache组织开发的
2、两者都有HTTP服务的功能
3、两者都是免费的
不同点:
Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等)
TomcatApache组织在符合J2EE的JSP、Servlet标准下开发的一个JSP服务器

Runtime r=Runtime.getRuntime();
 Process p=null;
try
{
p=r.exec("notepad");
}
catch(Exception ex)
{
System.out.println("fffff");
}

解析二:
APACHE是一个web服务器环境程序 启用他可以作为web服务器使用 不过只支持静态网页 如(asp,php,cgi,jsp)等动态网页的就不行
如果要在APACHE环境下运行jsp 的话就需要一个解释器来执行jsp网页 而这个jsp解释器就是TOMCAT, 为什么还要JDK呢?因为jsp需要连接数据库的话 就要jdk来提供连接数据库的驱程,所以要运行jsp的web服务器平台就需要APACHE+TOMCAT+JDK
整合的好处是:
如果客户端请求的是静态页面,则只需要Apache服务器响应请求
如果客户端请求动态页面,则是Tomcat服务器响应请求
因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销
C是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
解析三:
apache:侧重于http server
tomcat:侧重于servlet引擎,如果以standalone方式运行,功能上与apache等效 , 支持JSP,但对静态网页不太理想;
apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。
换句话说,apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有容器(桶),而这个桶也可以不放在卡车上。
更多阅读:apache 配置SSL实现HTTPS访问
本文永久链接:https://www.osetc.com/archives/20369.html
 

Linux 下Apache 配置SSL实现HTTPS访问

本文主要讲述如何在linux系统下通过配置ssl模块实现网站的https访问的方法。
Web服务器在默认情况下使用HTTP,这是一个纯文本的协议。正如其名称所暗示的,纯文本协议不会对传输中的数据进行任何形式的加密。而基于HTTP的Web服务器是非常容易配置,它在安全方面有重大缺陷。任何”中间人”,通过精心防止的数据包嗅探器,是能够看到任何经过的数据包内容。更进一步,恶意用户甚至可以在传输路径设置一个假冒的WEB服务器冒名顶替实际的目标Web服务器。在这种情况下,最终用户可能实际上与假冒者服务器,而不是真正的目的服务器进行通信。这样,恶意用户可以通过精心设计的表单欺骗终端用户获取到敏感信息,如用户名密码。
为了处理这些类型的漏洞,大多数供应商往往在他们的web服务器应用HTTPS协议。对于只读类型的网站,用户只能读取内容,并没有实际提交任何信息,HTTP仍然是一个可行的选择。但是,对于保存敏感信息的网站,比如:用户需要登录来获得网站的服务,那么HTTPS是必须的。 HTTPS能够为一个网站提供以下能力。

  • 确保所有经过服务器传输的数据包都是经过加密的。
  • 建立了一个官方数字证书证书,使得假冒服务器无法冒充真正的服务器。

需要建立支持HTTPS的WEB服务器所要做的第一件事就是获得数字证书。数字证书可以在以下任一方法来获得。

  1. 自签名证书被推荐用于测试目的和个人项目。自签名证书,也可以用于服务提供商,不过一般适用于用户互相信任的情形。另外,自签名证书不用花钱购买。
  2. 证书可以由社区为基础的认证供应商如StartSSL和CACERT办法。这些证书也不需要花钱,但建议为个人项目。
  3. 对于全球性商业网站,建议从值得信赖的知名证书颁发机构购买证书。这些证书需要花钱,但他们增加了网络服务提供商的信誉。

1# 准备

在这篇文档中,我们将使用自签名证书。假设CentOS已经安装了Apache Web服务器。我们需要使用OpenSSL生成自签名证书。如果尚未安装OpenSSL,它可以使用yum来安装。

# yum install mod_ssl openssl

安装完毕后,会自动生成 /etc/httpd/conf.d/ssl.conf 文件,下文配置会用到!

2# 生成一个自签名证书

下面的命令可以被用来产生一个自签名的证书。
首先,生成2048位的加密私钥

# openssl genrsa -out server.key 2048

然后,生成证书签名请求(CSR),这里需要填写许多信息,如国家,省市,公司等

# openssl req -new -key server.key -out server.csr

最后,生成类型为X509的自签名证书。有效期设置3650天,即有效期为10年

# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

生成密钥流程如下图,供参考
Linux 下Apache 配置SSL实现HTTPS访问1
创建证书后,将文件复制到对应的目录。

# cp server.crt /etc/pki/tls/certs/
 # cp server.key /etc/pki/tls/private/
 # cp server.csr /etc/pki/tls/private/

3#配置Apache Web服务器

首先,修改下面的配置文件。仅需配置红色部分 SSLCertificateFile 和 SSLCertificateKeyFile

# vim /etc/httpd/conf.d/ssl.conf
### overwrite the following parameters ###
 SSLCertificateFile /etc/pki/tls/certs/server.crt
 SSLCertificateKeyFile /etc/pki/tls/private/server.key
### The following parameter does not need to be modified in case of a self-signed certificate. ###
 ### If you are using a real certificate, you may receive a certificate bundle. The bundle is added using the following parameters ###
 SSLCertificateChainFile /etc/pki/tls/certs/example.com.ca-bundle

然后,重新启动httpd服务使更改生效

# service httpd restart           // 或者  /etc/init.d/httpd restart

Web服务器现在可以使用HTTPS

4# 调整虚拟主机

Apache Web服务器可以配置为多个Web站点。这些站点在httpd的配置文件中以虚拟主机的形式定义。例如,让我们假设我们的Apache Web服务器托管站点为proxy.mimvp.com,网站所有的文件都保存在/var/www/html/virtual-web目录。
对于虚拟主机,典型的HTTP配置是这样的。

# vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80
<VirtualHost *:80>
 ServerAdmin email@example.com
 DocumentRoot /var/www/html/virtual-web
 ServerName proxy.mimvp.com
 </VirtualHost>

我们可以参考上面的配置创建HTTPS虚拟主机。

# vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:443
<VirtualHost *:443>
 SSLEngine on
 SSLCertificateFile /etc/pki/tls/certs/server.crt
 SSLCertificateKeyFile /etc/pki/tls/private/server.key
 <Directory /var/www/html/virtual-web>
 AllowOverride All
 </Directory>
 ServerAdmin email@example.com
 DocumentRoot /var/www/html/virtual-web
 ServerName proxy.mimvp.com
 </VirtualHost>

需要按照上面的配置,定义每个虚拟主机。添加虚拟主机后,重新启动Web服务。

# service httpd restart

现在的虚拟主机就可以使用HTTPS
实例见米扑代理: https://proxy.mimvp.com

5# 强制Apache Web服务器始终使用https

如果由于某种原因,你需要站点的Web服务器都只使用HTTPS,此时就需要将所有HTTP请求(端口80)重定向到HTTPS(端口443)。 Apache Web服务器可以容易地做到这一点。
a) 强制主站所有Web使用(全局站点)
如果要强制主站使用HTTPS,我们可以这样修改httpd配置文件:

# vim /etc/httpd/conf/httpd.conf
ServerName www.example.com:80
 Redirect permanent / https://www.example.com

重启Apache服务器,使配置生效:

# service httpd restart

b) 强制虚拟主机(单个站点)
如果要强制单个站点在虚拟主机上使用HTTPS,对于HTTP可以按照下面进行配置:

# vim /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
 ServerName proxy.mimvp.com
 Redirect permanent / https://proxy.mimvp.com/
 </VirtualHost>

重启Apache服务器,使配置生效:

# service httpd restart

单个站点全部使用HTTPS,则 http://proxy.mimvp.com 会强制重定向跳转到 https://proxy.mimvp.com
一般情况下,由于浏览器会自动拦截https未被认证的网址,因此建议同时保留 http://proxy.mimvp.com 和 https://proxy.mimvp.com ,或者购买权威的认证服务,让用户浏览器信任https浏览访问。
综上所述,当存在如用户登录,付款交易等交互时推荐HTTPS方式,可以提高服务器的安全性。
证书可以通过各种方式获得,如:自签名、社区提供的甚至商业机构够哦买的。管理员应当谨慎选择将要使用的证书的类型。
参考:http://blog.csdn.net/ithomer/article/details/50433363
本文永久链接:

linux FTP 服务器安装配置及命令使用教程(附:视频讲解)

本文将会讲述如何在linux系统下安装并配置最常用的FTP 服务器(VSFTPD),并通过实例来介绍如何利用FTP命令来上次文件和从ftp服务器上下载文件。

FTP 是什么

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Upload)。”下载”文件就是从远程主机拷贝文件至自己的计算机上;”上传”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。  -摘自 百度百科

linux FTP 服务器安装(VSFTP 软件包安装)

在linux系统下我们主要使用ftp软件是vsftp,它的进程名为vsftpd,下面我们来介绍如何来安装vsftp 软件包。
1# 检查vsftp软件包是否安装
执行下面的命令:

# rpm -qa |grep vsftp

2# 如果vsftp软件没有安装,执行下面的命令安装

# yum install vsftpd

linux FTP 服务启用

1# 启用vsftpd ftp 服务
执行下面命令:

# chkconfig vsftpd on

linux FTP 服务器启动/停止/重启

1# 启动vsftpd ftp 服务器
执行下面的命令:

# service vsftpd start

对于centos7 或者ubuntu 16.04 系统,执行命令:

# systemctl start vsftpd.service

2# 停止vsftpd ftp 服务器
执行下面的命令:

# service vsftpd stop

对于centos7 或者ubuntu 16.04 系统,执行命令:

# systemctl stop vsftpd.service

3# 重启vsftpd ftp 服务器

# service vsftpd restart

对于centos7 或者ubuntu 16.04 系统,执行命令:

# systemctl restart vsftpd.service

Linux FTP 端口开启(ftp端口号为21)

在linux下的ftp 服务默认使用的端口号为21,我们需要配置防火墙策略,允许对服务器21号端口的访问。
1# 使用vim 编辑器打开/etc/sysconfig/iptables配置文件
执行命令:

# vim /etc/sysconfig/iptables

2# 添加下面的防火墙策略到配置文件里

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

3# 保存并退出配置文件。重启防火墙服务
执行下面命令:

# service iptables restart

测试 FTP 服务器

执行下面命令:

# ftp localhost
# ftp ftp服务器ip地址

linux FTP 服务器配置

Vsftp ftp 软件默认的配置文件为/etc/vsftpd/vsftpd.conf, 我们需要根据实际情况来对配置文件做更改, 下面将会对一些典型的配置案例做介绍:
1# ftp 匿名用户配置
如果想让匿名用户浏览ftp服务器上的文件,但不能上传文件以及创建目录,那么我们可以对配置做下面的更改:

ftpd_banner=Welcom to my FTP Server!!!    //登录时显示的欢迎信息
 dirmessage_enable=YES            //允许为目录配置显示信息,显示每个目录下面message_file文件的内容
 setproctitle_enable=YES            //显示会话状态信息
anonymous_enable=YES            //接受匿名用户
 no_anon_password=YES            //匿名用户登录时不询问口令
 anon_root=目录路径            //匿名用户登录后所在的位置,可以根据自己的实际需求来修改
 write_enable=YES            //可以上传(全局控制)
 file_open_mode=0666            //上传文件的权限,配合umask使用
 anon_upload_enable=NO        //匿名用户可以上传
 anon_mkdir_write_enable=YES        //匿名用户可以建立目录
 anon_other_write_enable=YES        //匿名用户可以重名名、删除等权限
 anon_world_readable_only=YES    //如果设为YES,匿名用户登入者会被允许下载可阅读的文档
 chown_uploads=YES            //所有匿名上传的文件的所属用户将会被更改为chown_username
 chown_username=user            //匿名上传文件所属用户名

2# 允许用户上传文件并在服务器上创建目录的配置
通过vim 编辑vsftpd 配置文件,更改下面的配置:

anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES

保存并退出配置文件,并重启vsftpd 服务器
3# FTP网络连接参数
如果需要对ftp服务器网络连接参数做更改,可以优化下面的网络参数配置:

max_clients=1000            //可接受的最大连接数,可以根据自己的实际情况来修改
 max_per_ip=5                //每个IP地址的最大连接数,可以根据自己的实际情况来修改
 anon_max_rate=51200            //匿名用户的带宽(b/s)
 local_max_rate=5120000        //本地用户的带宽(b/s)
 idle_session_timeout=600        //空闲连接超时时间
 data_connection_timeout=120        //数据传输超时时间
 ACCEPT_TIMEOUT=60            //PAVS请求超时时间
 connect_timeout=60            //PORT模式连接超时时间
 connect_from_port_20=YES        //使用标准的20端口来连接FTP
 listen_address=地址或网段        //绑定到某个IP或网段,其他IP不能访问该FTP
 listen_port=2121            //绑定到某个端口
 ftp_data_port=2020            //数据传输端口
 pasv_max_port=0            //PASV连接模式时可以使用port范围的上界,0表示任意。
 pasv_min_port=0            //PASV连接模式时可以使用port范围的下界,0表示任意。

linux ftp 服务器配置后可能遇到的问题

Ftp 服务器中的默认文件存放路径是在/var/ftp/pub 目录下,服务器配置完毕后,可能会遇到一些小问题,比如:无法登陆,不能创建目录,不能写文件等,造成这种问题的原因主要是权限问题。我们需要对权限做一些更改,如下:
1# 更改pub目录的权限为755, 执行下面命令:

# chmod 755 -R /var/ftp/pub

需要注意的是,pub目录的权限不能设置为777, 否则会报错。
2# 如果匿名用户需要上传文件,那么需要给pub目录的其它组增加写的权限,执行下面命令:

#chmod o+w /var/ftp/pub/

Linux 下通过shell 脚本自动化实现FTP服务器的安装及配置

在实际的工作中,可能需要实现ftp服务器的自动化安装及配置,那么我们就可以使用linux bash shell 脚本来实现其自动化安装配置。下面的脚本仅作为参考使用,具体的设置可以执行更改。

#!/bin/bash
# 设置ftp环境的脚本。ftp的根目录为只读,其下的writable目录为可写
# 可自定义以下四项
# ftp用户名
userName="test"
# ftp密码
password="test"
# ftp根目录,末尾不要加/
ftp_dir="$HOME/ftp"
# 可写目录的目录名
writable="writable"
# 如果没有加sudo,提示错误并退出
if [ "x$(id -u)" != x0 ]; then
echo "Error: please run this script with 'sudo'."
exit 1
fi
# 核心工具,vsftpd。 -y是对所有提示都回答yes
sudo apt-get -y install vsftpd
# db-util是用来生成用户列表数据库的工具
sudo apt-get -y install db-util
# 以下步骤参考https://help.ubuntu.com/community/vsftpd#The_workshop
# 创建用户名和密码的数据库,以单数行为用户名,双数行为密码记录
cd /tmp
printf "$userName\n$password\n" > vusers.txt
db_load -T -t hash -f vusers.txt vsftpd-virtual-user.db
sudo cp -f vsftpd-virtual-user.db /etc/
cd /etc
chmod 600 vsftpd-virtual-user.db
if [ ! -e vsftpd.conf.old ]; then
sudo cp -f vsftpd.conf vsftpd.conf.old
fi
# 创建PAM file。bash的here-document,直接输出这些内容覆盖原文件
(sudo cat <<EOF
auth       required     pam_userdb.so db=/etc/vsftpd-virtual-user
account    required     pam_userdb.so db=/etc/vsftpd-virtual-user
session    required     pam_loginuid.so
EOF
) > pam.d/vsftpd.virtual
# 获取当前的用户名,不能用whoami或$LOGNAME,否则得到的是root
owner=`who am i| awk '{print $1}'`
# 创建vsftpd的配置文件。
(sudo cat <<EOF
listen=YES
anonymous_enable=NO
local_enable=YES
virtual_use_local_privs=YES
write_enable=YES
local_umask=000
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
hide_ids=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd.virtual
guest_enable=YES
user_sub_token=$USER
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
EOF
) > vsftpd.conf
sudo echo "local_root=$ftp_dir" >> vsftpd.conf
# 虚拟用户需要映射为本地用户,设为自己,避免权限问题,但同时也令自己对ftp根目录不可写
sudo echo "guest_username=$owner" >> vsftpd.conf
# 设置了每个虚拟用户只可以浏览其根及子目录(否则可访问磁盘根目录),
# 这样会被要求根目录不可写,所以创建一个writable的子目录
mkdir "$ftp_dir"
mkdir "$ftp_dir/$writable"
sudo chmod a-w "$ftp_dir"
sudo chown -R $owner:$owner $ftp_dir
sudo /etc/init.d/vsftpd restart
#该脚本出自:blog.csdn.net/hursing

linux ftp 服务器安装及配置视频讲解教程

如果对上面的某些步骤还有不明白的地方,那么可以参考下面的vsftp 视频安装及配置教程。

linux FTP 命令

ls: 显示远端文件列表(ils 显示本地文件列表)。# l 的意思就是local ils比较特殊
cd: 切换远端目录(lcd 切换本地目录)。
get:下载远端文件。
mget:下载远端文件(可以用通配符也就是 *)。
pget:使用多个线程来下载远端文件, 预设为五个。
mirror:下载/上传(mirror -R)/同步 整个目录。
put:上传文件。
mput:上传多个文件(支持通配符)。
mv:移动远端文件(远端文件改名)。
rm:删除远端文件。 参数-r,递归删除文件夹
mrm:删除多个远端文件(支持通配符)。
mkdir:建立远端目录。
rmdir:删除远端目录。
pwd:显示目前远端所在目录(lpwd 显示本地目录)。
du:计算远端目录的大小
set net:limit-rate 10000,10000 限制上传下载各为10KB/s
set ftp:charset gbk 设置远程ftp site用gbk编码
! 执行本地 shell的命令(由于lftp 没有 lls, 故可用 !ls 来替代)
lcd:切换本地目录
lpwd:显示本地目录
alias:定义别名
exit:退出ftp

FTP 命令的实例

1# 登陆linux ftp服务器
命令格式:ftp [hostname| ip-address] 执行下面的命令:

ftp 192.168.1.105

然后输入相应的ftp用户名和密码。
2# 从ftp服务器上下载文件
下载文件通常用get和mget这两条命令。
a) 使用get 命令
格式:get [remote-file] [local-file] 将文件从远端主机中传送至本地主机中.例如要下载ftp服务器上的fio.txt 文件到本地目录上
执行下面的命令:

ftp> get fio.txt  fio.txt

b) 使用mget命令
格式:mget [remote-files] 从远端主机接收一批文件至本地主机.例如要获取服务器上/var/pub/目录下的所有文件
执行下面的命令:

ftp> cd /var/pub/
ftp> mget *.*

3#往linux ftp服务器上传文件
a)使用 put命令
格式:put local-file [remote-file] 将本地一个文件传送至远端主机中.例如要把本地的fio.txt上传到到远程ftp服务器的/var/pub 目录里,执行下面的命令

ftp> put fio.txt  /var/pub

b)使用 mput命令
格式:mput local-files
将本地主机中一批文件传送至远端主机.
例如要把本地当前目录下所有txt文件上传到ftp服务器的/var/pub/ 下

ftp> cd /var/pub/
ftp> mput *.txt

4# 断开ftp连接
bye:中断与服务器的连接。
执行下面的命令:

ftp> bye

更多阅读:LFTP : 一个功能强大的命令行FTP程序 
本文永久地址:https://www.osetc.com/archives/20354.html

Windows 下的免费 SSH 客户端工具

如果你的操作系统是 Windows,而你想要连接 Linux 服务器相互传送文件,那么你需要一个简称 SSH 的 Secure Shell 软件。实际上,SSH 是一个网络协议,它允许你通过网络连接到 Linux 和 Unix 服务器。SSH 使用公钥加密来认证远程的计算机。你可以有多种途径使用 SSH,无论是自动连接,还是使用密码认证登录。
本篇文章介绍了几种可以连接 Linux 服务器 SSH 客户端。
让我们开始吧。

Putty

Putty 是最有名的 SSH 和 telnet 客户端,最初由 Simon Tatham 为 Windows 平台开发。Putty 是一款开源软件,有可用的源代码,和一群志愿者的开发和支持。

Putty 非常易于安装和使用,通常大部分的配置选项你都不需要修改。你只需要输入少量基本的参数,就可以开始很简单地建立连接会话。点此下载 Putty。

Bitvise SSH Client

Bitvise SSH 是一款支持 SSH 和 SFTP 的 Windows 客户端。由 Bitvise 开发和提供专业支持。这款 SSH 客户端性能强悍,易于安装、便于使用。Bitvise SSH 客户端拥有功能丰富的图形界面,通过一个有自动重连功能的内置代理进行动态端口转发。

Bitvise SSH 客户端对个人用户使用是免费的,同时对于在组织内部的个人商业使用也一样。你可以在这里下载 Bitvise SSH 客户端

MobaXterm

MobaXterm 是你的远程计算的终极工具箱。在一个 Windows 应用里,它为程序员、网管、IT 管理员及其它用户提供了精心裁剪的一揽子功能,让他们的远程操作变得简约时尚。

MobaXterm 提供了所有重要的远程网络工具 (如SSH、 X11、 RDP、 VNC、 FTP、 MOSH 等等),以及 Windows 桌面上的 Unix 命令(bash、 ls、 cat、sed、 grep、 awk、 rsync等等),而这些都是由一个开箱即用的单一的便携程序所提供。MobaXterm 对个人使用免费,你可以在这里下载 MobaXterm。

DameWare SSH

我认为 DameWare SSH 是最好的免费SSH客户端。(LCTT 译注:似乎 DameWare 已经取消了该软件的下载。)

这个免费工具是一个终端模拟器,可以让你从一个易用的控制台建立多个 telnet 和 SSH 连接。

  • 用一个带标签的控制台界面管理多个会话
  • 将常用的会话保存在 Windows 文件系统中
  • 使用多套保存的证书来轻松登录不同的设备
  • 使用 telnet、SSH1 和 SSH2 协议连接计算机和设备

SmarTTY

SmarTTY 是一款免费的多标签 SSH 客户端,支持使用 SCP 命令随时复制文件和目录。

大多数 SSH 服务器每个连接支持最多10个子会话.SmarTTY 在这方面做得很好:没有烦人的多个窗口,不需要重新登录,仅仅打开一个新的标签页就可以开始了!

Cygwin

Cygwin 是一款 GNU 和开源工具的大杂烩,提供的功能近似于一个 Windows 平台下的 Linux。

Cygwin 包括了一个称为模拟库的 Unix 系统:cygwin.dll,集成了大量的 GNU 和其它的免费软件,以大量的可选包方式组织而成。在这些安装包中,有高质量的编译器和其他软件开发工具、一个X11服务器、一套完整的X11开发套件、GNU emacs 编辑器、Tex 和 LaTeX、openSSH(客户端和服务器),除此之外还有很多,包括在微软 Windows 下需要编译和使用 PhysioToolkit 软件的每一样东西。
读完我们的文章后,不知你中意哪一款 SSH 客户端?你可以留下你的评论,描述你喜欢的系统和选择的原因。当然,如果有另外的 SSH 客户端没有被本文列举出来,你可以帮助我们补充。
via: linux.cn

最实用的 Linux 命令行使用技巧 (必看!)

我们可能每天都会要使用到很多的 Linux 命令行。 我们也会网络上知晓一些使用它们的小技巧,但是如果我们没有时常来进行练习,就有可能会忘掉怎么去使用它们。 所以我就决定把那些你可能会忘记的小提示和小技巧,或者对你而言可能是全新的东西都列表来。

将输出内容以表格的形式显示出来

有时,在你看到命令行执行的输出时,因为字符串过度拥挤(比如说 mount 命令的输出)导致输出内容难以识别。如果我们看到的内容是一张表格会如何呢?其实这是很容易做到的!

mount | column –t:


在此例中,由于内容中留了空格,所以输出的形式就美观了起来。 那如果想要的分隔符是别的什么符号,比如说冒号,又该怎么去做呢? (例如,在 cat/etc/passwd 的输出内容中使用)
这时候只需要使用 -s 参数指定分隔符就行了,像下面这样。

cat /etc/passwd | column -t -s:

重复执行一个命令,直到它运行成功

如果在 Google 上搜索这个功能,你会发现很多人都问到了如何重复执行命令,直到这个命令成功返回并且运行正常。 Google上的建议里就包括 ping 服务器,直到它变得空闲为止,还有就是检查是否有向特定的目录上传了具有特定扩展名的文件,还有就是检查特定的URL是否已经存在,诸如此类的办法。
其实你还可以使用 while true 的循环来实现来实现这个功能:

在上面这个示例中,>/dev/null 2>&1 会让程序的输出重定向到 /dev/ null。标准错误和标准输出都会被包含进去。
这是我认为最酷的Linux命令行技巧之一。

按内存资源的使用量对进程进行排序

ps aux | sort -rnk 4:

按 CPU 资源的使用量对进程进行排序

ps aux | sort -nk 3:


如果想要检查你的机器架构,那就执行 getconf LONG_BIT。

可以同时查看多个日志文件

毫无疑问,你可能已经会使用 tail  命令来查看日志文件了,但可能有时候你还想着能同时查看多个日志文件。 使用 multi-tail 命令就支持支持文本的高亮显示,内容过滤以及更多你可能需要的功能:

如果系统里还没有这个命令,运行 apt-get install multitail 命令就可以把它给装上。

回到你操作过的上一个目录去

只需敲入 cd – 就会返回到你操作过的上一个目录中去。

让非交互式 Shell 会话可进行交互

想要这样做,那就把设置从 ~/.bashrc 改成 ~/.bash_profile 吧。

定时的监视性命令输出

使用 watch 命令(watch df -h),你就可以查看到任何命令的任何输出。例如,你可以查看可用空间以及它的使用量增长情况。
通过利用 watch 命令来操作会变化的数据,你可以尽情想象自己能拿这个来做些什么哦。

在会话关掉以后继续运行程序

如果你在后台运行了什么程序,然后你关掉了的 shell 会话,那么这个后台运行的程序就会被你的 shell 杀掉。关闭 shell 以后怎么让程序继续运行下去呢?
这个可以用 nohup 命令做到 – 该指令表示不做挂断操作:

nohup wget site.com/file.zip

此命令是最容易被遗忘的 Linux 命令行技巧之一,因为我们许多人都会使用另外一个类命令的 screen 环境:

这样会在同一个目录下生成一个名称为 nohup.out 的文件,其中包含了正在运行的程序的输出内容:

命令很酷,对吧?

自动对任何命令回答 Yes 或者 No

如果你想自动化需要向用户说的 Yes 的过程,可以使用 yes 命令来实现:yes | apt-get update。
也许你想做的是自动地说“No”。这个可以使用 yes no | 命令来实现。

创建具有指定大小的文件

可以使用 dd 命令来创建出具有指定大小的文件:dd if=/dev/zero of=out.txt bs=1M count=10。
这样就会创建出一个 10 MB 的文件,填充零作为内容:

以根目录用户来运行最后一个命令

有时,你会忘记在需要 root 权限的命令之前敲入 sudo。这时候你没必要去重写命令; 只要输入 sudo 就行了!

对命令行会话进行记录

如果想要把自己在 shell 屏幕上敲的内容记录下来,可以使用 script 命令将所有敲写的内容保存到一个名为 typescriptscript 的文件中去。
等你敲入 exit 命令以后,所有命令就都会被写入该文件,以便你事后再回过头去查看。

用标签符号替换空格符

可以使用 tr 命令替换任何字符,这个用起来非常方便:cat geeks.txt | tr ‘:[space]:’ ‘\t’ > out.txt.

将文件内容转换为大写或者小写

可以这样实现:cat myfile | tr a-z A-Z> output.txt。

强大的 Xargs 命令

xargs 命令是最重要的 Linux 命令行技巧之一。你可以使用这个命令将命令的输出作为参数传递给另一个命令。例如,搜索 png 文件然后对其进行压缩或者其它操作:

find. -name *.png -type f -print | xargs tar -cvzf images.tar.gz

又或者你的文件中有一个 URL 的列表,而你想要做的是以不同的方式下载或者处理这些 URL,可以这样做:

cat urls.txt | xargs wget


xargs command
请你要记得,第一个命令的输出会在 xargs 命令结尾处传递。
那如果命令需要中间过程的输出,该怎么办呢?这个简单!
只需要使用 {} 并结合 -i 参数就行了。如下所示,替换在第一个命令的输出应该去的地方的参数:

ls /etc/*.conf | xargs -i cp {} /home/likegeeks/Desktop/out

这只是 Linux 命令行技巧其中的几个而已。你可以使用其他命令来做一些更 HAPPY 的事情,比如 awk 命令和 sed 命令!
如果你知道一些我在这里没有提到的任何其它的极客命令,欢迎评论。
 

Linux系统下find命令递归删除查找目录的方法

本文将会讲述如何使用linux系统下的find查找命令来查找目录或文件,并将查找到的所有文件和目录递归删除掉。

Linux find 命令递归删除非空目录

通常情况下我们会想到find命令里的删除操作是使用-delete选项,但是使用该选项只能删除空目录的文件,不能递归删除该目录里的其它文件。如下面的例子:

$ ls dir1
test1
$ find ./ -name "dir1" -type d -delete
find: cannot delete `./dir1': Directory not empty

可以使用下面的Linux find 命令删除非空目录,如:

$ find ./ -name “dir1” -type d -exec rm -rf {} +

或者

$ find ./ -name “dir1” -type d -exec rm -rf  \;

Linux find 命令结合xargs命令实现删除非空目录

删除当前目录下的所有空目录

$ find ./ -type d -empty -print0 |xargs -0 -i {} rm -rf  “{}”

删除当前目录下所有以“dir”开头的目录

$ find ./ -type d -name “dir*” -print0 |xargs -0 -I {} rm -rf “{}”

 

Linux系统下通过bash shell脚本实现倒计时的方法

本文主要讲述如何在linux系统下通过bash shell 脚本来实现在屏幕上输出倒计时的方法。
先来看看实现后的脚本,如下:

#!/bin/bash
 # script name: ctimer.sh
 # Author: osetc.com
 # --------------------------------------------------------
row=2
 col=2
 countdown() {
 msg="starting..."
 clear
 tput cup $row $col
 echo -n "$msg"
 l=${#msg}
 l=$(( l+$col ))
 for i in {30..1}
 do
     tput cup $row $l
     echo -n "$i"
     sleep 1
 done
 }
 countdown

首先我们定义了一个名为countdown的shell 函数,在函数里定义了一个msg变量用于在屏幕上显示倒计时信息,clear 命令用于清除屏幕上的历史输出信息,tput cut 命令用于设置屏幕输出信息的位置,最后通过for循环来实现倒计时,并更新输出信息的位置。
执行上面的脚本

$bash ctimer.sh
 Starting...30

 

Linux系统下批量升级LXD容器里的虚拟机的方法

本文将会讲述如何在linux 系统下自动升级LXD容器里的所有的虚拟机。
下面我们通过两种方法实现自动升级所有虚拟机:

方法一:使用shell 脚本来升级

手动的升级命令是:

/usr/bin/lxc exec 虚拟机名 -- /usr/bin/apt-get -y upgrade (ubuntu系统)
/usr/bin/lxcexec 虚拟机名  -- /usr/bin/yum -y update    (centos 系统)

下面来创建bash shell 脚本来自动升级所有的虚拟机:

#!/bin/bash
#脚本名:vmUpgrade.sh
#--------------------------------
cmd="$@"for i in 虚机1 虚机2 虚机3 虚机4
do
echo "[*** $i ***]"
/usr/bin/lxc exec $i -- $cmd
done

下面就可以调用脚本来升级vm了,执行下面的命令:
Ubuntu 系统:

$ ./vmUpgrade.sh /usr/bin/apt-get update
$ ./vmUpgrade.sh /usr/bin/apt-get -y upgrade

Centos 系统:

$ ./vmUpgrade.sh /usr/bin/yum -y update

方法二:使用Ansible 自动化工具

1# 安装ansible 工具
执行命令:

$ sudo apt-get install ansible

命令输出:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:
gyp javascript-common libjs-inherits libjs-jquery libjs-node-uuid libjs-underscore libnvpair1linux libssl-dev libssl-doc libuutil1linux libuv1-dev
libzfs2linux libzpool2linux zfs-doc zlib1g-dev
使用'apt autoremove'来卸载它(它们)。
将会同时安装下列软件:
ieee-data libyaml-0-2 python-crypto python-ecdsa python-httplib2 python-jinja2 python-markupsafe python-netaddr python-paramiko python-selinux
python-six python-yaml
建议安装:
sshpass python-crypto-dbg python-crypto-doc python-jinja2-doc ipython python-netaddr-docs
下列【新】软件包将被安装:
ansible ieee-data libyaml-0-2 python-crypto python-ecdsa python-httplib2 python-jinja2 python-markupsafe python-netaddr python-paramiko python-selinux
python-six python-yaml
升级了 0 个软件包,新安装了 13 个软件包,要卸载 0 个软件包,有 5 个软件包未被升级。
需要下载 2,903 kB 的归档。
解压缩后会消耗 17.6 MB 的额外空间。
您希望继续执行吗? [Y/n] y
获取:1 http://archive.ubuntu.com/ubuntu xenial/main amd64 libyaml-0-2 amd64 0.1.6-3 [47.6 kB]
获取:2 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 python-crypto amd64 2.6.1-6ubuntu0.16.04.2 [246 kB]
获取:3 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-markupsafe amd64 0.23-2build2 [15.5 kB]
获取:4 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-jinja2 all 2.8-1 [109 kB]
获取:5 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-six all 1.10.0-3 [10.9 kB]
获取:6 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-ecdsa all 0.13-2 [34.0 kB]
获取:7 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-paramiko all 1.16.0-1 [109 kB]
获取:8 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-yaml amd64 3.11-3build1 [105 kB]
获取:9 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-httplib2 all 0.9.1+dfsg-1 [34.2 kB]
获取:10 http://archive.ubuntu.com/ubuntu xenial/main amd64 ieee-data all 20150531.1 [830 kB]
获取:11 http://archive.ubuntu.com/ubuntu xenial/main amd64 python-netaddr all 0.7.18-1 [174 kB]
获取:12 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 ansible all 2.0.0.2-2ubuntu1 [1,016 kB]
获取:13 http://archive.ubuntu.com/ubuntu xenial/universe amd64 python-selinux amd64 2.4-3build2 [173 kB]
已下载 2,903 kB,耗时 10秒 (287 kB/s)
正在选中未选择的软件包 libyaml-0-2:amd64。
(正在读取数据库 ... 系统当前共安装有 69061 个文件和目录。)
正准备解包 .../libyaml-0-2_0.1.6-3_amd64.deb  ...
正在解包 libyaml-0-2:amd64 (0.1.6-3) ...
正在选中未选择的软件包 python-crypto。
正准备解包 .../python-crypto_2.6.1-6ubuntu0.16.04.2_amd64.deb  ...
正在解包 python-crypto (2.6.1-6ubuntu0.16.04.2) ...
正在选中未选择的软件包 python-markupsafe。
正准备解包 .../python-markupsafe_0.23-2build2_amd64.deb  ...
正在解包 python-markupsafe (0.23-2build2) ...
正在选中未选择的软件包 python-jinja2。
正准备解包 .../python-jinja2_2.8-1_all.deb  ...
正在解包 python-jinja2 (2.8-1) ...
正在选中未选择的软件包 python-six。
正准备解包 .../python-six_1.10.0-3_all.deb  ...
正在解包 python-six (1.10.0-3) ...
正在选中未选择的软件包 python-ecdsa。
正准备解包 .../python-ecdsa_0.13-2_all.deb  ...
正在解包 python-ecdsa (0.13-2) ...
正在选中未选择的软件包 python-paramiko。
正准备解包 .../python-paramiko_1.16.0-1_all.deb  ...
正在解包 python-paramiko (1.16.0-1) ...
正在选中未选择的软件包 python-yaml。
正准备解包 .../python-yaml_3.11-3build1_amd64.deb  ...
正在解包 python-yaml (3.11-3build1) ...
正在选中未选择的软件包 python-httplib2。
正准备解包 .../python-httplib2_0.9.1+dfsg-1_all.deb  ...
正在解包 python-httplib2 (0.9.1+dfsg-1) ...
正在选中未选择的软件包 ieee-data。
正准备解包 .../ieee-data_20150531.1_all.deb  ...
正在解包 ieee-data (20150531.1) ...
正在选中未选择的软件包 python-netaddr。
正准备解包 .../python-netaddr_0.7.18-1_all.deb  ...
正在解包 python-netaddr (0.7.18-1) ...
正在选中未选择的软件包 ansible。
正准备解包 .../ansible_2.0.0.2-2ubuntu1_all.deb  ...
正在解包 ansible (2.0.0.2-2ubuntu1) ...
正在选中未选择的软件包 python-selinux。
正准备解包 .../python-selinux_2.4-3build2_amd64.deb  ...
正在解包 python-selinux (2.4-3build2) ...
正在处理用于 man-db (2.7.5-1) 的触发器 ...
正在设置 libyaml-0-2:amd64 (0.1.6-3) ...
正在设置 python-crypto (2.6.1-6ubuntu0.16.04.2) ...
正在设置 python-markupsafe (0.23-2build2) ...
正在设置 python-jinja2 (2.8-1) ...
正在设置 python-six (1.10.0-3) ...
正在设置 python-ecdsa (0.13-2) ...
正在设置 python-paramiko (1.16.0-1) ...
正在设置 python-yaml (3.11-3build1) ...
正在设置 python-httplib2 (0.9.1+dfsg-1) ...
正在设置 ieee-data (20150531.1) ...
正在设置 python-netaddr (0.7.18-1) ...
正在设置 ansible (2.0.0.2-2ubuntu1) ...
正在设置 python-selinux (2.4-3build2) ...
正在处理用于 libc-bin (2.23-0ubuntu9) 的触发器 ...

2# 创建一个yml个格式的ansible playbook 文件(update.yml),加入下面的内容

# Update host running on Debian/Ubuntu
- name: Updating host using apt
apt:
update_cache: yes
upgrade: dist
#
# Now update VMs powered by Debian/Ubuntu Linux
#
- name: Run lxc to update debian/ubuntu vms repo
command: /usr/bin/lxc exec {{ item }} -- /usr/bin/apt-get -y update
with_items:
- ubuntuvm1
- debianvm2
- ubuntuvm3
- name: Run lxc to upgrade debian/ubuntu vms pacakges
command: /usr/bin/lxc exec {{ item }} -- /usr/bin/apt-get -y upgrade
with_items:
- ubuntuvm1
- debianvm2
- ubuntuvm3
#
# Now update VMs powered by CentOS 7 Linux
#
- name: Run lxc to upgrade centos vms
command: /usr/bin/lxc exec {{ item }} -- /usr/bin/yum -y update
with_items:
- centosvm4
- centosvm5
- centosvm6

3# 执行下面的ansible-playbook命令,执行升级操作

$ ansible-playbook -i /etc/ansible/hosts update.yml

 

Linux系统下获取内核kernel版本号

本文将会讲述如何在linux 系统下获取内核kernel的版本号信息。本文主要针对linux初学者。
下面我们通过两种方法来在获取当前linux系统的内核版本号。

1# 查看/proc/version

$ cat /proc/version
Linux version 4.11.0-14-generic (buildd@lcy01-08) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #20~16.04.1-Ubuntu SMP Wed Aug 9 09:06:22 UTC 2017

从上面的输出里,我们可以看到当前linux系统的内核版本是4.11.0.-14.

2# 通过uname 命令来查看内核版本

$ uname  -r

$ uname -mrs

命令输出如下:

Linux 4.11.0-14-generic x86_64

Linux/ubuntu: SSH 无法远程登录的解决方法

默认情况下,ubuntu系统在安装完成之后,不会安装openssh相关的软件包,所有我们在远程ssh登录到ubuntu系统的时候会失败。

本文将会讲述如何来安装openssh相关软件包来解决无法远程ssh登录到ubuntu系统的问题。

1# 执行下面的apt-get命令安装openssh相关软件包。

apt-get install openssh*

ubuntutest@ubuntutest:~$ apt-get install openssh*
E: 无法打开锁文件 /var/lib/dpkg/lock - open (13: Permission denied)
E: 无法对状态列表目录加锁(/var/lib/dpkg/),请查看您是否正以 root 用户运行?
ubuntutest@ubuntutest:~$ sudo apt-get install openssh*
[sudo] password for ubuntutest:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
注意,根据Glob 'openssh*' 选中了 'openssh-known-hosts'
注意,根据Glob 'openssh*' 选中了 'openssh-blacklist-extra'
注意,根据Glob 'openssh*' 选中了 'openssh-blacklist'
注意,根据Glob 'openssh*' 选中了 'openssh-sftp-server'
注意,根据Glob 'openssh*' 选中了 'openssh-server'
注意,根据Glob 'openssh*' 选中了 'openssh-client'
注意,根据Glob 'openssh*' 选中了 'openssh-client-ssh1'
openssh-blacklist 已经是最新版 (0.4.1+nmu1)。
openssh-blacklist-extra 已经是最新版 (0.4.1+nmu1)。
openssh-known-hosts 已经是最新版 (0.6.2-1)。
openssh-client 已经是最新版 (1:7.2p2-4ubuntu2.2)。
openssh-server 已经是最新版 (1:7.2p2-4ubuntu2.2)。
openssh-sftp-server 已经是最新版 (1:7.2p2-4ubuntu2.2)。
openssh-client-ssh1 已经是最新版 (1:7.2p2-4ubuntu2.2)。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 128 个软件包未被升级。

2# 查看sshd 服务是否启动,执行下面的命令
ps aux | grep sshd

ubuntutest@ubuntutest:~$ ps aux | grep sshd
root      1129  0.0  0.2  65520  5272 ?        Ss   10:23   0:00 /usr/sbin/sshd -D
root      1304  0.0  0.3  95400  7012 ?        Ss   10:24   0:00 sshd: root@pts/0

3# 使用非root 用户来验证是否能够SSH远程登录到该Ubuntu系统

ubuntutest@ubuntutest:~$ ssh ubuntutest@localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:gy+Rueth1RoavXu2zvs230nZUiCSRIcQZvivSDixfn4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
ubuntutest@localhost's password:
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-62-generic x86_64)
 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
128 个可升级软件包。
62 个安全更新。
Last login: Wed Aug  2 10:11:14 2017
ubuntutest@ubuntutest:~$

Linux/ubuntu:如何更改apt-get源

当ubuntu系统默认的官方更新源下载速度慢或者宕机的情况下,我们需要更改到其它的第三方软件包更新源,比如163,阿里云等。

本文将会讲述如何在ubuntu系统下,更改默认的ubuntu官方源到aliyun 上。

方法一:在图形界面下,打开“软件包管理中心”,在“软件源” 中选择”中国的服务器“下的”mirros.aliyun.com“, 系统会自动根据ubuntu的不同版本来选择软件源。

方法二:针对ubuntu 服务器版的系统 或者没有安装GUI的ubuntu 系统,可以通过更改配置文件的方法来实现。
1# 备份/etc/apt/sources.list 文件, 输入下面的命令:

cp /etc/apt/sources.list /etc/apt/sources.list.bak

2# 使用vi 编辑器打开 /etc/apt/sources.list 文件,删除所有的旧的软件源或者将下面相应的条目添加到文件的最前面:
根据你当前的ubuntu版本,来选择相应的条目:

xenial (16.04)

deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse


wily (15.10)

deb http://mirrors.aliyun.com/ubuntu/ wily main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ wily-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ wily-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ wily-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ wily-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ wily main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ wily-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ wily-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ wily-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ wily-backports main restricted universe multiverse


vivid (15.04)

deb http://mirrors.aliyun.com/ubuntu/ vivid main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ vivid-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ vivid-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ vivid-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ vivid-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ vivid main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ vivid-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ vivid-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ vivid-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ vivid-backports main restricted universe multiverse


trusty(14.04)

  deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

 

Quantal(12.10)

deb http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse

 

Precise(12.04)

  deb http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ precise main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ precise-security main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ precise-updates main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ precise-proposed main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ precise-backports main restricted universe multiverse        


Oneiric(11.10)

deb http://mirrors.aliyun.com/ubuntu/ oneiric main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ oneiric-security main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ oneiric-updates main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ oneiric-proposed main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ oneiric-backports main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ oneiric main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ oneiric-security main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ oneiric-updates main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ oneiric-proposed main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ oneiric-backports main restricted universe multiverse

          
Natty(11.04)

 deb http://mirrors.aliyun.com/ubuntu/ natty main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ natty-security main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ natty-updates main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ natty-proposed main restricted universe multiverse
  deb http://mirrors.aliyun.com/ubuntu/ natty-backports main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ natty main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ natty-security main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ natty-updates main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ natty-proposed main restricted universe multiverse
  deb-src http://mirrors.aliyun.com/ubuntu/ natty-backports main restricted universe multiverse

3# 保存退出后,执行apt-get update 命令来检测是否能够正常更新软件包。

 $ sudo apt-get update

            

Linux: 如何设置HTTP网络代理(Proxy)

在某些特定网络里,系统如果需要通过http的方式访问外部网络,可能需要设置http代理才能正常访问,比如需要通过wget命令去下载一个外部的安装包文件,那么本文将会讲述如何在linux系统下设置http 代理

下面的方法针对所有的类unix系统有效(centOS, Ubuntu,Fedora,Oracle linux,Debian,Suse…)

1#通过vi编辑器打开当前用户目录下的 .bashrc 文件

2# 在文件末尾加入下面的行:
export http_proxy=http://proxyusr:passwd@proxyurl:proxyport  

3# 保存退出当前文件,关闭当前的终端,重新打开终端,是更改的配置文件生效。

4# 验证配置是否成功,通过wget 下载文件

ubuntutest@ubuntutest:~$ sudo wget http://mirrors.163.com/kernel/tools/crosstool/files/bin/x86_64/4.5.1/sha256sums.asc