竹磬网-邵珠庆の日记 生命只有一次,你可以用它来做些更多伟大的事情–Make the world a little better and easier


811月/180

完全指南:在 Linux 中如何打印和管理打印机

发布在 邵珠庆

Linux 中的打印

虽然现在大量的沟通都是电子化和无纸化的,但是在我们的公司中还有大量的材料需要打印。银行结算单、公用事业帐单、财务和其它报告、以及收益结算单等一些东西还是需要打印的。本教程将介绍在 Linux 中如何使用 CUPS 去打印。

CUPS,是通用 Unix 打印系统Common UNIX Printing System的首字母缩写,它是 Linux 中的打印机和打印任务的管理者。早期计算机上的打印机一般是在特定的字符集和字体大小下打印文本文件行。现在的图形打印机可以打印各种字体和大小的文本和图形。尽管如此,现在你所使用的一些命令,在古老的行式打印守护进程(LPD)技术的历史中仍能找到它们。

本教程将帮你了解 Linux 服务器专业考试(LPIC-1)的第 108 号主题的 108.4 目标。这个目标的权重为 2。

前提条件

为了更好地学习本系列教程,你需要具备基本的 Linux 知识,和使用 Linux 系统实践本教程中的命令的能力,你应该熟悉 GNU 和 UNIX® 命令的使用。有时不同版本的程序输出可能会不同,因此,你的结果可能与本教程中的示例有所不同。

本教程中的示例使用的是 Fedora 27 的系统。

有关打印的一些历史

这一小部分历史并不是 LPI 目标的,但它有助于你理解这个目标的相关环境。

早期的计算机大都使用行式打印机。这些都是击打式打印机,那时,它们使用固定间距的字符和单一的字体来打印文本行。为提升整个系统性能,早期的主机要与慢速的外围设备(如读卡器、卡片穿孔机、和运行其它工作的行式打印机)交叉进行工作。因此就产生了在线的或者假脱机的同步外围操作,这一术语目前在谈到计算机打印时仍然在使用。

在 UNIX 和 Linux 系统上,打印初始化使用的是 BSD(伯克利软件分发版Berkeley Software Distribution)打印子系统,它是由一个作为服务器运行的行式打印守护程序(LPD)组成,而客户端命令如 lpr 是用于提交打印作业。这个协议后来被 IETF 标准化为 RFC 1179 —— 行式打印机守护进程协议

System V 也有一个打印守护程序。它的功能与BSD 的 LPD 守护程序类似,但是它们的命令集不一样。你在后面会经常看到完成相同的任务使用不同选项的两个命令。例如,对于打印文件的命令,伯克利实现版本是 lpr,而 System V 实现版本是 lp

随着打印机技术的进步,在一个页面上混合出现不同字体成为可能,并且可以将图片像文字一样打印。可变间距字体,以及更多先进的打印技术,比如间距和连字符,现在都已经标准化。出现了几种对基本的 lpd/lpr 方法等改进设计,比如 LPRng,下一代的 LPR,以及 CUPS。

许多可以打印图形的打印机,使用 Adobe PostScript 语言进行初始化。一个 PostScript 打印机有一个解释器引擎,它可以解释打印任务中的命令并从这些命令中生成最终的页面。PostScript 经常被用做原始文件(比如一个文本文件或者一个图像文件)和最终格式没有适合的 PostScript 功能的特定打印机之间的中间层。转换这些特定的打印任务,比如将一个 ASCII 文本文件或者一个 JPEG 图像转换为 PostScript,然后再使用过滤器转换 PostScript 到非 PostScript 打印机所需要的最终光栅格式。

现在的便携式文档格式Portable Document Format(PDF),它就是基于 PostScript 的,已经替换了传统的原始 PostScript。PDF 设计为与硬件和软件无关,它封装了要打印的页面的完整描述。你可以查看 以及打印 PDF 文件。

管理打印队列

用户直接打印作业到一个名为打印队列print queue的逻辑实体。在单用户系统中,打印队列和打印机通常是几乎相同的意思。但是,CUPS 允许系统不用连接到一个打印机上,而最终在一个远程系统上的排队打印作业,并且通过使用分类,允许将定向到一个分类的打印作业在该分类第一个可用的打印机上打印。

你可以检查和管理打印队列。对于 CUPS 来说,其中一些命令实现了一些新操作。另外的一些是源于 LPD 的兼容命令,不过现在的一些选项通常是最初的 LPD 打印系统选项的有限子集。

你可以使用 CUPS 的 lpstat 命令去检查队列,以了解打印系统。一些常见选项如下表 1。

< 如显示不全,请左右滑动 >
选项 作用
-a 显示打印机状态
-c 显示打印分类
-p 显示打印状态:enabled 或者 disabled
-s 显示默认打印机、打印机和类。相当于 -d -c -v注意:要指定多个选项,这些选项必须像值一样分隔开。
-v 显示打印机和它们的设备。

表 1. lpstat 命令的选项

你也可以使用 LPD 的 lpc 命令(它可以在 /usr/sbin 中找到)使用它的 status 选项。如果你不想指定打印机名字,将列出所有的队列。列表 1 展示了命令的一些示例。

  1. [ian@atticf27 ~]$ lpstat -d
  2. system default destination: HL-2280DW
  3. [ian@atticf27 ~]$ lpstat -v HL-2280DW
  4. device for HL-2280DW: dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
  5. [ian@atticf27 ~]$ lpstat -s
  6. system default destination: HL-2280DW
  7. members of class anyprint:
  8. HL-2280DW
  9. XP-610
  10. device for anyprint: ///dev/null
  11. device for HL-2280DW: dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
  12. device for XP-610: dnssd://EPSON%20XP-610%20Series._ipp._tcp.local/?uuid=cfe92100-67c4-11d4-a45f-ac18266c48aa
  13. [ian@atticf27 ~]$ lpstat -a XP-610
  14. XP-610 accepting requests since Thu 27 Apr 2017 05:53:59 PM EDT
  15. [ian@atticf27 ~]$ /usr/sbin/lpc status HL-2280DW
  16. HL-2280DW:
  17. printer is on device \'dnssd\' speed -1
  18. queuing is disabled
  19. printing is enabled
  20. no entries
  21. daemon present

列表 1. 显示可用打印队列

这个示例展示了两台打印机 —— HL-2280DW 和 XP-610,和一个分类 anyprint,它允许打印作业定向到这两台打印机中的第一个可用打印机。

在这个示例中,已经禁用了打印到 HL-2280DW 队列,但是打印功能是启用的,这样便于将打印机脱机维护之前可以完成打印队列中的任务。启用还是禁用队列,可以使用 cupsaccept 和 cupsreject 命令来管理。以前它们叫做 accept 和 reject,你或许可能在 /usr/sbin 中找到这些命令,但它们现在都是符号链接到新的命令上了。同样,启用还是禁用打印,你可以使用 cupsenable 和 cupsdisable 命令来管理。在早期版本的 CUPS 中,这些被称为 enable 和 disable,它也许会与 bash shell 内置的 enable 混淆。列表 2 展示了如何去启用打印机 HL-2280DW 上的队列,而禁止它的打印。CUPS 的几个命令支持使用 -r 选项去提供一个该操作的理由。这个理由会在你使用 lpstat 时显示,但是如果你使用的是 lpc 命令则不会显示它。

  1. [ian@atticf27 ~]$ lpstat -a -p HL-2280DW
  2. anyprint accepting requests since Mon 29 Jan 2018 01:17:09 PM EST
  3. HL-2280DW not accepting requests since Thu 27 Apr 2017 05:52:27 PM EDT -
  4. Maintenance scheduled
  5. XP-610 accepting requests since Thu 27 Apr 2017 05:53:59 PM EDT
  6. printer HL-2280DW is idle. enabled since Thu 27 Apr 2017 05:52:27 PM EDT
  7. Maintenance scheduled
  8. [ian@atticf27 ~]$ accept HL-2280DW
  9. [ian@atticf27 ~]$ cupsdisable -r "waiting for toner delivery" HL-2280DW
  10. [ian@atticf27 ~]$ lpstat -p -a
  11. printer anyprint is idle. enabled since Mon 29 Jan 2018 01:17:09 PM EST
  12. printer HL-2280DW disabled since Mon 29 Jan 2018 04:03:50 PM EST -
  13. waiting for toner delivery
  14. printer XP-610 is idle. enabled since Thu 27 Apr 2017 05:53:59 PM EDT
  15. anyprint accepting requests since Mon 29 Jan 2018 01:17:09 PM EST
  16. HL-2280DW accepting requests since Mon 29 Jan 2018 04:03:50 PM EST
  17. XP-610 accepting requests since Thu 27 Apr 2017 05:53:59 PM EDT

列表 2. 启用队列和禁用打印

注意:用户执行这些任务必须经过授权。它可能要求是 root 用户或者其它的授权用户。在 /etc/cups/cups-files.conf 中可以看到 SystemGroup 的条目,cups-files.conf 的 man 页面有更多授权用户组的信息。

管理用户打印作业

现在,你已经知道了一些如何去检查打印队列和类的方法,我将给你展示如何管理打印队列上的作业。你要做的第一件事是,如何找到一个特定打印机或者全部打印机上排队的任意作业。完成上述工作要使用 lpq 命令。如果没有指定任何选项,lpq 将显示默认打印机上的队列。使用 -P 选项和一个打印机名字将指定打印机,或者使用 -a 选项去指定所有的打印机,如下面的列表 3 所示。

  1. [pat@atticf27 ~]$ # As user pat (non-administrator)
  2. [pat@atticf27 ~]$ lpq
  3. HL-2280DW is not ready
  4. Rank Owner Job File(s) Total Size
  5. 1st unknown 4 unknown 6144 bytes
  6. 2nd pat 6 bitlib.h 6144 bytes
  7. 3rd pat 7 bitlib.C 6144 bytes
  8. 4th unknown 8 unknown 1024 bytes
  9. 5th unknown 9 unknown 1024 bytes
  10. [ian@atticf27 ~]$ # As user ian (administrator)
  11. [ian@atticf27 ~]$ lpq -P xp-610
  12. xp-610 is ready
  13. no entries
  14. [ian@atticf27 ~]$ lpq -a
  15. Rank Owner Job File(s) Total Size
  16. 1st ian 4 permutation.C 6144 bytes
  17. 2nd pat 6 bitlib.h 6144 bytes
  18. 3rd pat 7 bitlib.C 6144 bytes
  19. 4th ian 8 .bashrc 1024 bytes
  20. 5th ian 9 .bashrc 1024 bytes

列表 3. 使用 lpq 检查打印队列

在这个示例中,共有五个作业,它们是 4、6、7、8、和 9,并且它是名为 HL-2280DW 的打印机的队列,而不是 XP-610 的。在这个示例中使用 -P 选项,可简单地显示哪个打印机已经准备好,但是没有队列任务。注意,CUPS 的打印机命名,是大小写不敏感的。还要注意的是,用户 ian 提交了同样的作业两次,当一个作业没有第一时间打印时,经常能看到用户的这种动作。

一般情况下,你可能会查看或者维护你自己的打印作业,但是,root 用户或者其它授权的用户通常会去管理其它打印作业。大多数 CUPS 命令都可以使用一个 -E 选项,对 CUPS 服务器与客户端之间的通讯进行加密。

