‘壹’ 如何在linux上配置ftp 及创建 ftp用户
在Internet上FTP(File Transfer Protocol,文件传输协议)扮 演着十分重要的角色。我们可以通过FTP与远程机器传输交换文件数 据,下载或上传最新的软件。基本的FTP服务器根据服务的对象可以分为两 种,一种是Unix(当然也包括Linux)系统基本的FTP服务器,使用者是服务器上合法的 用户;而另一种是匿名FTP服务器(Anonmous FTP Service),任何人只要使用anonmous或ftp帐号并提供电子邮件地址作为口令就可以使用FTP服务。
对于系统中合法的用户,其登录目录为他们的home目录;如果是匿名用户登录的话,登录后会到/home/ftp这个目录中,该除非我们在该目 录中存放下载文件,否则匿名FTP使用者将不能做任何事情。在本章,我们将详细地介绍FTP服务器的安装、配置以及服务 器的维护。
安装FTP服务器
在Linux的发行套件中都有FTP服务器的软件包wu-ftpd(Washington University FTP server),这是目前最流行的一种免费FTP服务器软件,目前绝大多数的FTP站点都是由wu-ftpd来架设的,而wu-ftp如此流行的原因是因 为它强大的功能,例如:
·可控制不同网域的机器对 FTP服务器的存取权限和访问时段。
·使用者在下载文件时,可自动对文件进 行压缩或解压缩工作。
·可以记录文件上传或下载的过程。
·可以限制最高访问人数,以维持系统的最佳运行效率。
·可显示相关的信息,以便用户了解当前的接收状态。
·可暂时关闭FTP服务器,以便系统维护。
在安装系统时如果选择了wu-ftpd软件包,就会自动安装。但如果我们想要使用最新的FTP软件包的话,可以到全世界各大FTP站点下载。目 前最新的版本是wu-ftpd-2.5.0,得到了wu-ftpd-2.5.0.tar.gz后,请按照我们下面的步骤进行安装。
1.将wu-ftpd-2.5.0.tar.gz复制到临时目录中并解压缩:
# tar zxvf wu-ftpd-2.5.0.tar.gz
进入解压缩产生的目录wu-ftpd-2.5.0中,在开始安装之前请仔细阅读里面的README、INSTALL等文件,以便了解安装需要注 意的事项。
2.执行命令“bulid lnx”,编译wu-ftpd-2.5.0的源程序。
# ./bulid lnx
这条命令将编译Linux系统使用wu-ftpd所需的服务程序,如果一切正常的话,将产生如下几个可执行文件:
ftpd FTP服务程序
ftpshut 关闭FTP服务的程序
ftpcount 显示FTP 服务器目前连接的人数的程序
ftpwho 查看目前使用者
3.执行安装命令“make install”,将编译生成的可执行文件和man pages安装到系统中。
# make install
4. 修改/etc/inetd.conf文件,加入如下一行:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l –a
如果系统中以前安装有wu-ftpd的话,这一步可以略去不做,安装安装程序会自动更新/etc/inetd.conf文件有关ftp的记录 项。
5.如果想为FTP用户提供压缩解压缩的功能,我们还需要将tar、gzip、compress、cpio、sh等可执行文件复制到/home /ftp/bin目录下。此外,还需要将ls命令复制到/home/ftp/bin中,以便使用者查看目录。
因为我们复制到/home/ftp/bin目录下的程序有可能是动态链接的,所以它们运行时还需要共享函数库,我们要将他们运行时需要用到的共 享库复制到/home/frp/lib目录中。检查这些命令所需要的共享库可以使用“ldd”命令。例如对于“ls”命令,我们使用“ldd /usr/bin/ls”命令就可以得到如下的输出:
# ldd /usr/bin/ls
libc.so.6 = > /lib/libc.so.6 ( 0x40003000 )
/lib/ld-linux.so.2 = > /lib/ld-linux.so.2 ( 0x00000000 )
这样,我们就需要将/lib/libc.so.6和/lib/ld-linux.so.2复制到/home/ftp/lib目录中。其它命令所 需的共享库您也可以参照上面的方法找出并复制到/home/etc/lib目录中。
接下来复制/etc/passwd和/etc/group文件到/home/ftp/etc,并删除其中任何个人用户和个人用户组的信息。基本 上应该按照下面的例子修改:
#/home/ftp/etc/passwd文件
root:*:0:0:::
bin:*:1:1:::
operator:*:11:0:::
nobody:*:99:99:::
ftp:*:1000:1000:::
# /home/ftp/etc/group文件
root::0:
bin::1:
daemon::2:
sys::3:
adm::4:
ftp::1000:
6.为了确保提供FTP服务不会给我们的系统带来安全隐患,我们还需要采取以 下措施:
# chmod 0555 /home/ftp
# chmod 0111 /home/ftp/bin/*
# chmod 0555 /home/ftp/lib/*
# chmid 0444 /home/ftp/etc/*
配置FTP服务器
在安装好wu-ftpd之后,我们还需要定制FTP服务器,使之实现我们上一节中提到的各种功能。为了使我们的FTP服务器实现这些功能,我们 需要修改ftpusers、ftpaccess、ftpconversions、xferlog、ftpgroups、ftphosts等系统配置文件。 下面我们就来看一看这些文件的功能以及配置它们的方法。
各配置文件的功能
在开始配置FTP服务器的配置文件之前,我们先来简要地介绍一下各个文件的功能。在开包后的wu-ftpd-2.5.0目录中的 doc/examples目录下,我们可以找到以下这些文件的示例。
/etc/ftpaccess 一般情况下,我们最为重视的配置文件应该是“ftpaccess”,因为该文件决定着我们FTP服务器是否能够正常工作。此外,我们还可以在这个系统参数 文件中设置多项有关使用权限记录,以及与信息有关的文件名称及路径。
/etc/ftpusers 决定哪些人不可以执行ftp命令来传输文件,这些帐号通常是root、bin、news以及guest等有特殊用途的帐户。
/etc/ftpconversions 配置该文件可以实现用户在通过FTP传输文件的同时,对文件进行压缩打包等处理。
/etc/ftphosts 决定哪些网络中的主机或某些用户不能访问FTP服务器的文件。
/etc/ftpgroups 该文件不是决定哪些用户组不能够访问FTP服务器,它只有在使用SITE GROUP功能时才有用。
/var/log/xferlog FTP日志文件。该文件将记录使用匿名帐户的用户所上传或下载的过的文件,该文件只是记录FTP信息,我们不需要对它进行配置。
大致了解了各个设置文件的功能以后,我们就来为您介绍这些文件中的内容以及学习如何配置。
配置/etc/ftpaccess文件
我们前面介绍的wu-ftpd的大多数功能都是在ftpaccess文件中设置的。我们无须自己编写该文件,doc/examples /ftpaccess.heavy是一个稍微修改一下就能适用于大多数FTP服务器的例子,所以下面我们将以这个示例文件为例为您介绍ftpaccess 文件的配置。
# wu-ftpd-2.5.0的/etc/ftpaccess示例文件ftpaccess.heavy
#
# 设置用户登录FTP服务器时,允许输错密码的次数。
# loginfails 2表示允许用户输错两次密码,如果两次都输入
# 错误的话,FTP服务器打印“repeated login failures”的信息
# 并退出FTP会话过程。如不设置,则缺省值是5。
#
loginfails 2
#
# class是用来定义用户级别的命令,它的格式为
# class <class> <typelist> <addrglob> [ <addrglob>….]
# FTP服务器上有三种类型的使用者,分别是“real”——表示
# 在该FTP服务器上有合法帐号的用户;“guest”——表示另行
# 定义的某些使用组的使用者;“anonymous”——权限最低的匿名
# 用户。有了这三种使用者以后,在ftpaccess文件中就可以根据不
# 同的使用者设置不同的存取权限。但是,只有三种定义一般是不够
# 的,我们可以根据class的语法定义更多的控制命令。例如:
# class remote real,guest,anonymous *
# 这条class语句定义了remote中有三种不同的使用者,“*”表示网络
# 上所有的计算机,也就是说任何人都可以访问FTP服务器,一般的匿名
# FTP站点都应该有这一项。如果我们希望某台主机或网域中的机器具有
# 特殊的权限,那么我们可以设置如下的class:
# class local real,guest,anonymous localhost
# 这表示本地主机的类别被定义为local,当我们从主机连上FTP服务器上
# 时,就可以用较为特别的权限。
# 下面是ftpaccess.heavy文件指定的两个class,它们的意思是来自*.domain
# 和本地主机被归为local组,而其它的主机则是remote组。
#
class local real,guest,anonymous *.domain 0.0.0.0
class remote real,guest,anonymous *
#
# 我们可以使用limit命令设置某个时间段的FTP用户数量,如果超出了
# 规定的人数,则打印/etc/msgs/msgs.toomany文件并拒绝用户登录。例如:
# limit local 20 Any /etc/msgs/msgs.roomany
# 就是限制local这个组的机器同时间内最多允许20人连接FTP服务器,如果
# 超员,则打印/etc/msgs/msgs.toomany文件,显示当前在线人数太多。ftp的
# 说明文件都可以包含变量,在说明文件中可以使用“变量替换(magic
# sookies)”以指定的字符串代替某个变量:
# %T 本地时间
# %F CWD所在分区的剩余空间
# %C 当前工作目录
# %E 定义在ftpaccess文件中维护者的电子邮件地址
# %R 远端主机名称
# %L 本地主机名称
# %U 登录时所给的用户名称
# %M 该class允许的最大使用者数目
# %N 该class目前的使用者数目
#
# 我们可以利用这些变量编辑一个显示信息非常完善的说明文件。下面的
# 例子是设置当local用户在任何时候不能超过20人,remote用户在周六
# 周日的18:00到6:00不能超过100人,否则将显示/etc/msgs目录下的
# msg.toomany文件的内容。
#
limit local 20 Any /etc/msgs/msg.toomany
limit remote 100 SaSu|Any1800-0600 /etc/msgs/msg.toomany
limit remote 60 Any /etc/msgs/msg.toomany
#
# readme命令的作用是指定用户登录或进行其它操作(如更换目录)时
# FTP服务器提示用户阅读的文件。
#
readme README* login
readme README* cwd=*
#
# messages命令主要是设置一些FTP的显示信息,如下面的“message
# /welcome.msg login”就是代表用户登录时,将显示/home/ftp目录下的
# welcome.msg作为进站画面。我们要提醒您的是FTP服务器都是以
# /home/ftp这个目录作为根目录的,所以要写成/welcome.msg。而
# “message .message cwd=*”则是定义用户在更换目录时将显示在目录
# 下的文件。
#
message /welcome.msg login
message .message cwd=*
#
# 下面定义的允许从local和remote登录的机器在传输文件时,可执行compress
# 压缩文件或使用tar命令将多个文件打包成一个文件。
#
compress yes local remote
tar yes local remote
#
# 是否允许通过SITE GROUP和SITE GPASS命令适用秘密文件
# allow use of private file for SITE GROUP and SITE GPASS?
#
private yes
#
# 设置密码检查的规则。FTP服务器将要求匿名用户使用其电子邮件
# 地址作为密码,可是有人还是会胡乱输入,所以我们可以使用passwd-check
# 来查看用户是否输入一个类似于user@hostname的E- mail地址:none表
# 示不进行密码检查; trivial表示密码必须含有“@”;而使用rfc822时,
# 表示密码必须满足rfc822规定的地址。当密码不合要求时,warn将给予
# 警告,但依然允许他们登录,而enforce则表示警告并使用户退出。
#
# passwd-check <none|trivial|rfc822> [<enforce|warn>]
passwd-check rfc822 warn
#
# log commands <typelist>记录<typelist>类型(可以是anonymous、
# guest和real)用户使用的命令。Log transfer <typelist> <directions>
# 记录<typelist>类型的用户做的<directions>(可以为inbound传进服务器、
# outbound传出服务器)方向的文件传输。
#
log commands real
log transfers anonymous,real inbound,outbound
#
# 如果shutdown<path>指定的文件存在,FTP服务器将定期检查<path>文件
# 以查看服务器是否预定关闭。<path>文件的格式为:
# <year> <month> <day> <hour> <minute> <deny_offset> <disc_offset> <text>
# <deny_offset>和<disc_offset>的意思是在服务器关闭前多长时间新的登录
# 请求和现存的连接将被拒绝和终止。<text>是对拒绝连接的用户的一段信息。
# 如:
# 1999 10 25 00:00 0010 0005
# System shutdown at %s
# 表示1999年10月25日00:00关闭FTP服务器,10分钟以前拒绝连接,5分钟
# 以前中断正在连接的FTP服务。外部程序ftpshut可以用来产生<path>文件,
# 例如上面的文件可以通过如下的命令来产生:
# ftpshut 0000
#
shutdown /etc/shutmsg
#
# 设置用户在FTP服务器上可以使用的命令,我们可以看到下面所有的
# 命令后面都是“no”,也就是说guest用户不能使用delete、overwrite、
# rename命令,而anonymous则都不能使用。只有real用户可以使用这些命令。
# all the following default to "yes" for everybody
#
delete no guest,anonymous # delete permission?
overwrite no guest,anonymous # overwrite permission?
rename no guest,anonymous # rename permission?
chmod no anonymous # chmod permission?
umask no anonymous # umask permission?
#
# 设置用户上传文件的目录。下面例子中/var/ftp目录下的/incoming目录可以
# 用来上传文件,上传文件的属主是root,组别是daemon,读取权限是0600,
# dirs表示在/incoming目录中可以创建子目录。
# specify the upload directory information
#
upload /var/ftp * no nobody nogroup 0000 nodirs
upload /var/ftp /bin no
upload /var/ftp /etc no
upload /var/ftp /incoming yes root daemon 0600 dirs
#
# 为/incoming目录设置路径别名为inc:,用户在任何时候只要使用命令
# “cd inc:”就可以到达/incoming目录。
# directory aliases... [note, the ":" is not required]
#
alias inc: /incoming
# cdpath主要定义在改变目录时使用的搜索路径。如果我们定义:
# cdpath /incoming/test、cdpath /pub、cdpath /,那么用户在任意路径
# 随便cd到一个目录,比如cd test,那么将依次搜寻:
# /incoming/test
# /pub/test
# /test
# 以寻找一个符合test目录的路径。
#
cdpath /incoming
cdpath /pub
cdpath /
#
# path-filter的功能是检查用户上传文件的文件名是否合法,如下面
# 第一条命令就是指定所有的匿名用户上传文件的文件名只能是以
# A-Z、a-z、0-9以及“._-”组成,而不能以一个“.”或是一个“-”开始。
# 如果文件名不合法,将显示/etc/pathmsg给该用户。
#
path-filter anonymous /etc/pathmsg ^[-A-Za-z0-9_.]*$ ^. ^-
path-filter guest /etc/pathmsg ^[-A-Za-z0-9_.]*$ ^. ^-
#
# 设置guest用户
# specify which group of users will be treated as "guests".
#
guestgroup ftponly
#
# FTP服务器管理员的邮件地址
#
email user@hostname
以上是一些ftpaccess常用的设置,您也可以参考ftpaccess的man pagse来获得更详细的配置信息。
配置/etc/ftpusers和/etc/ftphosts文件
通过ftpusers文件,我们可以限制系统中有哪些用户不能使用ftp服务,ftphosts文件与之类似,所不同的是该文件中记录的是不能 访问FTP服务器的主机。通常这样做的目的都是出于系统安全的考虑。Wu-ftpd 为我们准备有这两个文件的示例,我们可以在examples 目录中找到它们。下面是ftpusers文件设置的例子:
# 禁止使用FTP服务的用户
root
bin
boot
daemon
digital
field
gateway
guest
nobody
operator
ris
sccs
sys
uucp
限制这些用户使用FTP服务器主要是基于系统安全的考虑,避免权利过大的用户(如root、ftpadm)登录FTP服务器和避免使用系统命令作为 帐号(如shutdown、sync),以避免系统管理上的困惑。我们可以根据自己使用的需要,向该文件中增加或删除用户并将它复制到/etc目录中。
如果我们要架设的是匿名FTP服务器,那么通常不需要设置ftphosts文件,对于其它类型的FTP服务器可以参考 examples/ftphosts文件的格式结合自己的情况加以修改,然后复制到/etc目录中即可。下面是examples/ftphosts文件, 该文件允许网络somehost.domain中的用户ftp访问FTP服务器(somehost.domain可以是IP地址或域名)而禁止网络 otherhost.domain和网络131.211.32.*中的用户fred使用FTP服务。
#
# ftphosts文件配置示例,allow和deny的格式分别为:
# allow <username> <hostname or domain>
# deny <username> <hostname or domain>
#
# 以“#”开头的均为注释,空行将被忽略
#
allow ftp somehost.domain
deny fred otherhost.domain 131.211.32.*
配置/etc/ftpconversions文件
ftpconversions文件主要定义用户从FTP服务器中下载文件时对文件进行格式转换的规则。例如压缩、解压缩、打包和开包等操作,这 样用户就不必为.tar.gz、.tgz、.Z、.z之类的文件伤脑筋了。Ftpconversions文件的格式初看上去很复杂,不过不用担 心,/examples目录中也有该文件的例子,我们只要原封不动的将它复制到/etc目录中就能满足我们的使用需要了。下面让我们来看看 ftpconversions文件中各个记录项,有关各项的说明我们罗列在表14-1中:
#
# ftpconversions文件示例
#
#
:.Z: : :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS
: : :.Z:/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS
:.gz: : :/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP
: : :.gz:/bin/gzip -9 -c %s:T_REG:O_COMPRESS:GZIP
: : :.tar:/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR
: : :.tar.Z:/bin/tar -c -Z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS
: : :.tar.gz:/bin/tar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP
: : :.crc:/bin/cksum %s:T_REG::CKSUM
: : :.md5:/bin/md5sum %s:T_REG::MD5SUM
表1 ftpconversions文件各项说明对照表
真实文件名
目标文件名
命令操作
<filename>.Z
<filename>
传递前使用comprss –d命令压缩
<filename>.gz
<filename>
传递前使用gzip –d命令压缩
<filename>
<filename>.Z
传递前使用compress 命令压缩
<filename>
<filename>.gz
传递前使用gzip –9命令压缩
<filename>
<filename>.tar
传递前使用tar –cf命令打包
<filename>
<filename>.tar.Z
传递前使用tar –cZf命令打包并压缩
<filename>
<filename>tar.gz
传递前使用tar –czf命令打包并压缩
<directory>
<directory>.tar.Z
传递前使用tar –cZf命令对目录打包并压缩
<directory>
<directory>.tar.gz
传递前使用tar –czf命令对目录打包并压缩
Ftpconversions文件基本上把常用的压缩,打包命令都包括在内了,我们只要将它复制到/etc目录中,以后只要有人访问我们的 FTP服务器,FTP服务程序就会根据用户的需要执行压缩或打包的命令。例如,用户想下载目录Howto中所有的文件,那么他不必使用mget命令,而只 要使用get Howto.tar.gz,这时wu-ftpd就会将该目录打包压缩并发送到用户的机器上了。所以使用该文件可以完成压缩传递的数据量,减少传输时间等作 用。此外ftpconversions文件中定义的可执行文件的位置/bin指的都是/home/ftp/bin而不是Lnux /目录下的bin,所以请检查/home/ftp/bin目录中有无上述命令,如果没有还需要将这些程序复制到该目录中。
截止到这里,匿名FTP服务器的架设工作基本上就完成了,我们可以用ftp命令连接自己的服务器,检查合法用户和匿名用户的连接情况以及各个目 录的权限是否正确。之后就可以准备FTP服务的开张了。
查看全部更多资料去591cto
‘贰’ 请教Qt5下qtftp的编译问题
注意编译器一定枝唤键要和MYSQL的平台链裤版本一致,32位的用32位的编译猛巧器编译,64位的用64位的编译器编译。 准备工作:MYSQL的目录:D:\SQL_Server\mariadb Qt5.1.1
‘叁’ C# ASP.net FTP上传功能本地编译没问题,网站发布后通过网址访问再用此功能报404错误
404 错误意味着链接指向的网页不存在,即原始网页的URL失效,这种情况经常会发生,很难避免,比如说:网页URL生成规则改变、网页文件更名或移动位置、导入链接拼写错误等,导致原来的URL地址无法访问;当Web 服务器接到类似请求时,会返回一个404 状态码,告诉浏览器要请求的资源并不存在。
导致这个错误的原因一般来说,有三种:
1、无法在所请求的端口上访问Web站点。
2、Web服务扩展锁定策略阻止本请求。
3、MIME映射策略阻止本请求。
解决办法:
1. 对于存在的网页内容由于路径改变而导致访问不了时,可在IIS 中定义404错误指向一个动态页面,在页面里面使用301永久重定向跳转到新的地址,此时服务器返回301状态码。
2、设置404指向一个设计好的html文件,
此时页面返回的404状态码。
idc提供商基本都提供404设置的功能,直接上传文件设置即可。在IIs中设置方法:打开IIS管理器-->点击要设置自定义404的网站的属性
-->点击自定义错误选项-->选中404页-->选中并打开编辑属性-->设置成 URL --> URL
里填写“/err404.html”-->按确定退出再把做好的err404.html
页面上传到网站根目录下。此处在“消息类型”中一定要选择“文件”或“默认值”,而不要选择“URL”,不然,将导致返回“200”状态码。
3、404指向一个动态页面,
比如error.asp,如果不在页面里面进行设置,仅仅是返回提示的HTML 代码,将导致页面返回200
状态码,这是不正确的,我们可以在显示完提示内容后,增加语句: Response.Status="404 Not Found"
,这样就保证页面返回404状态码。
4、Apache下设置404错误页面。为Apache Server设置404错误页面的方法很简单,只需在.htaccess 文件中加入如下内容即可,ErrorDocument 404 /notfound.php
‘肆’ 高分求Delhpi编译的FTP源代码!~~
Delphi FTP例子源码
unit TransferThread;
/////////////////////////////////////陪谈////////////////////////////启差///////////////
// 模块说明: FTP传输核心模块类
// 功能: 指定一个下载悄乱皮(上传)的日期或文件名,系统执行传输功能(支持续传)
// 备注:该模块属于传输类的一个子线程模块.
////////////////////////////////////////////////////////////////////////////////
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ComCtrls,StdCtrls,IniFiles,IdIntercept, IdLogBase, IdLogEvent, IdAntiFreezeBase,
IdAntiFreeze, IdFTPList,IdBaseComponent,IdGlobal,IdComponent, IdTCPConnection, IdTCPClient,IdFTPCommon,
IdFTP;
type
TTransferThread = class(TObject)
private
{ Private declarations }
//进度显示
FProgressbar:TProgressbar;
//上传核心组件
FFTP:TIdFTP;
//上传列表内部类
FCombobox:TCombobox;
//上传信息显示
FLabel:TLabel;
//FTP地址
FFTP_STR_HOST:String;
//FTP用户名
FFTP_STR_USN:String;
//FTP用户密码
FFTP_STR_PWD:String;
//FTP端口
FFTP_STR_PORT:String;
//FTP上传标记
FFTP_STR_UTAG:String;
//FTP下载标记
FFTP_STR_DTAG:String;
//FTP指定的文件夹
FFTP_STR_FLODER:STring;
//传输文件大小
FFTP_LWD_BYTES:LongWord;
//传输开始时间
FFTP_DT_BEGINTIME:TDateTime;
//传输速度
FFTP_DUB_SPEED:Double;
//是否删除源文件.
FFTP_BOL_DEL:Boolean;
//是否正在传输文件
FFTP_BOL_ISTRANSFERRING:Boolean;
//类内部通用对话框函数
function MsgBox(Msg:string;iValue:integer):integer;
//获取用户当前的Windows临时文件夹
function GetWinTempPath:String;
//根据日期生成的日期文件名
function DateToFileName(DateTime:TDateTime):String;
//根据上传/下载标记生成完整的文件名
function GetFileFullName(sTag:String;DateTime:TDateTime):String;
protected
//传输核心函数
function TransferKernel(iTag:Integer;sFile:string;bDelSFile:boolean=False):boolean;
//传输组件的WorkBegin事件
procere FFTPOnWorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
//传输组件的WorkEnd事件
procere FFTPOnWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
//传输组件的Work事件
procere FFTPOnWork(Sender: TObject; AWorkMode: TWorkMode;const AWorkCount: Integer);
public
//构造函数
constructor Create;
//析构函数
destructor Destroy;
//进度条控件属性
property Progressbar:TProgressbar read FProgressbar write FProgressbar default nil;
//列表控件属性
property Combobox:TCombobox read FCombobox write FCombobox default nil;
//只读的FTP核心组件
property FTP:TidFTP read FFTP;
//标签控件
property oLabel:TLabel read FLabel write FLabel default nil;
//列表方法(该方法需要指定Combobox,否则无效)
procere List;
//依据日期下载文件
procere DownLoad(dDate:TDateTime);overload;
//依据文件名下载文件
procere DownLoad(sFileName:String);overload;
//依据日期上传文件
procere UpLoad(dDate:TDateTime);overload;
//依据文件名上传文件
procere UpLoad(sFileName:String);overload;
// procere Execute; override;
end;
implementation
constructor TTransferThread.Create;
var
FFini:TIniFile;
FFilePath:String;
begin
//完成FTP相关参数的读取.
FFTP_BOL_ISTRANSFERRING:=False;
Try
FFilePath:=ExtractFilePath(APPlication.exeName)+'setup.ini';
FFini:=TIniFile.Create(FFilePath);
FFTP_STR_HOST:=FFini.ReadString('文件传输','服务器地址','');
FFTP_STR_PORT:=FFini.ReadString('文件传输','服务器端口','');
FFTP_STR_USN:=FFini.ReadString('文件传输','用户名','');
FFTP_STR_PWD:=FFini.ReadString('文件传输','密码','');
FFTP_STR_FLODER:=FFini.ReadString('文件传输','文件夹','');
FFTP_STR_UTAG:=FFini.ReadString('文件传输','上传标识码','');
FFTP_STR_DTAG:=FFini.ReadString('文件传输','上传标识码','');
FFTP_BOL_DEL:=FFini.ReadBool('文件传输','删源文件',FALSE);
FFIni.Free;
Except
MsgBox('读取FTP连接配置信息失败!请检查您的Setup.ini文件.',MB_OK+MB_ICONERROR);
Exit;
Abort;
End;
//设置FTP相关参数
Try
FFTP:=TIdFTP.Create(nil);
FFTP.Host:=FFTP_STR_HOST;
FFTP.Port:=strtoint(FFTP_STR_PORT);
FFTP.UserName:=FFTP_STR_USN;
FFTP.Password:=FFTP_STR_PWD;
FFTP.TransferType:=ftASCII;
//事件驱动
FFTP.OnWork:=FFTPOnWork;
FFTP.OnWorkBegin:=FFTPOnWorkBegin;
FFTP.OnWorkEnd:=FFTPOnWorkEnd;
FFTP.Connect(True,-1);
Except
MsgBox('连接远程FTP服务器失败!'#10#13'1.服务器地址错误,或服务器不可用.'#10#13'2.用户名或密码不正确.'#10#13'3.FTP服务端口设置不正确.',MB_OK+MB_ICONERROR);
Exit;
Abort;
End;
end;
function TTransferThread.DateToFileName(DateTime: TDateTime): String;
var
Year, Month, Day:Word;
sYear,sMonth,sDay:String;
begin
DecodeDate(DateTime, Year, Month, Day); //日期
sYear:=inttostr(Year);
sMonth:=inttostr(Month);
sDay:=inttostr(Day);
//年
case Length(sYear) of
4: sYear:=sYear;
3: sYear:='0'+sYear;
2: sYear:='00'+sYear;
1: sYear:='000'+sYear;
else
sYear:='';
end;
//月
case Length(sMonth) of
2: sMonth:=sMonth;
1: sMonth:='0'+sMonth;
else
sMonth:='';
end;
//日
case Length(sDay) of
2: sDay:=sDay;
1: sDay:='0'+sDay;
else
sDay:='';
end;
if (sYear='') or (sMonth='') or (sDay='') then
begin
Result:='';
Exit;
end;
if (sYear<>'') and (sMonth<>'') and (sDay<>'') then
begin
Result:=sYear+sMOnth+sDay;
end;
end;
destructor TTransferThread.Destroy;
begin
FProgressbar:=nil;
FCombobox:=nil;
FLabel:=nil;
FFTP.Quit;
FFTP.Free;
end;
procere TTransferThread.DownLoad(dDate: TDateTime);
begin
if Not FFTP_BOL_ISTRANSFERRING then
begin
TransferKernel(1,GetFileFullName(FFTP_STR_DTAG,dDate),FFTP_BOL_DEL);
end;
end;
procere TTransferThread.DownLoad(sFileName: String);
begin
if Not FFTP_BOL_ISTRANSFERRING then
TransferKernel(1,sFileName,FFTP_BOL_DEL);
end;
procere TTransferThread.FFTPOnWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
var
S,E: String;
H, M, Sec, MS: Word;
TotalTime: TDateTime;
DLTime: Double;
begin
TotalTime := Now - FFTP_DT_BEGINTIME; //总用时
DecodeTime(TotalTime, H, M, Sec, MS); //取出时\分\秒\毫秒
Sec := Sec + M * 60 + H * 3600; //转换成秒
DLTime := Sec + MS / 1000; //最终的下载时间
E:= Format(' 使用时间:%2d:%2d:%2d', [Sec div 3600, (Sec div 60) mod 60, Sec mod 60]);
if DLTime > 0 then
//每秒的平均速度:XX K/s
FFTP_DUB_SPEED := {(AverageSpeed + }(AWorkCount / 1024) / DLTime{) / 2};
if FFTP_DUB_SPEED > 0 then
begin
Sec := Trunc(((FFTP_LWD_BYTES - AWorkCount) / 1024) / FFTP_DUB_SPEED);
S := Format(' 剩余时间:%2d:%2d:%2d', [Sec div 3600, (Sec div 60) mod 60, Sec mod 60]);
S:='速度: ' + FormatFloat('0.00 KB/秒',FFTP_DUB_SPEED) + S + E ;
end
else
S:='';
if (FLabel<>nil) and (assigned(FLabel)) then
begin
FLabel.AutoSize:=True;
FLabel.Caption:=S;
FLabel.Update;
end;
if (FProgressBar<>nil) and (assigned(FProgressBar)) then
begin
FProgressBar.Position:=AWorkCount; //进度显示
FProgressBar.Update;
end;
end;
procere TTransferThread.FFTPOnWorkBegin(Sender: TObject;
AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
FFTP_BOL_ISTRANSFERRING:=True;
FFTP_DT_BEGINTIME:=Now; //开始时间
FFTP_DUB_SPEED:=0.0; //初始化速率
if (FProgressBar<>nil) and (assigned(FProgressBar)) then
begin
if AWorkCountMax>0 then
begin
FProgressBar.Max:=AWorkCountMax;
FFTP_LWD_BYTES:=FProgressBar.Max;
end
else
FProgressBar.Max:=FFTP_LWD_BYTES;
end;
end;
procere TTransferThread.FFTPOnWorkEnd(Sender: TObject;
AWorkMode: TWorkMode);
begin
FFTP_BOL_ISTRANSFERRING:=False;
FFTP_DUB_SPEED:=0.00;
if (FLabel<>nil) and (assigned(FLabel)) then
begin
FLabel.AutoSize:=True;
FLabel.Caption:='';
FLabel.Update;
end;
if (FProgressBar<>nil) and (assigned(FProgressBar)) then
begin
FProgressBar.Position:=0;
end;
end;
function TTransferThread.GetFileFullName(sTag:String;DateTime:TDateTime):String;
begin
Result:=sTag+DateToFileName(DateTime)+'FD.HXD';
end;
function TTransferThread.GetWinTempPath: String;
var
TempDir:array [0..255] of char;
begin
GetTempPath(255,@TempDir);
Result:=strPas(TempDir);
end;
procere TTransferThread.List;
var
Dir_List:TStringList;
FoundFolder:Boolean;
iCount:Integer;
begin
if (FCombobox=nil) or (Not Assigned(FCombobox)) then
begin
Exit;
Abort;
end;
Dir_List:=TStringList.Create; //创建字符串行表类
Try
if Not FFTP.Connected then FFTP.Connect;
FFTP.ChangeDir('/');//根目录 //到服务器的根目录
FFTP.List(Dir_List,'',True); //获取目录列表
FoundFolder:=False;
FFTP.TransferType:=ftASCII; //更改传输类型(ASCII类型)
for iCount:=0 to Dir_List.Count-1 do
begin
if FFTP.DirectoryListing.Items[iCount].ItemType=ditDirectory then
begin
if Dir_List.IndexOf(FFTP_STR_FLODER)= -1 then //判断该文件夹不存在
begin
//如果不存继续循环查找.
Continue;
end
else
begin
//如果存在,则直接退出循环
FoundFolder:=True;
Break;
end;
end;
end;
if FoundFolder then //判断该文件夹不存在
begin
FFTP.MakeDir(FFTP_STR_FLODER); //不存在,则创建一个新的文件夹
end;
FFTP.ChangeDir(FFTP_STR_FLODER);
FFTP.List(Dir_List,'*.HXD',False);
if Dir_List.Count>0 then
begin
FCombobox.Items:=Dir_List;
end;
Finally
Dir_List.Free;
End;
end;
function TTransferThread.MsgBox(Msg: string; iValue: integer): integer;
begin
Result:=MessageBox(application.Handle,pChar(Msg),'系统信息',iValue+MB_APPLMODAL);
end;
function TTransferThread.TransferKernel(iTag: Integer; sFile: string;
bDelSFile: boolean): boolean;
var
sTmpPath:String;
Dir_List:TStringList;
FoundFolder:Boolean;
iCount:Integer;
begin
sTmpPath:=GetWinTempPath; //获取本地系统临时目录
Dir_List:=TStringList.Create; //创建字符串行表类
Try
if Not FFTP.Connected then FFTP.Connect;
FFTP.ChangeDir('/');//根目录 //到服务器的根目录
FFTP.TransferType:=ftASCII; //更改传输类型(ASCII类型)
FFTP.List(Dir_List,'',True); //获取目录列表
FoundFolder:=False;
for iCount:=0 to Dir_List.Count-1 do
begin
if FFTP.DirectoryListing.Items[iCount].ItemType=ditDirectory then //是目录
begin
if Dir_List.IndexOf(FFTP_STR_FLODER)= -1 then //判断该文件夹不存在
begin
//如果不存继续循环查找.
Continue;
end
else
begin
//如果存在,则直接退出循环
FoundFolder:=True;
Break;
end;
end;
end;
if FoundFolder then //判断该文件夹不存在
begin
FFTP.MakeDir(FFTP_STR_FLODER); //不存在,则创建一个新的文件夹
end;
//更改传输类型
FFTP.TransferType:=ftBinary;
Try
//找到相应的目录,则更换路径.
FFTP.ChangeDir(FFTP_STR_FLODER);
//0为上传
if iTag=0 then
begin
Try
FFTP.Put(sTmpPath+sFile,sFile);
Except
MsgBox('上传文件失败!原因如下:'#13#10'1.服务器没有开启写文件的权限!'#10#13'2.程序发生异常,请重新上传!',MB_OK+MB_ICONERROR);
Abort;
End;
FFTP_LWD_BYTES:=FFTP.Size(sFile);
if bDelSFile then //删除本地源文件
begin
DeleteFile(sTmpPath+sFile);
end;
Result:=True;
FFTP.Disconnect;
end;
//1为下载
if iTag=1 then
begin
//文件已经存在
Try
FFTP_LWD_BYTES:=FFTP.Size(sFile);
if FileExists(sTmpPath+sFile) then
begin
case MsgBox('文件已经存在,要续传吗?'#13#10'是--续传'#10#13'否--覆盖'#13#10'取消--取消操作',MB_YESNOCANCEL+MB_ICONINFORMATION) of
IDYES: begin
FFTP_LWD_BYTES:=FFTP_LWD_BYTES-FileSizeByName(sTmpPath+sFile);
//参数说明: 源文件,目标文件,是否覆盖,是否触发异常(True为不触发)。
FFTP.Get(sFile,sTmpPath+sFile,False,True);
end;
IDNO: begin
FFTP.Get(sFile,sTmpPath+sFile,True);
end;
IDCANCEL:
begin
FFTP_BOL_ISTRANSFERRING:=False;
end;
end;
end
else //文件不存在
begin
FFTP.Get(sFile,sTmpPath+sFile,True);
end;
Except
MsgBox('上传文件失败!原因如下:'#13#10'1.服务器没有开启写文件的权限!'#10#13'2.程序发生异常,请重新上传!',MB_OK+MB_ICONERROR);
Abort;
End;
if bDelSFile then //删除远程源文件
begin
FFTP.Delete(sFile);
end;
FFTP.Disconnect;
end;
Except
FFTP.Quit;
Result:=False;
End;
Finally
Dir_List.Free;
End;
end;
procere TTransferThread.UpLoad(dDate: TDateTime);
begin
if Not FFTP_BOL_ISTRANSFERRING then
TransferKernel(0,GetFileFullName(FFTP_STR_DTAG,dDate),FFTP_BOL_DEL);
end;
procere TTransferThread.UpLoad(sFileName: String);
begin
if Not FFTP_BOL_ISTRANSFERRING then
TransferKernel(0,sFileName,FFTP_BOL_DEL);
end;
end.
‘伍’ linux下搭建ftp服务器
linux下搭建ftp服务器
下面我就为大家整理了一些Linux认证复习备考资料。希望大家可以从中学习答题方法,让自己的得到进步!最近为了方便目标板与PC机上LINUX之间的通讯,就在LINUX搭建了FTP,工作不难,写个总结。主要经过以下几个步骤:
1.检查是否安装了vsftpd服务器
可以用rpm -q vsftpd命令来查看,若显示"vsftpd-1.1.3-8",则说明系统已经安装vsftpd服务器,若没有则可以在图形环境下单击"主菜单→系统设置→添加删除应用程序"菜单项,在出现的"软件包管理"对话框里确保选中"FTP服务器"选项,然后单击"更新"按钮,按照屏幕提示插入第3张安装光盘即可开始安装。
2.启动/重新启动/停止vsftpd服务
从Red Hat Linux 9.0开始,vsftpd默认只采用standalone方式启动vsftpd服务,方法是在终端命令窗口运行以下命令:
[root@ahpeng root] /etc/rc.d/init.d/vsftpd start
重新启动vsftpd服务:
[root@ahpeng root] /etc/rc.d/init.d/ vsftpd restart
关闭vsftpd服务:
[root@ahpeng root] /etc/rc.d/init.d/ vsftpd stop
3.vsftpd的配置
在Red Hat Linux 9.0里的vsftpd共有3个配置文件,它们分别是:
vsftpd.ftpusers:位于/etc目录下。它指定了哪些用户账户不能访问FTP服务器,例如root等。
vsftpd.user_list:位于/etc目录下。该文件里的用户账户在默认情况下也不能访问
FTP服务器,仅当vsftpd .conf配置文件里启用userlist_enable=NO选项时才允许访问。
vsftpd.conf:位于/etc/vsftpd目录下。它是一个文本文件,我们可以用Kate、Vi等文本编辑工具对它进行修改,以此来自定义用户登录控制、用户权限控制、超时设置、服务器功能选项、服务器性能选项、服务器响应消息等FTP服务器的配置。
(1)用户登录控制
anonymous_enable=YES,允许匿名用户登录。
no_anon_password=YES,匿名用户登录时不需要输入密码。
local_enable=YES,允许本地用户登录。
deny_email_enable=YES,可以创建一个文件保存某些匿名电子邮件的黑名单,以防止这些人使用Dos攻击。
banned_email_file=/etc/vsftpd.banned_emails,当启用deny_email_enable功能时,所需的电子邮件黑名单保存路径(默认为/etc/vsftpd.banned_emails)。
(2)用户权限控制
write_enable=YES,开启全局上传权限。
local_umask=022,本地用户的上传文件的umask设为022(系统默认是077,一般都可以改为022)。
anon_upload_enable=YES,允许匿名用户具有上传权限,很明显,必须启用write_enable=YES,才
可以使用此项。同时我们还必须建立一个允许ftp用户可以读写的目录(前面说过,ftp是匿名用户的映射用户账号)。
anon_mkdir_write_enable=YES,允许匿名用户有创建目录的权利。
chown_uploads=YES,启用此项,匿名上传文件的属主用户将改为别的用户账户,注意,这里建议不要指定root账号为匿名上传文件的属主用户!
chown_username=whoever,当启用chown_uploads=YES时,所指定的属主用户账号,此处的whoever自然要用合适的用户账号来代替。
chroot_list_enable=YES,可以用一个列表限定哪些本地用户只能在自己目录下活动,如果chroot_local_user=YES,那么这个列表里指定的用户是不受限制的。
chroot_list_file=/etc/vsftpd.chroot_list,如果chroot_local_user=YES,则指定该列表(chroot_local_user)的保存路径(默认是/etc/vsftpd.chroot_list)。
nopriv_user=ftpsecure,指定一个安全用户账号,让FTP服务器用作完全隔离和没有特权的独立用户。这是vsftpd系统推荐选项。
async_abor_enable=YES,强烈建议不要启用该选项,否则将可能导致出错!
ascii_upload_enable=YES;ascii_download_enable=YES,默认情况下服务器会假装接受ASCⅡ模式请求但实际上是忽略这样的'请求,启用上述的两个选项可以让服务器真正实现ASCⅡ模式的传输。
(注意:启用ascii_download_enable选项会让恶意远程用户们在ASCⅡ模式下用"SIZE/big/file"这样的指令大量消耗FTP服务器的I/O资源。)
这些ASCⅡ模式的设置选项分成上传和下载两个,这样我们就可以允许ASCⅡ模式的上传(可以防止上传脚本等恶意文件而导致崩溃),而不会遭受拒绝服务攻击的危险。
(3)用户连接和超时选项
idle_session_timeout=600,可以设定默认的空闲超时时间,用户超过这段时间不动作将被服务器踢出。
data_connection_timeout=120,设定默认的数据连接超时时间。
(4)服务器日志和欢迎信息
dirmessage_enable=YES,允许为目录配置显示信息,显示每个目录下面的message_file文件的内容
ftpd_banner=Welcome to blah FTP service,可以自定义FTP用户登录到服务器所看到的欢迎信息。
xferlog_enable=YES,启用记录上传/下载活动日志功能。
xferlog_file=/var/log/vsftpd.log,可以自定义日志文件的保存路径和文件名,默认是/var/log/vsftpd.log.
知道了上面各个选项的含义,你可以根据自己的需要进行配置,达部分的选项一般用不着改动,配置完了以后,确认vsftpd服务已经启动后,我们可以在Windows主机的S命令窗口里输入"ftp Addres"(用实际的FTP服务器IP地址或者域名代替Addres),注意用户名、密码都是ftp(ftp是匿名用户的映射用户账号)。
如果登陆不上,可以试验在LINUX下本地登陆看看,还有可以在LINUX登陆WINDOWS下的FTP,试验能否登陆成功,如果可以,那很有可能登陆不上LINUX下的FTP的原因是LINUX的防火墙的原因,可以用rpm -q vsftpd命令来查看,如果防火墙开启,可以用命令把其关闭,也可以在图形界面下"主菜单"中的"system settings"中选择"seurity level",安装系统的时候如果没有改动,默认是的seurity level是"Medium",你可以不改动该设置,选中下面"allow incomning"中的"FTP",当然你也可以设置seurity level为"NO firewall",这样再在Windows下登陆LINUX的FTP,应该可以登陆了。
登陆后具体ftp下的操作就参考有关ftp的命令了,登陆后的路径为/var/ftp/pub,把你所需要操作的文件可以放在该目录下,我这里用付ftp主要是在下载linux编译后的文件到板子上,上传文件到LINUX上一般不用通过ftp,注意你在ftp下对文件进行一些操作的时候很可能被fail掉,注意根据情况设置文件的操作权限。
;‘陆’ 编译一个shell脚本,ftp到主机 新建目录 拷贝文件 删除目录 退出
首先,陪首脚本并不需要知道本身所在主机的IP,所以,用不到10.10.141.91这个源地址。
再次,ftp命令中不支持直接在服务器端新建文件,只能先在本地源裂新建后上传。其实,ftp客户端软件,如CuteFTP也都是这么做的,只是你觉察不到。
#!/bin/bash
host="10.10.142.72"
username="xxxx"
#这里写你的FTP登录用户名
password="xxxxxxx"
#这里写你的FTP登录密码
file1="testexam1"
file2="testexam2"
touch
$file1
touch
$file2
(
ftp
-ni
$host
<<EOF
quote
USER
$username
quote
PASS
$password
cd
/home/query
#切换服务器目录
binary
put
$file1
put
$file2
lcd
/home/query
#切换本雹乱闭地目录
get
$file1
delete
$file1
bye
EOF
)
>/dev/null
2>err.log
‘柒’ 设置linux的ftp需要安装软件吗
不需要软件,直接使用ftp
#man ftp
用上面的命令看ftp使用手册
---------
名称 (NAME)
ftp - Internet 文件传输程序 (file transfer program)
概述 (SYNOPSIS)
ftp [-pinegvd] [host] pftp [-inegvd] [host]
说明 (DESCRIPTION)
用户通过 Ftp 这个程序来使用 Internet 上的标准文件传输协议 (File Transfer Protocol). 本程序允许用户向远端网站发送文件, 或从远端网站接收文件.
参数选项可以在命令行启动ftp时指定, 也可以在ftp命令解释模式下输入.
-p 使用被动模悄尘式进行数据传输. 如果你本地网络有防火墙, 外部主机不能连接到你这个客户端, 这个选项就派上用场了. 本选项要求 ftp 服务器支持 PASV 命令. 如果使用 pftp 从命令行启动 ftp, 本选项是默认打开的.
-i 进行多个文件传输时关掉交互式的确认提示.
-n 一般,在启动 ftp 时, ftp 会试着进行自动登录. 本选项可以关掉这个功能. 如果 auto-login 功能被启用的话, ftp 会在用户 home 目录下的 .netrc (参阅 netrc(5)) 文件中查找远端主机上的用户帐号. 如果 .netrc 文件中用户帐号这一项不存在, ftp 会提示用户输入远端主机上的登录名 (缺省为用户在本地机器上的帐号), 如果需要, 还会提示你输入密码和用来登录的帐号. ??
(译者注: 使用本选项, 可以实现所谓的 "非交互式登录". 你可以试试下面这条命令:
echo open ftp_server "\n" user my_name my_password "\n" dir "\n" bye | ftp -n 不能使用 rcp 的时候, 可以用这条启和禅 ftp 命令来代
替.)
-e 如果被编译成了 ftp 可执行格式, 本选项会关掉命令编辑和历史命令功能; 否则什么也不做. ??
-g 关掉文件名匹配功能.
-v 显示详细信息. 本选项使得 ftp 显示远端服务器的所有响应, 并在数据传输完成后显示传输数据的统计信息.
-d 打开 debug 模式.
从命令行启动 ftp 时, 可指定欲与之通讯的远端主机. 如果指定了, ftp 会立即尝试与远端 FTP 服务器建立连接; 否则, ftp 会进入其命令解释模式, 等待用户进一棚租步的指令. ftp 在等待用户指令时, 会显示提示符 `ftp>'
-------
补充的问题看不明白
不同的linux有不同的软件包管理方式
‘捌’ 请问我在易语言中用了FTP上传这个功能。那我这个软件编译后是不是很容易被破解就是破解到我的虚拟主
只要是在你的软件里面进行FTP连接登陆,不管你的软件怎么如型加密怎么保做罩护都没有用,总是要发送数据连接FTP的,人家一抓包就抓出你渣胡猜登陆的账号和密码了。
‘玖’ FTP可以编译,这个编译和不编译有什么区别
回答饥册余:在eclipse 出错的时候 或姿带是你的jvm没有正确烂滚引入的时候。。解决办法 右键 项目 build path -> config....-> Libraries 把你的jdk remove 再引入就好了