使用 lprm 命令从队列中去删除一个 .bashrc 作业。如果不使用选项,将删除当前的作业。使用 - 选项,将删除全部的作业。要么就如列表 4 那样,指定一个要删除的作业列表。

  1. [[pat@atticf27 ~]$ # As user pat (non-administrator)
  2. [pat@atticf27 ~]$ lprm
  3. lprm: Forbidden
  4. [ian@atticf27 ~]$ # As user ian (administrator)
  5. [ian@atticf27 ~]$ lprm 8
  6. [ian@atticf27 ~]$ lpq
  7. HL-2280DW is not ready
  8. Rank Owner Job File(s) Total Size
  9. 1st ian 4 permutation.C 6144 bytes
  10. 2nd pat 6 bitlib.h 6144 bytes
  11. 3rd pat 7 bitlib.C 6144 bytes
  12. 4th ian 9 .bashrc 1024 bytes

列表 4. 使用 lprm 删除打印作业

注意,用户 pat 不能删除队列中的第一个作业,因为它是用户 ian 的。但是,ian 可以删除他自己的 8 号作业。

另外的可以帮你操作打印队列中的作业的命令是 lp。使用它可以去修改作业属性,比如打印数量或者优先级。我们假设用户 ian 希望他的作业 9 在用户 pat 的作业之前打印,并且希望打印两份。作业优先级的默认值是 50,它的优先级范围从最低的 1 到最高的 100 之间。用户 ian 可以使用 -i-n、以及 -q 选项去指定一个要修改的作业,而新的打印数量和优先级可以如下面的列表 5 所示的那样去修改。注意,使用 -l 选项的 lpq 命令可以提供更详细的输出。

  1. [ian@atticf27 ~]$ lpq
  2. HL-2280DW is not ready
  3. Rank Owner Job File(s) Total Size
  4. 1st ian 4 permutation.C 6144 bytes
  5. 2nd pat 6 bitlib.h 6144 bytes
  6. 3rd pat 7 bitlib.C 6144 bytes
  7. 4th ian 9 .bashrc 1024 bytes
  8. [ian@atticf27 ~]$ lp -i 9 -q 60 -n 2
  9. [ian@atticf27 ~]$ lpq
  10. HL-2280DW is not ready
  11. Rank Owner Job File(s) Total Size
  12. 1st ian 9 .bashrc 1024 bytes
  13. 2nd ian 4 permutation.C 6144 bytes
  14. 3rd pat 6 bitlib.h 6144 bytes
  15. 4th pat 7 bitlib.C 6144 bytes

列表 5. 使用 lp 去改变打印数量和优先级

最后,lpmove 命令可以允许一个作业从一个队列移动到另一个队列。例如,我们可能因为打印机 HL-2280DW 现在不能使用,而想去移动一个作业到另外的队列上。你可以指定一个作业编号,比如 9,或者你可以用一个队列名加一个连字符去限定它,比如,HL-2280DW-0。lpmove 命令的操作要求是授权用户。列表 6 展示了如何去从一个队列移动作业到另外的队列,先是指定打印机和作业 ID 移动,然后是移动指定打印机的所有作业。稍后我们可以去再次检查队列,其中一个作业已经在打印中了。

  1. [ian@atticf27 ~]$ lpmove HL-2280DW-9 anyprint
  2. [ian@atticf27 ~]$ lpmove HL-2280DW xp-610
  3. [ian@atticf27 ~]$ lpq -a
  4. Rank Owner Job File(s) Total Size
  5. active ian 9 .bashrc 1024 bytes
  6. 1st ian 4 permutation.C 6144 bytes
  7. 2nd pat 6 bitlib.h 6144 bytes
  8. 3rd pat 7 bitlib.C 6144 bytes
  9. [ian@atticf27 ~]$ # A few minutes later
  10. [ian@atticf27 ~]$ lpq -a
  11. Rank Owner Job File(s) Total Size
  12. active pat 6 bitlib.h 6144 bytes
  13. 1st pat 7 bitlib.C 6144 bytes

列表 6. 使用 lpmove 移动作业到另外一个打印队列

如果你使用的是 CUPS 之外的打印服务器,比如 LPD 或者 LPRng,大多数的队列管理功能是由 lpc 命令的子命令来处理的。例如,你可以使用 lpc topq 去移动一个作业到队列的顶端。其它的 lpc 子命令包括 disabledownenableholdmoveredirectrelease、和 start。这些子命令在 CUPS 的兼容命令中没有实现。

打印文件

如何去打印创建的作业?大多数图形界面程序都提供了一个打印方法,通常是 文件 菜单下面的选项。这些程序为选择打印机、设置页边距、彩色或者黑白打印、打印数量、选择每张纸打印的页面数(每张纸打印两个页面,通常用于讲义)等等,都提供了图形化的工具。现在,我将为你展示如何使用命令行工具去管理这些功能,然后和图形化实现进行比较。

打印文件最简单的方法是使用 lpr 命令,然后提供一个文件名字。这将在默认打印机上打印这个文件。而 lp 命令不仅可以打印文件,也可以修改打印作业。列表 7 展示了使用这个命令的一个简单示例。注意,lpr 会静默处理这个作业,但是 lp 会显示处理后的作业的 ID。

  1. [ian@atticf27 ~]$ echo "Print this text" > printexample.txt
  2. [ian@atticf27 ~]$ lpr printexample.txt
  3. [ian@atticf27 ~]$ lp printexample.txt
  4. request id is HL-2280DW-12 (1 file(s))

列表 7. 使用 lpr 和 lp 打印

表 2 展示了 lpr 上你可以使用的一些选项。注意, lp 的选项和 lpr 的很类似,但是名字可能不一样;例如,-# 在 lpr 上是相当于 lp 的 -n 选项。查看 man 页面了解更多的信息。

< 如显示不全,请左右滑动 >
选项 作用
-C, -J 或 -T 设置一个作业名字。
-P 选择一个指定的打印机。
-# 指定打印数量。注意这不同于 lp 命令的 -n 选项。
-m 在作业完成时发送电子邮件。
-l 表示打印文件已经为打印做好格式准备。相当于 -o raw
-o 设置一个作业选项。
-p 格式化一个带有阴影标题的文本文件。相关于 -o prettyprint
-q 暂缓(或排队)后面的打印作业。
-r 在文件进入打印池之后,删除文件。

表 2. lpr 的选项

列表 8 展示了一些选项。我要求打印之后给我发确认电子邮件,那个作业被暂缓执行,并且在打印之后删除文件。

  1. [ian@atticf27 ~]$ lpr -P HL-2280DW -J "Ian\'s text file" -#2 -m -p -q -r printexample.txt
  2. [[ian@atticf27 ~]$ lpq -l
  3. HL-2280DW is ready
  4. ian: 1st [job 13 localhost]
  5. 2 copies of Ian\'s text file 1024 bytes
  6. [ian@atticf27 ~]$ ls printexample.txt
  7. ls: cannot access \'printexample.txt\': No such file or directory

列表 8. 使用 lpr 打印

我现在有一个在 HL-2280DW 打印队列上暂缓执行的作业。然后怎么做?lp 命令可以通过使用 -H 的各种选项来暂缓或者投放作业。列表 9 展示了如何投放被暂缓的作业。查看 lp 命令的 man 页面了解其它选项的信息。

  1. [ian@atticf27 ~]$ lp -i 13 -H resume

列表 9. 重启一个暂缓的打印作业

并不是所有的可用打印机都支持相同的选项集。使用 lpoptions 命令去查看一个打印机的常用选项。添加 -l 选项去显示打印机专用的选项。列表 10 展示了两个示例。许多常见的选项涉及到人像/风景打印、页面大小和输出在纸张上的布局。详细信息查看 man 页面。

  1. [ian@atticf27 ~]$ lpoptions -p HL-2280DW
  2. copies=1 device-uri=dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
  3. finishings=3 job-cancel-after=10800 job-hold-until=no-hold job-priority=50
  4. job-sheets=none,none marker-change-time=1517325288 marker-colors=#000000,#000000
  5. marker-levels=-1,92 marker-names=\'Black\ Toner\ Cartridge,Drum\ Unit\'
  6. marker-types=toner,opc number-up=1 printer-commands=none
  7. printer-info=\'Brother HL-2280DW\' printer-is-accepting-jobs=true
  8. printer-is-shared=true printer-is-temporary=false printer-location
  9. printer-make-and-model=\'Brother HL-2250DN - CUPS Gutenprint v5.2.13 Simplified\'
  10. printer-state=3 printer-state-change-time=1517325288 printer-state-reasons=none
  11. printer-type=135188 printer-uri-supported=ipp://localhost/printers/HL-2280DW
  12. sides=one-sided
  13. [ian@atticf27 ~]$ lpoptions -l -p xp-610
  14. PageSize/Media Size: *Letter Legal Executive Statement A4
  15. ColorModel/Color Model: *Gray Black
  16. InputSlot/Media Source: *Standard ManualAdj Manual MultiPurposeAdj MultiPurpose
  17. UpperAdj Upper LowerAdj Lower LargeCapacityAdj LargeCapacity
  18. StpQuality/Print Quality: None Draft *Standard High
  19. Resolution/Resolution: *301x300dpi 150dpi 300dpi 600dpi
  20. Duplex/2-Sided Printing: *None DuplexNoTumble DuplexTumble
  21. StpiShrinkOutput/Shrink Page If Necessary to Fit Borders: *Shrink Crop Expand
  22. StpColorCorrection/Color Correction: *None Accurate Bright Hue Uncorrected
  23. Desaturated Threshold Density Raw Predithered
  24. StpBrightness/Brightness: 0 100 200 300 400 500 600 700 800 900 *None 1100
  25. 1200 1300 1400 1500 1600 1700 1800 1900 2000 Custom.REAL
  26. StpContrast/Contrast: 0 100 200 300 400 500 600 700 800 900 *None 1100 1200
  27. 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600 2700
  28. 2800 2900 3000 3100 3200 3300 3400 3500 3600 3700 3800 3900 4000 Custom.REAL
  29. StpImageType/Image Type: None Text Graphics *TextGraphics Photo LineArt

列表 10. 检查打印机选项

大多数的 GUI 应用程序有一个打印对话框,通常你可以使用 文件 >打印 菜单去选择它。图 1 展示了在 GIMP 中的一个示例,GIMP 是一个图像处理程序。

自动草稿

图 1. 在 GIMP 中打印

到目前为止,我们所有的命令都是隐式指向到本地的 CUPS 打印服务器上。你也可以通过指定 -h 选项和一个端口号(如果不是 CUPS 的默认端口号 631 的话)将打印转向到另外一个系统上的服务器。

CUPS 和 CUPS 服务器

CUPS 打印系统的核心是 cupsd 打印服务器,它是一个运行的守护进程。CUPS 配置文件一般位于 /etc/cups/cupsd.conf/etc/cups 目录也有与 CUPS 相关的其它的配置文件。CUPS 一般在系统初始化期间启动,根据你的发行版不同,它也可能通过位于 /etc/rc.d/init.d 或者 /etc/init.d 目录中的 CUPS 脚本来控制。对于 最新使用 systemd 来初始化的系统,CUPS 服务脚本可能在 /usr/lib/systemd/system/cups.service 中。和大多数使用脚本的服务一样,你可以停止、启动、或者重启守护程序。查看我们的教程:学习 Linux,101:运行级别、引导目标、关闭、和重启动,了解使用初始化脚本的更多信息。

配置文件 /etc/cups/cupsd.conf 包含一些管理参数,比如访问打印系统、是否允许远程打印、本地打印池文件等等。在一些系统上,第二部分单独描述了打印队列,它一般是由配置工具自动生成的。列表 11 展示了一个默认的 cupsd.conf 文件中的一些条目。注意,注释是以 # 字符开头的。默认值通常以注释的方式显示,并且可以通过删除前面的 # 字符去改变默认值。

  1. # Only listen for connections from the local machine.
  2. Listen localhost:631
  3. Listen /var/run/cups/cups.sock
  4. # Show shared printers on the local network.
  5. Browsing On
  6. BrowseLocalProtocols dnssd
  7. # Default authentication type, when authentication is required...
  8. DefaultAuthType Basic
  9. # Web interface setting...
  10. WebInterface Yes
  11. # Set the default printer/job policies...
  12. <Policy default>
  13. # Job/subscription privacy...
  14. JobPrivateAccess default
  15. JobPrivateValues default
  16. SubscriptionPrivateAccess default
  17. SubscriptionPrivateValues default
  18. # Job-related operations must be done by the owner or an administrator...
  19. <Limit Create-Job Print-Job Print-URI Validate-Job>
  20. Order deny,allow
  21. Limit>

列表 11. 默认的 /etc/cups/cupsd.conf 文件的部分内容

可以用在 cupsd.conf 中使用的文件、目录、和用户配置命令,现在都存储在作为替代的 cups-files.conf 中。这是为了防范某些类型的提权攻击。列表 12 展示了 cups-files.conf 文件中的一些条目。注意,正如在文件层次结构标准(FHS)中所期望的那样,打印池文件默认保存在文件系统的 /var/spool 目录中。查看 man 页面了解 cupsd.conf 和 cups-files.conf 配置文件的更多信息。

  1. # Location of the file listing all of the local printers...
  2. #Printcap /etc/printcap
  3. # Format of the Printcap file...
  4. #PrintcapFormat bsd
  5. #PrintcapFormat plist
  6. #PrintcapFormat solaris
  7. # Location of all spool files...
  8. #RequestRoot /var/spool/cups
  9. # Location of helper programs...
  10. #ServerBin /usr/lib/cups
  11. # SSL/TLS keychain for the scheduler...
  12. #ServerKeychain ssl
  13. # Location of other configuration files...
  14. #ServerRoot /etc/cups

列表 12. 默认的 /etc/cups/cups-files.conf 配置文件的部分内容

列表 12 提及了 /etc/printcap 文件。这是 LPD 打印服务器的配置文件的名字,并且一些应用程序仍然使用它去确定可用的打印机和它们的属性。它通常是在 CUPS 系统上自动生成的,因此,你可能没有必要去修改它。但是,如果你在诊断用户打印问题,你可能需要去检查它。列表 13 展示了一个示例。

  1. # This file was automatically generated by cupsd(8) from the
  2. # /etc/cups/printers.conf file. All changes to this file
  3. # will be lost.
  4. HL-2280DW|Brother HL-2280DW:rm=atticf27:rp=HL-2280DW:
  5. anyprint|Any available printer:rm=atticf27:rp=anyprint:
  6. XP-610|EPSON XP-610 Series:rm=atticf27:rp=XP-610:

列表 13. 自动生成的 /etc/printcap

这个文件中的每一行都有一个打印机名字、打印机描述,远程机器(rm)的名字、以及那个远程机器上的远程打印机(rp)。老的 /etc/printcap 文件也描述了打印机的能力。

文件转换过滤器

你可以使用 CUPS 打印许多类型的文件,包括明文的文本文件、PDF、PostScript、和各种格式的图像文件,你只需要提供要打印的文件名,除此之外你再无需向 lpr 或 lp 命令提供更多的信息。这个神奇的壮举是通过使用过滤器来实现的。实际上,这些年来最流行的过滤器就就叫做 magicfilter(神奇的过滤器)。

当打印一个文件时,CUPS 使用多用途因特网邮件扩展(MIME)类型去决定合适的转换过滤器。其它的打印数据包可能使用由 file 命令使用的神奇数字机制。关于 file 或者神奇数的更多信息可以查看它们的 man 页面。

输入文件被过滤器转换成中间层的光栅格式或者 PostScript 格式。一些作业信息,比如打印数量也会被添加进去。数据最终通过一个后端发送到目标打印机。还有一些可以用手动过滤的输入文件的过滤器(如 a2ps 或 dvips)。你可以通过这些过滤器获得特殊格式的结果,或者去处理一些 CUPS 原生并不支持的文件格式。

添加打印机

CUPS 支持多种打印机,包括:

  • 本地连接的并行口和 USB 口打印机
  • 因特网打印协议(IPP)打印机
  • 远程 LPD 打印机
  • 使用 SAMBA 的 Microsoft® Windows® 打印机
  • 使用 NCP 的 Novell 打印机
  • HP Jetdirect 打印机

当系统启动或者设备连接时,现在的大多数系统都会尝试自动检测和自动配置本地硬件。同样,许多网络打印机也可以被自动检测到。使用 CUPS 的 web 管理工具(http://localhost:631 或者 http://127.0.0.1:631)去搜索或添加打印机。许多发行版都包含它们自己的配置工具,比如,在 SUSE 系统上的 YaST。图 2 展示了使用 localhost:631 的 CUPS 界面,图 3 展示了 Fedora 27 上的 GNOME 打印机设置对话框。

自动草稿

图 2. 使用 CUPS 的 web 界面

自动草稿

图 3. Fedora 27 上的打印机设置

你也可以从命令行配置打印机。在配置打印机之前,你需要一些关于打印机和它的连接方式的基本信息。如果是一个远程系统,你还需要一个用户 ID 和密码。

你需要去知道你的打印机使用什么样的驱动程序。不是所有的打印机都支持 Linux,有些打印机在 Linux 上压根就不能使用,或者功能受限。你可以去 OpenPrinting.org 去查看是否有你的特定的打印机的驱动程序。lpinfo 命令也可以帮你识别有效的设备类型和驱动程序。使用 -v 选项去列出支持的设备,使用 -m 选项去列出驱动程序,如列表 14 所示。

  1. [ian@atticf27 ~]$ lpinfo -m | grep -i xp-610
  2. lsb/usr/Epson/epson-inkjet-printer-escpr/Epson-XP-610_Series-epson-escpr-en.ppd.gz
  3. EPSON XP-610 Series, Epson Inkjet Printer Driver (ESC/P-R) for Linux
  4. [ian@atticf27 ~]$ locate "Epson-XP-610_Series-epson-escpr-en.ppd.gz"
  5. /usr/share/ppd/Epson/epson-inkjet-printer-escpr/Epson-XP-610_Series-epson-escpr-en.ppd.gz
  6. [ian@atticf27 ~]$ lpinfo -v
  7. network socket
  8. network ipps
  9. network lpd
  10. network beh
  11. network ipp
  12. network http
  13. network https
  14. direct hp
  15. serial serial:/dev/ttyS0?baud=115200
  16. direct parallel:/dev/lp0
  17. network smb
  18. direct hpfax
  19. network dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/
  20. network dnssd://EPSON%20XP-610%20Series._ipp._tcp.local/?uuid=cfe92100-67c4-11d4-a45f-ac18266c48aa
  21. network lpd://BRN001BA98A1891/BINARY_P1
  22. network lpd://192.168.1.38:515/PASSTHRU

列表 14. 可用的打印机驱动程序

这个 Epson-XP-610_Series-epson-escpr-en.ppd.gz 驱动程序在我的系统上位于 /usr/share/ppd/Epson/epson-inkjet-printer-escpr/ 目录中。

如果你找不到驱动程序,你可以到打印机生产商的网站看看,说不定会有专用的驱动程序。例如,在写这篇文章的时候,Brother 就有一个我的 HL-2280DW 打印机的驱动程序,但是,这个驱动程序在 OpenPrinting.org 上还没有列出来。

如果你收集齐了基本信息,你可以如列表 15 所示的那样,使用 lpadmin 命令去配置打印机。为此,我将为我的 HL-2280DW 打印机创建另外一个实例,以便于双面打印。

  1. [ian@atticf27 ~]$ lpinfo -m | grep -i "hl.*2280"
  2. HL2280DW.ppd Brother HL2280DW for CUPS
  3. lsb/usr/HL2280DW.ppd Brother HL2280DW for CUPS
  4. [ian@atticf27 ~]$ lpadmin -p HL-2280DW-duplex -E -m HL2280DW.ppd \
  5. > -v dnssd://Brother%20HL-2280DW._pdl-datastream._tcp.local/ \
  6. > -D "Brother 1" -o sides=two-sided-long-edge
  7. [ian@atticf27 ~]$ lpstat -a
  8. anyprint accepting requests since Mon 29 Jan 2018 01:17:09 PM EST
  9. HL-2280DW accepting requests since Tue 30 Jan 2018 10:56:10 AM EST
  10. HL-2280DW-duplex accepting requests since Wed 31 Jan 2018 11:41:16 AM EST
  11. HXP-610 accepting requests since Mon 29 Jan 2018 10:34:49 PM EST

列表 15. 配置一台打印机

你可以使用带 -c 选项的 lpadmin 命令去创建一个仅用于双面打印的新分类,而不用为了双面打印去创建一个打印机的副本。

如果你需要删除一台打印机,使用带 -x 选项的 lpadmin 命令。

列表 16 展示了如何去删除打印机和创建一个替代类。

  1. [ian@atticf27 ~]$ lpadmin -x HL-2280DW-duplex
  2. [ian@atticf27 ~]$ lpadmin -p HL-2280DW -c duplex -E -D "Duplex printing" -o sides=two-sided-long-edge
  3. [ian@atticf27 ~]$ cupsenable duplex
  4. [ian@atticf27 ~]$ cupsaccept duplex
  5. [ian@atticf27 ~]$ lpstat -a
  6. anyprint accepting requests since Mon 29 Jan 2018 01:17:09 PM EST
  7. duplex accepting requests since Wed 31 Jan 2018 12:12:05 PM EST
  8. HL-2280DW accepting requests since Wed 31 Jan 2018 11:51:16 AM EST
  9. XP-610 accepting requests since Mon 29 Jan 2018 10:34:49 PM EST

列表 16. 删除一个打印机和创建一个类

你也可以使用 lpadmin 或者 lpoptions 命令去设置各种打印机选项。详细信息请查看 man 页面。

排错

如果你有打印问题,尝试下列的提示:

  • 确保 CUPS 服务器正在运行。你可以使用 lpstat 命令,如果它不能连接到 cupsd 守护程序,它将会报告一个错误。或者,你可以使用 ps -ef 命令在输出中去检查是否有 cupsd。
  • 如果你试着排队一个打印作业而得到一个错误信息,指示打印机不接受这个作业,你可以使用 lpstat -a 或者 lpc status 去检查那个打印机是否接受作业。
  • 如果一个队列中的作业没有打印,使用 lpstat -p 或 lpc status 去检查那个打印机是否接受作业。如前面所讨论的那样,你可能需要将这个作业移动到其它的打印机。
  • 如果这个打印机是远程的,检查它在远程系统上是否存在,并且是可操作的。
  • 检查配置文件,确保特定的用户或者远程系统允许在这个打印机上打印。
  • 确保防火墙允许远程打印请求,是否允许从其它系统到你的系统,或者从你的系统到其它系统的数据包通讯。
  • 验证是否有正确的驱动程序。

正如你所见,打印涉及到你的系统中的几个组件,甚至还有网络。在本教程中,基于篇幅的考虑,我们仅能给你的诊断提供了几个着手点。大多数的 CUPS 系统也有实现我们所讨论的命令行功能的图形界面。一般情况下,这个界面是从本地主机使用浏览器指向 631 端口(http://localhost:631 或 http://127.0.0.1:631)来访问的,如前面的图 2 所示。

你可以通过将 CUPS 运行在前台而不是做为一个守护进程来诊断它的问题。如果有需要,你也可以通过这种方式去测试替代的配置文件。运行 cupsd -h 获得更多信息,或者查看 man 页面。

CUPS 也带有一个访问日志和错误日志。你可以在 cupsd.conf 中使用 LogLevel 语句来改变日志级别。默认情况下,日志是保存在 /var/log/cups 目录。它们可以在浏览器界面(http://localhost:631)下,从 Administration 选项卡中查看。使用不带任何选项的 cupsctl 命令可以显示日志选项。也可以编辑 cupsd.conf 或者使用 cupsctl 去调整各种日志参数。查看 cupsctl 命令的 man 页面了解更多信息。

在 Ubuntu 的 Wiki 页面上的 调试打印问题 页面也是一个非常好的学习的地方。

这就是关于打印和 CUPS 的介绍。

175月/180

Linux查看系统配置常用命令

发布在 邵珠庆

一、linux CPU大小
cat /proc/cpuinfo |grep "model name" && cat /proc/cpuinfo |grep "physical id"
说明:Linux下可以在/proc/cpuinfo中看到每个cpu的详细信息。但是对于双核的cpu,在cpuinfo中会看到两个cpu。常常会让人误以为是两个单核的cpu。
其实应该通过Physical Processor ID来区分单核和双核。而Physical Processor ID可以从cpuinfo或者dmesg中找到. flags 如果有 ht 说明支持超线程技术 判断物理CPU的个数可以查看physical id 的值,相同则为
二、内存大小 cat /proc/meminfo |grep MemTotal
三、硬盘大小 fdisk -l |grep Disk
四、uname -a # 查看内核/操作系统/CPU信息的linux系统信息命令
五、head -n 1 /etc/issue # 查看操作系统版本,是数字1不是字母L
六、cat /proc/cpuinfo # 查看CPU信息的linux系统信息命令
七、hostname # 查看计算机名的linux系统信息命令
八、lspci -tv # 列出所有PCI设备
九、lsusb -tv # 列出所有USB设备的linux系统信息命令
十、lsmod # 列出加载的内核模块
十一、env # 查看环境变量资源
十二、free -m # 查看内存使用量和交换区使用量
十三、df -h # 查看各分区使用情况
十四、du -sh # 查看指定目录的大小
十五、grep MemTotal /proc/meminfo # 查看内存总量
十六、grep MemFree /proc/meminfo # 查看空闲内存量
十七、uptime # 查看系统运行时间、用户数、负载
十八、cat /proc/loadavg # 查看系统负载磁盘和分区
十九、mount | column -t # 查看挂接的分区状态
二十、fdisk -l # 查看所有分区
二十一、swapon -s # 查看所有交换分区
二十二、hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
二十三、dmesg | grep IDE # 查看启动时IDE设备检测状况网络
二十四、ifconfig # 查看所有网络接口的属性
二十五、iptables -L # 查看防火墙设置
二十六、route -n # 查看路由表
二十七、netstat -lntp # 查看所有监听端口
二十八、netstat -antp # 查看所有已经建立的连接
二十九、netstat -s # 查看网络统计信息进程
三十、ps -ef # 查看所有进程
三十一、top # 实时显示进程状态用户
三十二、w # 查看活动用户
三十三、id # 查看指定用户信息
三十四、last # 查看用户登录日志
三十五、cut -d: -f1 /etc/passwd # 查看系统所有用户
三十六、cut -d: -f1 /etc/group # 查看系统所有组
三十七、crontab -l # 查看当前用户的计划任务服务
三十七、chkconfig –list # 列出所有系统服务
三十八、chkconfig –list | grep on # 列出所有启动的系统服务程序
三十九、rpm -qa # 查看所有安装的软件包
四十、cat /proc/cpuinfo :查看CPU相关参数的linux系统命令
四十一、cat /proc/partitions :查看linux硬盘和分区信息的系统信息命令
四十二、cat /proc/meminfo :查看linux系统内存信息的linux系统命令
四十三、cat /proc/version :查看版本,类似uname -r
四十四、cat /proc/ioports :查看设备io端口
四十五、cat /proc/interrupts :查看中断
四十六、cat /proc/pci :查看pci设备的信息
四十七、cat /proc/swaps :查看所有swap分区的信息

1110月/170

LINUX中查看文本文件内容命令

发布在 邵珠庆

cat:从第一行開始显示所有的文本内容;
tac:从最后一行開始,显示所有分文本内容,与cat相反。
nl:显示文本时,能够输出行号。
more:按页显示文本内容;
less:与more差点儿相同,也是按页显示文本内容,差别是less能够一行一行的回退。more回退仅仅能一页一页回退。
head:从头開始显示文件指定的行数;
tail:显示文件指定的结尾的行数。但每一行的位置还是原文件里的位置,不会像tac那样与原文件相反。
vi: NB的Linux文本编辑器。

样例与说明

cat

  • cat demo.txt
    显示demo.txt文件所有内容
  • cat -b demo.txt
    显示demo.txt文件所有内容。非空的行输出行号。空行会输出。但不标记行号
  • cat -n demo.txt
    显示demo.txt文件所有内容。所有行都输出行号
    cat
    长处:简单
    缺点:当文本文件内容多于一页内容时。仅仅能显示出最后一页的内容,无法看到前面的内容。

tac

  • tac demo.txt
    从最后一行開始。倒序输出demo.txt的内容。本人不经常使用。
    tac

nl

  • nl demo.txt
    显示文件内容。顺便输出行号。默认情况下空行不记录行号
  • nl -b a demo.txt
    • b a #空行也输出行号
    • b t #默认设置
    • n ln ##行号最左方显示
    • n rn ##行号最右方显示,且不加0(然并卵,我的机器上依旧显示在左边)
    • n rz ##行号最右方显示,且加0(再次然并卵,但加了0了。例如以下图所看到的)
    • w ##设置行号字段占用的位数
      nl
      长处:貌似非常灵活的样子
      缺点:就查看下内容。输出个行号而已。搞那么复杂有卵用。。。

more

  • more demo.txt
    • 按一下空格则往下翻一页
    • 按一下Enter则往下翻一行
    • 按一下B键往上翻一页
    • 不能往上一行一行的翻回去了
    • :f 能够显示文件名称和如今的行数
    • q退出more

less

  • less demo.txt
    • more命令的所有按键less都支持
    • ↑↓箭头能够实现一行一行的上下翻
    • PageDown/PageUp能够实现一页一页的上下翻
  • head demo.txt
    默认仅仅显示文件的前10行文本内容
  • head -n 6 demo.txt
    -n 6 參数指定显示文件的前6行
  • head -n -4 demo.txt
    -n -4 负数表示除去文件结尾的4行,其它的从头開始的所有行都显示出来
    head

tail

  • tail demo.txt
    默认仅仅显示从文件最后一行開始的10行文本内容
  • tail -n 5 demo.txt
    -n 5 參数指定显示文件的最后5行
  • tail -n -5 demo.txt
    **-n -5**tail命令不支持负数。运行结果同-n 5
    tail

vi

vi命令是使用VIM文本编辑器打开文本,VIM编辑器眼下本人也是刚開始学习。仅仅记住了一些简单的命令:

  • vi demo.txt 进入Normal模式查看文本
  • i 进入Insert模式插入内容,编辑文本
  • nG n代表行号,在Normal模式输入nG则定位到第n行
  • :set number 在Normal模式输入则显示文本行号。空行也会显示行号
  • ESC 退出Insert模式至Normal模式
  • :wq 在Normal模式下保存退出。w保存;q退出;能够单独使用
95月/170

Linux环境变量区别

发布在 邵珠庆

发现自己对Linux下 /etc/profile、/etc/bashrc、~/.bashrc的区别不是特别清楚,
特此查阅了相关资料,整理下来,供以后查阅。
①/etc/profile:
该文件登录操作系统时,为每个用户设置环境信息,当用户第一次登录时,该文件被执行。也就是说这个文件对每个shell都有效,用于获取系统的环境信息。

# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

②/etc/bashrc:
为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。也就是说,当用户shell执行了bash时,运行这个文件。

# /etc/bashrc
# System wide functions and aliases
# Environment stuff goes in /etc/profile
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

③~/.bashrc
该文件存储的是专属于个人bash shell的信息,当登录时以及每次打开一个新的shell时,执行这个文件。在这个文件里可以自定义用户专属的个人信息。

那么在用户登录系统时候,相关的文件执行顺序是什么呢。
在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的
~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个,
执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。
如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。

174月/170

漫画赏析:Linux 内核到底长啥样

发布在 邵珠庆

今天,我来为大家解读一幅来自 TurnOff.us 的漫画 “InSide The Linux Kernel” 。 TurnOff.us 是一个极客漫画网站,作者Daniel Stori 画了一些非常有趣的关于编程语言、Web、云计算、Linux 相关的漫画。今天解读的便是其中的一篇。

在开始,我们先来看看这幅漫画的全貌!

Inside the Linux Kernel

这幅漫画是以一个房子的侧方刨面图来绘画的。使用这样的一个房子来代表 Linux 内核。

地基

作为一个房子,最重要的莫过于其地基,在这个图片里,我们也从最下面的地基开始看起:

Filesystem

地基(底层)由一排排的文件柜组成,井然有序,文件柜里放置着“文件”——电脑中的文件。左上角,有一只胸前挂着 421 号牌的小企鹅,它表示着 PID(进程 ID(Process ID)) 为 421 的进程,它正在查看文件柜中的文件,这代表系统中正有一个进程在访问文件系统。在右下角有一只小狗,它是看门狗(watchdog) ,这代表对文件系统的监控。

一层(地面层)

floor

看完了地基,接下来我们来看地基上面的一层,都有哪些东西。

Process Table

在这一层,最引人瞩目的莫过于中间的一块垫子,众多小企鹅在围着着桌子坐着。这个垫子的区域代表进程表。

左上角有一个小企鹅,站着,仿佛在说些什么这显然是一位家长式的人物,不过看起来周围坐的那些小企鹅不是很听话——你看有好多走神、自顾自聊天的——“喂喂,说你呢,哇塞娃(171),转过身来”。它代表着 Linux 内核中的初始化(init)进程,也就是我们常说的 PID 为 1 的进程。桌子上坐的小企鹅都在等待状态(wait)中,等待工作任务。

watchdog

瞧瞧,垫子(进程表)旁边也有一只小狗,它会监控小企鹅的状态(监控进程),当小企鹅们不听话时,它就会汪汪地叫喊起来。

httpd process

在这层的左侧,有一只号牌为 1341 的小企鹅,守在门口,门上写着 80,说明这个 PID 为 1341 的小企鹅负责接待 80 端口,也就是我们常说的 HTTP (网站)的端口。小企鹅头上有一片羽毛,这片羽毛大有来历,它是著名的 HTTP 服务器 Apache 的 Logo。喏,就是这只:

apache logo

向右看,我们可以看到这里仍有一扇门,门上写着 21,但是,看起来这扇门似乎年久失修,上面的门牌号都歪了,门口也没人守着。看起来这个 21 端口的 FTP 协议有点老旧了,目前用的人也比以前少了,以至于这里都没人接待了。

Port 21

而在最右侧的一个门牌号 22 的们的待遇就大为不同,居然有一只带着墨镜的小企鹅在守着,看起来好酷啊,它是黑衣人叔叔吗?为什么要这么酷的一个企鹅呢,因为 22 端口是 SSH 端口,是一个非常重要的远程连接端口,通常通过这个端口进行远程管理,所以对这个端口进来的人要仔细审查。

ssh daemon

它的身上写着 52,说明它是第 52 个小企鹅。

to fs

在图片的左上角,有一个向下台阶。这个台阶是底层(地基)的文件系统中的,进程们可以通过这个台阶,到文件系统中去读取文件,进行操作。

CronTab

在这一层中,有一个身上写着 217 的小企鹅,他正满头大汗地看着自己的手表。这只小企鹅就是定时任务(Crontab),他会时刻关注时间,查看是否要去做某个工作。

pipeline

在图片的中部,有两个小企鹅扛着管道(PipeLine)在行走,一只小企鹅可以把自己手上的东西通过这个管道,传递给后面的小企鹅。不过怎么看起来前面这种(男?)企鹅累得满头大汗,而后面那只(女?)企鹅似乎游刃有余——喂喂,前面那个,裤子快掉了~

Wine

在这一层还有另外的一个小企鹅,它手上拿着一杯红酒,身上写着 411,看起来有点不胜酒力。它就是红酒(Wine)小企鹅,它可以干(执行)一些来自 Windows 的任务。

跃层

在一层之上,还有一个跃层,这里有很多不同的屏幕,每个屏幕上写着 TTY(这就是对外的终端)。比如说最左边 tty4 上输入了“fre”——这是想输入“freshmeat…”么 :d ;它旁边的 tty2 和 tty3 就正常多了,看起来是比较正常的命令;tty7 显示的图形界面嗳,对,图形界面(X Window)一般就在 7 号终端;tty5 和 tty6 是空的,这表示这两个终端没人用。等等,tty1 呢?

tty

tty(终端)是对外沟通的渠道之一,但是,不是每一个进程都需要 tty,某些进程可以直接通过其他途径(比如端口)来和外部进行通信,对外提供服务的,所以,这一层不是完整的一层,只是个跃层。

好了,我们有落下什么吗?

这小丑是谁啊?

啊哈,我也不知道,或许是病毒?你说呢?

144月/170

linux下详解ftp的常用功能

发布在 邵珠庆

一、简介:

FTP(File Transfer Protocol, FTP)是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。

image 概述:

FTP是应用层的协议,它基于传输层,为用户服务,它们负责进行文件的传输。FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而不需要进一步处理,就像MIME或Unencode一样。但是,FTP有着极高的延时,这意味着,从开始请求到第一次接收需求数据之间的时间会非常长,并且不时的必需执行一些冗长的登陆进程。

image

FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流,并且是命令通向ftp服务器的进口。当数据通过数据流传输时,控制流处于空闲状态。而当控制流空闲很长时间后,客户端的防火墙会将其会话置为超时,这样当大量数据通过防火墙时,会产生一些问题。此时,虽然文件可以成功的传输,但因为控制会话会被防火墙断开,传输会产生一些错误。

主动和被动模式

FTP有两种使用模式:主动和被动。主动模式要求客户端服务器端同时打开并且监听一个端口以建立连接。在这种情况下,客户端由于安装了防火墙会产生一些问题。所以,创立了被动模式。被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。

一个主动模式的FTP连接建立要遵循以下步骤:

1.客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,源端口为随机端口x,在客户端,远程端口为21,在服务器。

2.客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器的21号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口。

3.服务器打开20号源端口并且建立和客户端数据端口的连接。此时,源端口为20,远程数据端口为(x+1)。

4.客户端通过本地的数据端口建立一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器它已经建立好了一个连接。

被动模式FTP:

为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。

在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。

当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N &gt; 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P &gt; 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。

对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:

1. 从任何大于1024的端口到服务器的21端口 (客户端的初始化连接)

2. 服务器的21端口到任何大于1024的端口 (服务器响应到客户端的控制端口的连接)

3. 从任何大于1024端口到服务器的大于1024端口 (客户端初始化数据连接到服务器指定的任意端口)

4. 服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)

二、常用举例:

(注意:以下根据配置文档举出常见实例)

1.安装ftp

[root@gjp99 ~]# mkdir /mnt/cdrom
[root@gjp99 ~]# mount /dev/cdrom /mnt/cdrom
mount: block device /dev/cdrom is write-protected, mounting read-only
[root@gjp99 ~]# cd /mnt/cdrom/Server
[root@gjp99 Server]# ll vsftp*
-r--r--r-- 86 root root 143838 Jul 24  2009 vsftpd-2.0.5-16.el5.i386.rpm
[root@gjp99 Server]# rpm -qip vsftpd-2.0.5-16.el5.i386.rpm
warning: vsftpd-2.0.5-16.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Name        : vsftpd                       Relocations: (not relocatable)
Version     : 2.0.5                             Vendor: Red Hat, Inc.
Release     : 16.el5                        Build Date: Wed 13 May 2009 08:47:15 PM CST
Install Date: (not installed)               Build Host: hs20-bc1-2.build.redhat.com
Group       : System Environment/Daemons    Source RPM: vsftpd-2.0.5-16.el5.src.rpm
Size        : 291690                           License: GPL
Signature   : DSA/SHA1, Fri 24 Jul 2009 08:34:20 PM CST, Key ID 5326810137017186
Packager    : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
URL         : http://vsftpd.beasts.org/
Summary     : vsftpd - Very Secure Ftp Daemon
Description :
vsftpd is a Very Secure FTP daemon. It was written completely from
scratch.

[root@gjp99 Server]# rpm -ivh vsftpd-2.0.5-16.el5.i386.rpm
warning: vsftpd-2.0.5-16.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing...                ################################# [100%]
1:vsftpd                   ################################# [100%]
[root@gjp99 Server]# rpm -ql vsftpd |less

/etc/pam.d/vsftpd    可插拔验证模块
/etc/rc.d/init.d/vsftpd   控制脚本

/etc/vsftpd/vsftpd.conf  主配置文档

/var/ftp    匿名账号的默认目录
/var/ftp/pub

[root@gjp99 Server]# man 5 vsftpd.conf    配置手册

[root@gjp99 Server]# service vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]
[root@gjp99 Server]# chkconfig vsftpd on    开机启动

2. 关于账号的详细配置

2.1.匿名账号:

无需输入用户名和口令! 用户名:anonymous 密码:回车或者邮箱账号

支持匿名账号:配置文档

[root@gjp99 ~]# vim /etc/vsftpd/vsftpd.conf
12 anonymous_enable=YES
image

2.2 本地账号:

有一定的危害性, 存放在:/etc/passwd     /etc/shadow

14 # Uncomment this to allow local users to log in.
15 local_enable=YES

[root@gjp99 ~]# useradd gjp1
[root@gjp99 ~]# passwd gjp1
Changing password for user gjp1.
New UNIX password:
BAD PASSWORD: it is WAY too short
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@gjp99 ~]# cd /home/gjp1
[root@gjp99 gjp1]# ll
total 0
[root@gjp99 gjp1]# echo "welcome to access me " >>index.html
[root@gjp99 gjp1]# ll
total 4
-rw-r--r-- 1 root root 22 Aug  3 14:36 index.html

image

image

2.3 用户通过网络访问资源,

网络权限[ftp  http]   本地权限[相当于windows下的ntfs]

网络权限与本地权限 如果相同 ,则相同,如果不同,则选择最小的!

 

image 网络权限可写

如果本地权限也可写,则访问时可写!

[root@gjp99 home]# ll
total 4
drwx------ 3 gjp1 gjp1 4096 Aug  3 15:00 gjp1

image

还可以删除!

2.4 屏蔽某些权限

文件的权限默认是666,目录的权限默认是777

image 屏蔽掉某些权限: 所有者   用户   组

刚才上传的文件在666的基础上屏蔽022 则结果是644,查看

[root@gjp99 gjp1]# ll
total 108
-rw-r--r-- 1 root root     22 Aug  3 14:36 index.html
-rw-r--r-- 1 gjp1 gjp1 100864 Aug  3 15:00 ??目实训2.doc

网络权限已可写,为什么匿名账号还不能上传呀?

image

[root@gjp99 home]# ll -d /var/ftp/pub
drwxr-xr-x 2 root root 4096 May 13  2009 /var/ftp/pub

pub文件夹的所有者及组都是root,只有管理员可写,其他用户不可写,由于网络权限与本地权限不同,所以选择范围比较小的,

2.5 上传功能

image

[root@gjp99 home]# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]
[root@gjp99 home]# ll -d /var/ftp/pub
drwxr-xr-x 2 root root 4096 May 13  2009 /var/ftp/pub
[root@gjp99 home]# chmod o+wt /var/ftp/pub  注意权限不仅加w,还加t
[root@gjp99 home]# ll -d /var/ftp/pub
drwxr-xrwt 2 root root 4096 May 13  2009 /var/ftp/pub   加t是仅有创建者能够删除文件!

image

改名,删除,创建文件夹都不可以了?

2.6 匿名用户可以创建文件夹

31 anon_mkdir_write_enable=YES   匿名用户创建文件夹

man 5 vsftpd.conf

image

32 anon_other_write_enable=YES  增加此行!  //文件夹可以重命名,可以删除文件,上传

image

image 文件却无法下载

2.7  文件如何下载?

[root@gjp99 home]# ll  /var/ftp/pub    //发现文件没有读取权限
[root@gjp99 home]# ll  /var/ftp/pub
total 56
-rw------- 1 ftp ftp 23040 Aug  3 15:32 ??业????.doc
-rw------- 1 ftp ftp   753 Aug  3 15:47 ???.lnk
-rw------- 1 ftp ftp 24774 Aug  3 15:55 tec.docx

任意一个文件给他个读取权限测试!

[root@gjp99 home]# chmod o+r /var/ftp/pub/tec.docx  给其他用户读权限
[root@gjp99 home]# ll  /var/ftp/pub
total 56
-rw------- 1 ftp ftp 23040 Aug  3 15:32 ??业????.doc
-rw------- 1 ftp ftp   753 Aug  3 15:47 ???.lnk
-rw----r-- 1 ftp ftp 24774 Aug  3 15:55 tec.docx

24 anon_umask=073    增加此行,问题简化

现在在上传点文件做测试!

image

[root@gjp99 home]# ll  /var/ftp/pub   自动带了一个r(刚上传过来的文件)
total 256
-rw------- 1 ftp ftp  23040 Aug  3 15:32 ??业????.doc
-rw----r-- 1 ftp ftp 165835 Aug  3 16:10 guo.docx
-rw----r-- 1 ftp ftp  32272 Aug  3 16:10 ji.docx
-rw------- 1 ftp ftp    753 Aug  3 15:47 ???.lnk
-rw----r-- 1 ftp ftp  24774 Aug  3 15:55 tecnology.docx

2.8 如何备份交换机上的系统?

imageimage

只支持命令行方式访问!

image

2.9 如何访问ftp服务器?

image image

image

2.10  如何提示友好信息?

37 dirmessage_enable=YES

测试:友好提示!

image

 2.11 如何开启ftp的日志功能?

日志文件默认目录   /var/log/却找不到!因为日志功能默认未打开!

打开日志功能:

image

image

image

service vsftpd restart

[root@gjp99 pub]# lftp 127.0.0.1  //无需验证就可以登录
lftp 127.0.0.1:~&gt; dir
drwxr-xrwt    2 0        0            4096 Aug 03 08:38 pub
lftp 127.0.0.1:/&gt; bye

[root@gjp99 pub]# ftp 127.0.0.1    // 需要用户验证
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): anonymous
331 Please specify the password.
Password:

[root@gjp99 pub]# ll /var/log/vsftpd.log        该日志文件已存在!
-rw------- 1 root root 0 Aug  3 16:52 /var/log/vsftpd.log

2.12 如何让日志功能生效?

查手册  man 5 vsftpd.conf

image

56 log_ftp_protocol=YES      增加此行
57 #
58 # Switches between logging into vsftpd_log_file and xferlog_file files.
59 # NO writes to vsftpd_log_file, YES to xferlog_file
60 xferlog_std_format=NO  日志格式禁掉

image

[root@gjp99 pub]# tail -f /var/log/vsftpd.log    //才能使用
Fri Aug  3 09:38:52 2012 [pid 21331] CONNECT: Client "192.168.10.2"
Fri Aug  3 09:38:52 2012 [pid 21331] FTP response: Client "192.168.10.2", "220 (vsFTPd 2.0.5)"
Fri Aug  3 09:38:55 2012 [pid 21331] FTP command: Client "192.168.10.2", "USER gjp1"
Fri Aug  3 09:38:55 2012 [pid 21331] [gjp1] FTP response: Client "192.168.10.2", "331 Please specify the password."
Fri Aug  3 09:38:57 2012 [pid 21331] [gjp1] FTP command: Client "192.168.10.2", "PASS <password>"
Fri Aug  3 09:38:57 2012 [pid 21330] [gjp1] OK LOGIN: Client "192.168.10.2"
Fri Aug  3 09:38:57 2012 [pid 21332] [gjp1] FTP response: Client "192.168.10.2", "230 Login successful."

2.13 拒绝服务攻击的一种方法:

拒绝某人利用某个邮箱账号作为匿名账号的密码进行登录

[root@gjp99 ~]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): anonymous
331 Please specify the password.
Password:   密码为: gjp@sina.com (即使不知道是否存在就能登录)
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp&gt; dir
227 Entering Passive Mode (127,0,0,1,88,15)
150 Here comes the directory listing.
drwxr-xrwt    2 0        0            4096 Aug 03 09:11 pub
226 Directory send OK

image

[root@gjp99 pub]# echo gjp@sina.com >>/etc/vsftpd/banned_emails

[root@gjp99 ~]# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]
[root@gjp99 ~]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): anonymous
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

[root@gjp99 ~]# useradd user1
[root@gjp99 ~]# passwd
Changing password for user root.
New UNIX password:
BAD PASSWORD: it is WAY too short
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

[root@gjp99 ~]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp&gt; pwd
257 "/home/user1"
ftp&gt; cd /
250 Directory successfully changed.
ftp&gt; dir
227 Entering Passive Mode (127,0,0,1,201,20)
150 Here comes the directory listing.
drwxr-xr-x    2 0        0            4096 Aug 03 04:05 bin
drwxr-xr-x    4 0        0            1024 Aug 02 13:26 boot
drwxr-xr-x   11 0        0            4260 Aug 03 05:42 dev
drwxr-xr-x   93 0        0           12288 Aug 03 10:06 etc

ftp> cd boot
250 Directory successfully changed.
ftp&gt; dir
227 Entering Passive Mode (127,0,0,1,89,202)
150 Here comes the directory listing.
-rw-r--r--    1 0        0          954947 Aug 18  2009 System.map-2.6.18-164.el5
-rw-r--r--    1 0        0           68663 Aug 18  2009 config-2.6.18-164.el5
drwxr-xr-x    2 0        0            1024 Aug 02 13:30 grub
-rw-------    1 0        0         2601298 Aug 02 13:26 initrd-2.6.18-164.el5.img
drwx------    2 0        0           12288 Aug 02 21:18 lost+found
-rw-r--r--    1 0        0          107405 Aug 18  2009 symvers-2.6.18-164.el5.gz
-rw-r--r--    1 0        0         1855956 Aug 18  2009 vmlinuz-2.6.18-164.el5
226 Directory send OK.

可以查看许多内容,而且可以下载,没有安全性!

2.14 如何提高 ftp的安全性?

[root@gjp99 ~]# vim /etc/vsftpd/vsftpd.conf

image

[root@gjp99 ~]# vim /etc/vsftpd/chroot_list
[root@gjp99 ~]# cat /etc/vsftpd/chroot_list
user1     //写入到该文件的账号都被禁锢了,没有写进来的可随意切换!

[root@gjp99 ~]# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

[root@gjp99 ~]# su – user1      该账号下存在属于自己的东西
[user1@gjp99 ~]$ ll
total 0
[user1@gjp99 ~]$ touch gjp.txt
[user1@gjp99 ~]$ vim gjp.txt
[user1@gjp99 ~]$ ll
total 4
-rw-rw-r-- 1 user1 user1 32 Sep 26 14:40 gjp.txt

[root@gjp99 ~]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp&gt; pwd
257 "/"
ftp&gt; cd /
250 Directory successfully changed.
ftp&gt; dir
227 Entering Passive Mode (127,0,0,1,119,140)
150 Here comes the directory listing.
-rw-rw-r--    1 501      501            32 Sep 26 06:40 gjp.txt
226 Directory send OK.
ftp&gt; bye
221 Goodbye.

[root@gjp99 ~]# useradd user2
[root@gjp99 ~]# passwd
Changing password for user root.
New UNIX password:
BAD PASSWORD: it is WAY too short
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@gjp99 ~]# su - user2
[user2@gjp99 ~]$ echo "user2" &gt;&gt; gjp2.txt
[user2@gjp99 ~]$ ll
total 4
-rw-rw-r-- 1 user2 user2 6 Sep 26 14:45 gjp2.txt
[user2@gjp99 ~]$ logout

[root@gjp99 ~]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): user2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp&gt; pwd
257 "/home/user2"
ftp&gt; cd /
250 Directory successfully changed.
ftp&gt; dir
227 Entering Passive Mode (127,0,0,1,68,60)
150 Here comes the directory listing.
drwxr-xr-x    2 0        0            4096 Aug 03 04:05 bin
drwxr-xr-x    4 0        0            1024 Aug 02 13:26 boot
drwxr-xr-x   11 0        0            4220 Sep 26 06:26 dev
drwxr-xr-x   93 0        0           12288 Sep 26 06:48 etc
drwxr-xr-x    5 0        0            4096 Sep 26 06:44 home

(没有写入该文件的账号,如user2,则可以随意切换)

实现:放入该文件里的账号能够切换目录,没放进来的不能够切换目录,man 5 vsftpd.conf

image

[root@gjp99 ~]# vim /etc/vsftpd/vsftpd.conf

增加此功能; chroot_local_user=YES

[root@gjp99 ~]# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]
[root@gjp99 ~]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): user1 放进去的却没有禁锢掉
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
257 "/home/user1"
ftp&gt; cd /
250 Directory successfully changed.
ftp&gt; quit
221 Goodbye.
[root@gjp99 ~]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): user2  没放进去的被禁锢了
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp&gt; pwd
257 "/"
ftp&gt; cd /
250 Directory successfully changed.
ftp&gt; dir
227 Entering Passive Mode (127,0,0,1,98,84)
150 Here comes the directory listing.
-rw-rw-r--    1 502      502             6 Sep 26 06:45 gjp2.txt
226 Directory send OK.

 ftp 的特性:

独立进程存放在: /etc/init.c    /etc/rc.d/init.d 目录下!

超级守护进程:xinetd

112 listen=YES    表明独立的,不再依赖于超级守护进程

119 pam_service_name=vsftpd   //ftp支持pam验证

可参考ftp的接口文件

[root@gjp99 pam.d]# vim  /etc/pam.d/vsftpd  里面有相应的系统调用及参数

[root@gjp99 pam.d]# cd /etc/vsftpd
[root@gjp99 vsftpd]# ll
total 28
-rw-r--r-- 1 root root   13 Aug  3 18:00 banned_emails
-rw-r--r-- 1 root root    7 Sep 26 14:37 chroot_list
-rw------- 1 root root  125 May 13  2009 ftpusers  存入该文件的账号不能登录ftp
-rw------- 1 root root  361 May 13  2009 user_list  存入该文件的账号不能登录ftp
-rw------- 1 root root 4640 Sep 26 14:59 vsftpd.conf
-rwxr--r-- 1 root root  338 May 13  2009 vsftpd_conf_migrate.sh

[root@gjp99 vsftpd]# cat ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
user1   把user1添加进来作为测试!

[root@gjp99 vsftpd]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): user1
331 Please specify the password.
Password:     需要输入密码,如果网络上有人抓包,则很不安全!
530 Login incorrect.
Login failed.   登录失败

  把ftpusers中存放的账号user1删除,在user_list中输入user1测试!

[root@gjp99 vsftpd]# cat user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
user1

[root@gjp99 vsftpd]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): user1
530 Permission denied.  没有提示让输入密码,直接拒绝掉了
Login failed.
为了防止管理员的密码被捕获,则不允许管理员ftp

[root@gjp99 vsftpd]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): root
530 Permission denied.
Login failed.

[root@gjp99 vsftpd]# vim user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file

在 /etc/vsftpd/vsftpd.conf中增加此功能: service vsftpd restart
下面测试:user1在这个文件下所以可以登录,user2不在该文件里,因此直接拒绝!

[root@gjp99 vsftpd]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp&gt; dir
227 Entering Passive Mode (127,0,0,1,42,166)
150 Here comes the directory listing.
-rw-rw-r--    1 501      501            32 Sep 26 06:40 gjp.txt
226 Directory send OK.
ftp&gt; quit
221 Goodbye.
[root@gjp99 vsftpd]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): user2
530 Permission denied.
Login failed.

/etc/vsftpd/vsftpd.conf 下的

122 tcp_wrappers=YES

查看某些应用支持的链接库:

[root@gjp99 vsftpd]# ldd /usr/sbin/vsftpd
linux-gate.so.1 =&gt;  (0x00164000)
libssl.so.6 =&gt; /lib/libssl.so.6 (0x00a33000)
libwrap.so.0 =&gt; /lib/libwrap.so.0 (0x0067c000)

出现此文件,即说明支持tcp_wrappers=YES

需修改 /etc/hosts.allow  /etc/hosts.deny

先看hosts.allow   再看hosts.deny   默认是允许的!

image

[root@gjp99 vsftpd]# cat /etc/hosts.allow
#
# hosts.allow    This file describes the names of the hosts which are
#        allowed to use the local INET services, as decided
#        by the '/usr/sbin/tcpd' server.
#
vsftpd:192.168.10.2:allow   仅有192.168.10.2允许
[root@gjp99 vsftpd]# vim /etc/hosts.deny
[root@gjp99 vsftpd]# cat /etc/hosts.deny
#
# hosts.deny    This file describes the names of the hosts which are
#        *not* allowed to use the local INET services, as decided
#        by the '/usr/sbin/tcpd' server.
#
# The portmap line is redundant, but it is left to remind you that
# the new secure portmap uses hosts.deny and hosts.allow.  In particular
# you should know that NFS uses portmap!
vsftpd:all :deny   其他人拒绝

测试:windows下ftp

image

linux 下测试:

[root@gjp99 vsftpd]# ftp 127.0.0.1
Connected to 127.0.0.1.
421 Service not available.
ftp&gt; quit

只有192.168.10.2不可以,其他的都可以!

[root@gjp99 vsftpd]# vim /etc/hosts.allow    只在该文件下操作,hosts.deny 空着

6 vsftpd:192.168.10.2:deny
7 vsftpd:all:allow

测试:windows下:

image

linux下:

[root@gjp99 vsftpd]# ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (127.0.0.1:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp&gt; dir
227 Entering Passive Mode (127,0,0,1,208,223)
150 Here comes the directory listing.
-rw-rw-r--    1 501      501            32 Sep 26 06:40 gjp.txt
226 Directory send OK.
ftp&gt; quit

ftp的安全性

1. 协议   ftp  明文

2. 账号  匿名  本地账号(抓包,危险性较大) 最好选用虚拟账号

删除原有的安全特性,安装tshark

挂载光盘,安装抓包工具:

[root@gjp99 vsftpd]# mount /dev/cdrom /mnt/cdrom
mount: block device /dev/cdrom is write-protected, mounting read-only
[root@gjp99 vsftpd]# cd /mnt/cdrom/Server/
[root@gjp99 Server]# ll wireshark-*
-r--r--r-- 220 root root 11130359 Jun 11  2009 wireshark-1.0.8-1.el5_3.1.i386.rpm
-r--r--r-- 220 root root   686650 Jun 11  2009 wireshark-gnome-1.0.8-1.el5_3.1.i386.rpm
[root@gjp99 Server]# rpm -ivh libsmi-0.4.5-2.el5.i386.rpm  必须先安装此软件
warning: libsmi-0.4.5-2.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing...                ################################# [100%]
1:libsmi                 ################################# [100%]
[root@gjp99 Server]# rpm -ivh wire
wireless-tools-28-2.el5.i386.rpm
wireless-tools-devel-28-2.el5.i386.rpm
wireshark-1.0.8-1.el5_3.1.i386.rpm
wireshark-gnome-1.0.8-1.el5_3.1.i386.rpm
[root@gjp99 Server]# rpm -ivh wireshark-1.0.8-1.el5_3.1.i386.rpm
warning: wireshark-1.0.8-1.el5_3.1.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing...                ################################# [100%]
1:wireshark              ############################### [100%]

[root@gjp99 Server]# tshark -ni eth0 -R "tcp.dstport eq 21 "
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0  已经在eth0上可以抓包了~

Xshell:\&gt; ftp 192.168.10.98

Connecting to 192.168.10.98:21...
Connection established.
Escape character is '^@]'.
220 (vsFTPd 2.0.5)
Name (192.168.10.98:Administrator): user1
331 Please specify the password.
Password:
230 Login successful.
ftp:/home/user1&gt;

抓包抓到的情况:

115.297511 192.168.10.2 -&gt; 192.168.10.98 FTP Request: USER user1   用户名
115.497920 192.168.10.2 -&gt; 192.168.10.98 TCP 53368 &gt; 21 [ACK] Seq=13 Ack=55 Win=65536 Len=0
116.968029 192.168.10.2 -&gt; 192.168.10.98 FTP Request: PASS 123 密码
116.996447 192.168.10.2 -&gt; 192.168.10.98 FTP Request: PWD
117.196785 192.168.10.2 -&gt; 192.168.10.98 TCP 53368 &gt; 21 [ACK] Seq=28 Ack=97 Win=65536 Len=0

测试,是否能抓到管理员密码?

Xshell:\&gt; ftp  192.168.10.98

Connecting to 192.168.10.98:21...
Connection established.
Escape character is '^@]'.
220 (vsFTPd 2.0.5)
Name (192.168.10.98:Administrator): root
530 Permission denied.

抓包抓不到密码:

243.383605 192.168.10.2 -&gt; 192.168.10.98 FTP Request: USER root
243.583142 192.168.10.2 -&gt; 192.168.10.98 TCP 53369 &gt; 21 [ACK] Seq=12 Ack=45 Win=65536 Len=0
291.498211 192.168.10.2 -&gt; 192.168.10.98 FTP Request: PWD
291.698623 192.168.10.2 -&gt; 192.168.10.98 TCP 53368 &gt; 21 [ACK] Seq=43 Ack=154 Win=65536 Len=0

ftps的搭建:

ftps=ftp+ssl

创建CA

[root@gjp99 Server]# cd /etc/pki
[root@gjp99 pki]# ll
total 32
drwx------ 3 root root 4096 Aug  2 21:22 CA
drwxr-xr-x 2 root root 4096 Aug  2 21:20 nssdb
drwxr-xr-x 2 root root 4096 Aug  2 21:21 rpm-gpg
drwxr-xr-x 5 root root 4096 Aug  2 21:22 tls
[root@gjp99 pki]# vim tls/openssl.cnf

45 dir             = /etc/pki/CA           # Where everything is kept
46 certs           = $dir/certs            # Where the issued certs are kept
47 crl_dir         = $dir/crl              # Where the issued crl are kept
48 database        = $dir/index.txt        # database index file.
49 #unique_subject = no                    # Set to 'no' to allow creation of
50                                         # several ctificates with same subject.
51 new_certs_dir   = $dir/newcerts         # default place for new certs.
52
53 certificate     = $dir/cacert.pem       # The CA certificate
54 serial          = $dir/serial           # The current serial number
55 crlnumber       = $dir/crlnumber        # the current crl number
56                                         # must be commented out to leave a V1 CRL
57 crl             = $dir/crl.pem          # The current CRL
58 private_key     = $dir/private/cakey.pem# The private key

底行模式:image

88 countryName             = optonal
89 stateOrProvinceName     = optonal
90 organizationName        = optonal

image

[root@gjp99 pki]# ll
total 32
drwx------ 3 root root 4096 Aug  2 21:22 CA
drwxr-xr-x 2 root root 4096 Aug  2 21:20 nssdb
drwxr-xr-x 2 root root 4096 Aug  2 21:21 rpm-gpg
drwxr-xr-x 5 root root 4096 Sep 26 17:04 tls
[root@gjp99 pki]# cd CA
[root@gjp99 CA]# ll
total 8
drwx------ 2 root root 4096 Jun 30  2009 private
[root@gjp99 CA]# mkdir crl certs newcerts
[root@gjp99 CA]# touch index.txt  serial
[root@gjp99 CA]# echo "01"&gt;serial
[root@gjp99 CA]# openssl genrsa 1024 &gt;private/cakey.pem
Generating RSA private key, 1024 bit long modulus
....++++++
......++++++
e is 65537 (0x10001)
[root@gjp99 CA]# chmod 600 private/*
[root@gjp99 CA]# openssl req -new -key private/cakey.pem -x509 -out cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Shang Hai]:
Locality Name (eg, city) [Shang Hai]:
Organization Name (eg, company) [My Company Ltd]:sec center
Organizational Unit Name (eg, section) []:tec
Common Name (eg, your name or your server's hostname) []:ca.net.net
Email Address []:
私钥   请求文件   证书

[root@gjp99 CA]# mkdir /etc/vsftpd/certs
[root@gjp99 CA]# cd /etc/vsftpd/certs/
[root@gjp99 certs]# openssl genrsa 1024 &gt;vsftpd.key  创建钥匙
Generating RSA private key, 1024 bit long modulus
.......++++++
................................................................+++
e is 65537 (0x10001)
[root@gjp99 certs]# openssl req -new -key vsftpd.key -out vsftpd.csr   产生请求
You are about to be asked to enter information that will be inco
into your certificate request.
What you are about to enter is what is called a Distinguished Na
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Shang Hai]:
Locality Name (eg, city) [Shang Hai]:
Organization Name (eg, company) [My Company Ltd]:bht
Organizational Unit Name (eg, section) []:tec
Common Name (eg, your name or your server's hostname) []:ftp.bht.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

[root@gjp99 certs]# ll
total 8
-rw-r--r-- 1 root root 651 Sep 26 17:17 vsftpd.csr
-rw-r--r-- 1 root root 887 Sep 26 17:15 vsftpd.key
[root@gjp99 certs]# openssl ca -in vsftpd.csr -out vsftpd.cert   生成证书
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Sep 26 09:35:33 2012 GMT
Not After : Sep 26 09:35:33 2013 GMT
Subject:
countryName               = CN
stateOrProvinceName       = Shang Hai
organizationName          = bht
organizationalUnitName    = tec
commonName                = ftp.bht.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
4E:10:2C:A8:BA:A8:5E:16:D1:8E:BD:85:53:87:5C:5E:1D:B6:04:C1
X509v3 Authority Key Identifier:
keyid:DF:8C:0F:8C:D0:65:31:42:FB:AF:29:7A:52:51:4C:86:09:25:91:F4

Certificate is to be certified until Sep 26 09:35:33 2013 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

证书在哪?私钥在哪?

用man 5 vsftpd.conf

[root@gjp99 certs]# vim /etc/vsftpd/vsftpd.conf

增加以下功能:

rsa_cert_file=/etc/vsftpd/certs/vsftpd.cert
rsa_private_key_file=/etc/vsftpd/certs/vsftpd.key
ssl_tlsv1=YES
ssl_sslv3=YES
ssl_sslv2=YES
ssl_enable=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES

[root@gjp99 certs]# service vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

[root@gjp99 certs]# tshark -ni eth0  -R "tcp.dstport eq 21 "
Running as user "root" and group "root". This could be dangerous.
Capturing on eth0

C:\Users\Administrator&gt;ftp 192.168.10.98   命令行下无法登录(由于使用了身份验证)
连接到 192.168.10.98。
220 (vsFTPd 2.0.5)
用户(192.168.10.98:(none)): user1
530 Non-anonymous sessions must use encryption.
登录失败。

使用客户端软件:

image imageimage

点击应用   点击连接!

image

点击  “接受一次”

image

1331.140451 192.168.10.2 -&gt; 192.168.10.98 FTP Request: AUTH SSL
1331.147508 192.168.10.2 -&gt; 192.168.10.98 FTP Request: \200\310\001\003\001\000

下面都是已加密的信息,已看不到密码!

93月/170

Linux技巧:Vimdiff 使用

发布在 邵珠庆

在 IBM Bluemix 云平台上开发并部署您的下一个应用。

开始您的试用

源程序文件(通常是纯文本文件)比较和合并工具一直是软件开发过程中比较重要的组成部分。现在市场上很多功能很强大的专用比较和合并工具,比如 BeyondCompare;很多IDE 或者软件配置管理系统,比如Eclipse, Rational ClearCase都提供了内建的功能来支持文件的比较和合并。

当远程工作在Unix/Linux平台上的时候,恐怕最简单而且到处存在的就是命令行工具,比如diff。可惜diff的功能有限,使用起来也不是很方便。作为命令行的比较工具,我们仍然希望能拥有简单明了的界面,可以使我们能够对比较结果一目了然;我们还希望能够在比较出来的多处差异之间快速定位,希望能够很容易的进行文件合并……。而Vim提供的diff模式,通常称作vimdiff,就是这样一个能满足所有这些需求,甚至能够提供更多的强力工具。在最近的工作中,因为需要做很多的文件比较和合并的工作,因此对Vimdiff的使用做了一个简单的总结。我们先来看看vimdiff的基本使用。

启动方法

首先保证系统中的diff命令是可用的。Vim的diff模式是依赖于diff命令的。Vimdiff的基本用法就是:

# vimdiff  FILE_LEFT  FILE_RIGHT

或者

# vim -d  FILE_LEFT  FILE_RIGHT

图一就是vimdiff命令的执行结果的画面。

图1

从上图我们可以看到一个清晰的比较结果。屏幕被垂直分割,左右两侧分别显示被比较的两个文件。两个文件中连续的相同的行被折叠了起来,以便使用者能把注意力集中在两个文件的差异上。只在某一文件中存在的行的背景色被设置为蓝色,而在另一文件中的对应位置被显示为绿色。两个文件中都存在,但是包含差异的行显示为粉色背景,引起差异的文字用红色背景加以突出。

除了用这种方法启动vim的diff模式之外,我们还可以用分割窗口命令来启动diff模式:

# vim FILE_LEFT

然后在vim的ex模式(也就是"冒号"模式)下输入:

:vertical diffsplit FILE_RIGHT

也可以达到同样的效果。如果希望交换两个窗口的位置,或者希望改变窗口的分割方式,可以使用下列命令:

1. Ctrl-w K(把当前窗口移到最上边)
2. Ctrl-w H(把当前窗口移到最左边)
3. Ctrl-w J(把当前窗口移到最下边)
4. Ctrl-w L(把当前窗口移到最右边)

其中1和3两个操作会把窗口改成水平分割方式。

 

回页首

光标移动

接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。这是因为"scrollbind"选项被设置了的结果,vim会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:

:set noscrollbind

可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:

]c

反向跳转是:

[c 1="</div>" 2="如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。比如如果在位于第一个差异点的行输入"2" language="</pre>"][/c]c",将越过下一个差异点,跳转到第三个差异点。

 

回页首

文件合并

文件比较的最终目的之一就是合并,以消除差异。如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令

dp (diff "put")

如果希望把另一个文件的内容复制到当前行中,可以使用命令

do (diff "get",之所以不用dg,是因为dg已经被另一个命令占用了)

如果希望手工修改某一行,可以使用通常的vim操作。如果希望在两个文件之间来回跳转,可以用下列命令序列:

Ctrl-w, w

在修改一个或两个文件之后,vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:

:diffupdate

如果希望撤销修改,可以和平常用vim编辑一样,直接

<ESC>, u

但是要注意一定要将光标移动到需要撤销修改的文件窗口中。

 

回页首

同时操作两个文件

在比较和合并告一段落之后,可以用下列命令对两个文件同时进行操作。比如同时退出:

:qa (quit all)

如果希望保存全部文件:

:wa (write all)

或者是两者的合并命令,保存全部文件,然后退出:

:wqa (write, then quit all)

如果在退出的时候不希望保存任何操作的结果:

:qa! (force to quit all)
 

回页首

上下文的展开和查看

比较和合并文件的时候经常需要结合上下文来确定最终要采取的操作。Vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置:

:set diffopt=context:3

可以用简单的折叠命令来临时展开被折叠的相同的文本行:

zo (folding open,之所以用z这个字母,是因为它看上去比较像折叠着的纸)

然后可以用下列命令来重新折叠:

zc (folding close)

下图是设置上下文为3行,并展开了部分相同文本的vimdiff屏幕:

 

回页首

结论

在无法使用图形化的比较工具的时候,或者在需要快速比较和合并少量文件的时候,Vimdiff是最好的选择。

 

211月/160

Linux下如何使用命令同步时钟

发布在 邵珠庆

linux的系统时钟在很多地方都要用到,要是不准,就会出现一些奇怪的问题;

在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟。系统时钟: 是指当前Linux Kernel中的时钟,硬件时钟: 是主板上由电池供电的时钟,这个硬件时钟可以在BIOS中进行设置。

当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。

Linux 中的所有命令(包括函数)都是采用的系统时钟设置。在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只用一个就行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。

  1、 date

查看系统时间

# date

设置系统时间

# date –set “07/07/06 10:19″ //(月/日/年时:分:秒)

  2、hwclock/clock

查看硬件时间

# hwclock –show //或者

# clock –show

设置硬件时间

# hwclock –set –date=”07/07/06 10:19″ (月/日/年 时:分:秒) 或者

# clock –set –date=”07/07/06 10:19″ (月/日/年 时:分:秒)

  3、硬件时间和系统时间的同步

按照前面的说法,重新启动系统,硬件时间会读取系统时间,实现同步,

但是在不重新启动的时候,需要用hwclock或clock命令实现同步。

硬件时钟与系统时钟同步:

# hwclock –hctosys // (hc代表硬件时间,sys代表系统时间)或者

# clock –hctosys

系统时钟和硬件时钟同步:

# hwclock –systohc // 或者

# clock –systohc

  4. 和外部的NTP时间服务器同步

$ service ntpd stop

这一步是必须的,否则出出现:

25 Nov 18:10:34 ntpdate[2106]: the NTP socket is in use, exiting

的失败提示;

$ ntpdate ntp.sjtu.edu.cn

正常返回如下:

25 Nov 18:14:34 ntpdate[2164]: adjust time server 202.120.2.101 offset -0.006107 sec

错误返回如:

25 Nov 18:13:44 ntpdate[2158]: no server suitable for synchronization found

$ service ntpd start

$ chkconfig ntpd on

$ clock -w

还可以写进定时任务中,以做定时的时钟同步:

$ crontab -e

05 * * * * /usr/sbin/ntpdate ntp.sjtu.edu.cn 》 /dev/null 2》&1

05 17 * * * /sbin/clock -w

附上中国大概能用的NTP时间服务器地址

server 133.100.11.8 prefer

server 210.72.145.44

server 203.117.180.36

server 131.107.1.10

server time.asia.apple.com

server 64.236.96.53

server 130.149.17.21

server 66.92.68.246

server www.freebsd.org

server 18.145.0.30

server clock.via.net

server 137.92.140.80

server 133.100.9.2

server 128.118.46.3

server ntp.nasa.gov

server 129.7.1.66

server ntp-sop.inria.frserver 210.72.145.44(中国国家授时中心服务器IP地址)

server ntp.sjtu.edu.cn(上海交通大学网络中心NTP服务器地址)

上面就是使用命令同步Linux时钟的方法介绍了,一般使用data、hwclock和clock命令,而data命令是比较常用的命令,如果你的系统时钟不同步,那就赶紧改过来吧。

119月/160

linux 查看系统信息命令(比较全)

发布在 邵珠庆

# uname -a # 查看内核/操作系统/CPU信息 
# head -n 1 /etc/issue # 查看操作系统版本 
# cat /proc/cpuinfo # 查看CPU信息 
# hostname # 查看计算机名 
# lspci -tv # 列出所有PCI设备 
# lsusb -tv # 列出所有USB设备 
# lsmod # 列出加载的内核模块 
# env # 查看环境变量资源 
# free -m # 查看内存使用量和交换区使用量 
# df -h # 查看各分区使用情况 
# du -sh <目录名> # 查看指定目录的大小 
# grep MemTotal /proc/meminfo # 查看内存总量 
# grep MemFree /proc/meminfo # 查看空闲内存量 
# uptime # 查看系统运行时间、用户数、负载 
# cat /proc/loadavg # 查看系统负载磁盘和分区 
# mount | column -t # 查看挂接的分区状态 
# fdisk -l # 查看所有分区 
# swapon -s # 查看所有交换分区 
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备) 
# dmesg | grep IDE # 查看启动时IDE设备检测状况网络 
# ifconfig # 查看所有网络接口的属性 
# iptables -L # 查看防火墙设置 
# route -n # 查看路由表 
# netstat -lntp # 查看所有监听端口 
# netstat -antp # 查看所有已经建立的连接 
# netstat -s # 查看网络统计信息进程 
# ps -ef # 查看所有进程 
# top # 实时显示进程状态用户 
# w # 查看活动用户 
# id <用户名> # 查看指定用户信息 
# last # 查看用户登录日志 
# cut -d: -f1 /etc/passwd # 查看系统所有用户 
# cut -d: -f1 /etc/group # 查看系统所有组 
# crontab -l # 查看当前用户的计划任务服务 
# chkconfig –list # 列出所有系统服务 
# chkconfig –list | grep on # 列出所有启动的系统服务程序 
# rpm -qa # 查看所有安装的软件包

285月/160

Linux中几个在备份中常用的命令(cp,scp,rsync)

发布在 邵珠庆

在备份的操作中,拷贝,过期文件的删除是经常要做的事情。
拷贝也有本机拷贝,拷贝到别的服务器等。常用的操作有cp,scp,rsync等命令。
1、 cp(copy)命令

功能说明:复制文件或目录。

语  法:cp [-abdfilpPrRsuvx][-S <备份字尾字符串>][-V <备份方式>][--help][--spares=<使用时机>][--version][源文件或目录][目标文件或目录] [目的目录]

补充说明:cp指令用在复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到该目录中。若同时指定多个文件或目录,而最后的目的地并非是一个已存在的目录,则会出现错误信息。

参  数:
 -a或--archive  此参数的效果和同时指定"-dpR"参数相同。
 -b或--backup  删除,覆盖目标文件之前的备份,备份文件会在字尾加上一个备份字符串。
 -d或--no-dereference  当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录。
 -f或--force  强行复制文件或目录,不论目标文件或目录是否已存在。
 -i或--interactive  覆盖既有文件之前先询问用户。
 -l或--link  对源文件建立硬连接,而非复制文件。
 -p或--preserve  保留源文件或目录的属性。
 -P或--parents  保留源文件或目录的路径。
 -r  递归处理,将指定目录下的文件与子目录一并处理。
 -R或--recursive  递归处理,将指定目录下的所有文件与子目录一并处理。
 -s或--symbolic-link  对源文件建立符号连接,而非复制文件。
 -S<备份字尾字符串>或--suffix=<备份字尾字符串>  用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字尾字符串是符号"~"。
 -u或--update  使用这项参数后只会在源文件的更改时间较目标文件更新时或是 名称相互对应的目标文件并不存在,才复制文件。
 -v或--verbose  显示指令执行过程。
 -V<备份方式>或--version-control=<备份方式>  用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这字符串不仅可用"-S"参数变更,当使用"-V"参数指定不同备份方式时,也会产生不同字尾的备份字串。
 -x或--one-file-system  复制的文件或目录存放的文件系统,必须与cp指令执行时所处的文件系统相同,否则不予复制。
 --help  在线帮助。
 --sparse=<使用时机>  设置保存稀疏文件的时机。
 --version  显示版本信息。

2. SCP
scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录.
scp命令的用处:
scp在网络上不同的主机之间复制文件,它使用ssh安全协议传输数据,具有和ssh一样的验证机制,从而安全的远程拷贝文件。
scp命令基本格式:
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 [...] [[user@]host2:]file2

例子:scp -r /home/soft/ root@www.mydomain.com:/home/others/

3. rsync

rysnc是一个数据镜像及备份工具,具有可使本地和远程两台主机的文件,目录之间,快速同步镜像,远程数据备份等功能。在同步过程中,rsync是根据自己独特的算法,只同步有变化的文件,甚至在一个文件里只同步有变化的部分,所以可以实现快速的同步数据的功能。
1. rsync用法
NAME
rsync - faster, flexible replacement for rcp

用法:
rsync [OPTION]... SRC [SRC]... DEST

rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

rsync [OPTION]... SRC

rsync [OPTION]... [USER@]HOST:SRC [DEST]

rsync [OPTION]... [USER@]HOST::SRC [DEST]

rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
参数是非常多,用man可以查询。
--delete 删除传送端已经不存在,而目的端存在的档案
--delete-excluded 除了把传送端已经不存在, 而目的端存在的档案删除之外, 也删除 --exclude 参数所包含的档案
使用例子,把192.168.1.2的/home/下的文件同步到本地的/home/下面:rsync -aSvH --delete /home/ root@192.168.1.2:/home/
主要SCR目录的写法、比如 rsync src/ 和 src 是有区别的。 src/是src文件夹下的所有文件作为传送对象。没有/的src的话是,src这个文件夹整体拷贝传送。
rsync执行中需要ssh认证等,可以实现配置,然后在cron中定时执行同步就好了。在备份的操作中,拷贝,过期文件的删除是经常要做的事情。
拷贝也有本机拷贝,拷贝到别的服务器等。常用的操作有cp,scp,rsync等命令。
1、 cp(copy)命令

功能说明:复制文件或目录。

语  法:cp [-abdfilpPrRsuvx][-S <备份字尾字符串>][-V <备份方式>][--help][--spares=<使用时机>][--version][源文件或目录][目标文件或目录] [目的目录]

补充说明:cp指令用在复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到该目录中。若同时指定多个文件或目录,而最后的目的地并非是一个已存在的目录,则会出现错误信息。

参  数:
 -a或--archive  此参数的效果和同时指定"-dpR"参数相同。
 -b或--backup  删除,覆盖目标文件之前的备份,备份文件会在字尾加上一个备份字符串。
 -d或--no-dereference  当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录。
 -f或--force  强行复制文件或目录,不论目标文件或目录是否已存在。
 -i或--interactive  覆盖既有文件之前先询问用户。
 -l或--link  对源文件建立硬连接,而非复制文件。
 -p或--preserve  保留源文件或目录的属性。
 -P或--parents  保留源文件或目录的路径。
 -r  递归处理,将指定目录下的文件与子目录一并处理。
 -R或--recursive  递归处理,将指定目录下的所有文件与子目录一并处理。
 -s或--symbolic-link  对源文件建立符号连接,而非复制文件。
 -S<备份字尾字符串>或--suffix=<备份字尾字符串>  用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字尾字符串是符号"~"。
 -u或--update  使用这项参数后只会在源文件的更改时间较目标文件更新时或是 名称相互对应的目标文件并不存在,才复制文件。
 -v或--verbose  显示指令执行过程。
 -V<备份方式>或--version-control=<备份方式>  用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这字符串不仅可用"-S"参数变更,当使用"-V"参数指定不同备份方式时,也会产生不同字尾的备份字串。
 -x或--one-file-system  复制的文件或目录存放的文件系统,必须与cp指令执行时所处的文件系统相同,否则不予复制。
 --help  在线帮助。
 --sparse=<使用时机>  设置保存稀疏文件的时机。
 --version  显示版本信息。

2. SCP
scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录.
scp命令的用处:
scp在网络上不同的主机之间复制文件,它使用ssh安全协议传输数据,具有和ssh一样的验证机制,从而安全的远程拷贝文件。
scp命令基本格式:
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 [...] [[user@]host2:]file2

例子:scp -r /home/soft/ root@www.mydomain.com:/home/others/

3. rsync

rysnc是一个数据镜像及备份工具,具有可使本地和远程两台主机的文件,目录之间,快速同步镜像,远程数据备份等功能。在同步过程中,rsync是根据自己独特的算法,只同步有变化的文件,甚至在一个文件里只同步有变化的部分,所以可以实现快速的同步数据的功能。
1. rsync用法
NAME
rsync - faster, flexible replacement for rcp

用法:
rsync [OPTION]... SRC [SRC]... DEST

rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

rsync [OPTION]... SRC

rsync [OPTION]... [USER@]HOST:SRC [DEST]

rsync [OPTION]... [USER@]HOST::SRC [DEST]

rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
参数是非常多,用man可以查询。
--delete 删除传送端已经不存在,而目的端存在的档案
--delete-excluded 除了把传送端已经不存在, 而目的端存在的档案删除之外, 也删除 --exclude 参数所包含的档案
使用例子,把192.168.1.2的/home/下的文件同步到本地的/home/下面:rsync -aSvH --delete /home/ root@192.168.1.2:/home/
主要SCR目录的写法、比如 rsync src/ 和 src 是有区别的。 src/是src文件夹下的所有文件作为传送对象。没有/的src的话是,src这个文件夹整体拷贝传送。
rsync执行中需要ssh认证等,可以实现配置,然后在cron中定时执行同步就好了。

   下一页