c程序实现ftp的自动登陆,可在uclinux下有问题,请指教

发表于:2007-05-26来源:作者:点击数: 标签:
:shock:代码如下: #includestdio.h #includeunistd.h main(intargc,char**argv) { FILE*fp; fp=popen("ftp-invx.x.x.x","w"); if(fp==NULL) { perror("popen"); exit(1); } fprintf(fp,"useranonymous@\n"); [color=red:3d6e418bac][i:3d6e418bac]fprintf(f

:shock: 代码如下:
#include<stdio.h>  
#include<unistd.h>  
 main(int argc,char **argv)  
{  
 
  FILE *fp;  
  fp=popen("ftp -inv x.x.x.x","w");  
  if(fp==NULL)  
  {  
    perror("popen");  
    exit(1);  
  }  
  fprintf(fp,"user anonymous  @\n");  
  [color=red:3d6e418bac][i:3d6e418bac]fprintf(fp,"ls\n");[/i:3d6e418bac][/color:3d6e418bac] 
  pclose(fp);  
  printf("ok\n");  

  在linux下执行没有问题,可在uclinux下执行的结果如下:
Connected to x.x.x.x
220 hd FTP server (Version wu-2.6.2-5) ready.
331 Guest login ok, send your complete e-mail address as password.
230 Guest login ok, aclearcase/" target="_blank" >ccess restrictions apply.
[color=red:3d6e418bac]?Invalid command[/color:3d6e418bac] 
 221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 231 bytes in 0 transfers.
221-Thank you for using the FTP service on hd.
221 Goodbye.
ok
其中红颜色这一句是不是说代码中的'ls'命令,无法识别呢?该如何修改,望大虾指点。

 flyingbxf 回复于:2003-12-16 15:24:59
下面是在linux下运行的情况:
Connected to 61.135.129.120 (61.135.129.120).
220 hd FTP server (Version wu-2.6.2-5) ready.
331 Guest login ok, send your complete e-mail address as password.
230 Guest login ok, access restrictions apply.
[color=blue:d31b7c2816]227 Entering Passive Mode (61,135,129,120,73,67)
150 Opening ASCII mode data connection for directory listing.
total 40
d--x--x--x   2 root     523          4096 Jan 14  2003 bin
d--x--x--x   2 root     523          4096 Jan 14  2003 etc
drwxr-xr-x   2 root     523          4096 Jan 14  2003 lib
drwx-wx-wx 140 523      523          8192 Dec 13 05:41 pub
226 Transfer complete.[/color:d31b7c2816]
221-You have transferred 0 bytes in 0 files.
221-Total traffic for this session was 416 bytes in 0 transfers.
221-Thank you for using the FTP service on hd.
221 Goodbye
ok

 shxliang 回复于:2003-12-16 17:34:13
u can creat a 'XXX.sh' function, and use the 'system()' .

 shxliang 回复于:2003-12-16 17:35:18


 flyingbxf 回复于:2003-12-17 08:52:26
[quote:c83f63b477="shxliang"]u can creat a 'XXX.sh' function, and use the 'system()' .[/quote:c83f63b477]
大虾:能不能详细点?'XXX.sh' 完成什么工作?用脚本写?可是uclinux的sh 不支持管道的阿

 flyingbxf 回复于:2003-12-17 08:55:05
[quote:cef471cfd3="shxliang"]u can creat a 'XXX.sh' function, and use the 'system()' .[/quote:cef471cfd3]
大虾:能不能详细点?'XXX.sh' 完成什么工作?用脚本写?可是uclinux的sh 不支持管道的阿

 shxliang 回复于:2003-12-22 20:56:52
你应该知道脚本怎样实现自动ftp吧,
你内核编译的时候加上busybox就可以了,把默认的shell改成sh,而不是sash,
或者你用c 来实现管道也可以啊!

 shxliang 回复于:2003-12-22 20:57:41
你应该知道脚本怎样实现自动ftp吧,
你内核编译的时候加上busybox,把默认的shell改成sh,而不是sash,就可以了
当然,用system()也可以了,
或者你用c 来实现管道也可以啊!

 flyingbxf 回复于:2003-12-23 09:01:34
[quote:5abeb761d8="shxliang"]你应该知道脚本怎样实现自动ftp吧,
你内核编译的时候加上busybox,把默认的shell改成sh,而不是sash,就可以了
当然,用system()也可以了,
或者你[color=red:5abeb761d8]用c 来实现管道[/color:5abeb761d8]也可以啊![/quote:5abeb761d8]

脚本登陆我是知道的,试验成功了。但我就是想用C语言来实现。上面的程序中popen不是创建管道吗?我就是奇怪啊,上面的C程序为什么不能在uClinux下实现?按说C程序编译后,用不到shell了啊!

 shxliang 回复于:2003-12-23 11:30:03
uclinux 确实不支持管道,也不支持重定向(默认),
我现在没有uclinux环境来做实验,

你先照我说的,加上重定向试试,
当你用make menuconfig将busybox编译进去之后,
把默认sash改成sh后shell提示符不再是#了,好像是\>了.可以验证一下.
用脚本来实现自动ftp,然后在system函数中调用这个脚本.

 flyingbxf 回复于:2003-12-23 17:06:53
[quote:17fa878edc="shxliang"]uclinux 确实不支持管道,也不支持重定向(默认),
当你用make menuconfig将busybox编译进去之后,
把默认sash改成sh后shell提示符不再是#了,好像是\>了..........[/quote:17fa878edc]

现在的shell提示符也是[color=red:17fa878edc]\>[/color:17fa878edc]。主要是我现在在做一个项目,内核是别人帮我编译好的,不敢随便动啊。菜菜啦!
 另外,问一个C语言编程的问题,能不能用fopen函数建立一个,文件名是[color=red:17fa878edc]变量[/color:17fa878edc]的文件啊。也就是说正常情况下:
[color=blue:17fa878edc]stream = fopen("DUMMY.FIL", "w+"); [/color:17fa878edc]

能不能将DUMMY.FIL换成变量啊?比方说
char *pf;
stream =fopen (pf, "w+");

 shxliang 回复于:2003-12-25 21:56:15
那你这样应该可以了!
#include<stdio.h>
#include<unistd.h>
main(int argc,char **argv)
{

FILE *fp;
fp=popen("ftp -inv","w");
if(fp==NULL)
{
perror("popen");
exit(1);
}
fprintf(fp,"open 192.168.2.3\n");
fprintf(fp,"user anonymous @\n");
fprintf(fp,"ls\n");
pclose(fp);
printf("ok\n");
}

 飞灰橙 回复于:2003-12-25 22:26:24
[quote:9e6e49afa4="shxliang"]uclinux 确实不支持管道,也不支持重定向(默认),
我现在没有uclinux环境来做实验,
[/quote:9e6e49afa4]

uClinux还是支持管道的,pipe和dup都可以正常调用,
可以去一试便知。
你说的管道必定是指sash里没法用|了。

 flyingbxf 回复于:2003-12-26 09:17:20
是不是因为这样:
(taken from popen man page:)

"The popen() function opens a process by creating a pipe, forking, and invoking the shell."

uClinux是不能用fork的,但popen默认的是用fork来创建子进程。所以会出现同样的程序在linux下可以运行,在uC下就不能运行了。

 shxliang 回复于:2003-12-26 11:28:37
uclinux 可以用fork,但是功能和vfork一样,

飞灰橙大哥说的极是,我说重定向和管道是指sash不支持
但c可以实现,
上面的ftp代码不知道你试过没有,应该没有问题的,(:

 flyingbxf 回复于:2003-12-26 12:20:28
shxliang大哥(小弟?:)俺22),别忙着生气,我编译了还没运行,代回给你会话

 flyingbxf 回复于:2003-12-26 14:18:03
[quote:c20655c8db="shxliang"]uclinux 可以用fork,但是功能和vfork一样,

飞灰橙大哥说的极是,我说重定向和管道是指sash不支持
但[color=red:c20655c8db]c可以实现[/color:c20655c8db],
上面的ftp代码不知道你试过没有,应该没有问题的,(:[/quote:c20655c8db]

 :em02: 可以实现了,shxliang大哥说的没错。但我觉得跟上面的那个程序没有太大的不同啊,能说一下原委吗?

 shxliang 回复于:2003-12-26 21:02:28
我原来是想自己pipe一个管道,但没试,(:
其实原理还是一样的,你可以看一下popen的源码.

我以前做的时候,是用脚本来的,开头也是不行,
郁闷了很久,后来问了高手才解决的.
要学的东西太多了,楼上的飞灰橙应该是高手,呵呵

你现在在作什么?

 flyingbxf 回复于:2003-12-27 11:00:18
俺在做嵌入式,呵呵,学习ing…… 啥都不懂。
再问你一个问题:不管用何种方式登陆ftp,其返回信息都是直接在屏幕上输出的,我如何能在程序中截取这些信息,以判断文件传输是否成功呢?看了一点关于标准输入输出流的东东,还是不明白。

 shxliang 回复于:2003-12-27 11:16:44
最简单的就是在脚本里用重定向了,'>' 和">>"符号,最简单,你可以看看相关书.

 flyingbxf 回复于:2003-12-27 11:24:55
[quote:5861aa8ed0="shxliang"]最简单的就是在脚本里用重定向了,'>' 和">>"符号,最简单,你可以看看相关书.[/quote:5861aa8ed0]
还是uC的问题呀,sash也不支持重定向的啊!在C程序中,使用重定向可以吗?不知道有没有例子,参考一下?

 shxliang 回复于:2003-12-27 11:54:06
#include <stdio.h>
#include <unistd.h>
int main(void)
{
        FILE *fp;
        int fd;
        if((fp=fopen("test.txt","w")) == NULL){
                printf("fopen error!\n");
                exit(1);
        }
        fd=fileno(fp);
        if(dup2(fd,STDOUT_FILENO)==-1){
                fprintf(stderr,"Redirect Standard Out Error");
                exit(1);
        }
        system("./autoftp");
}
你试试,呵呵!

 flyingbxf 回复于:2003-12-29 11:06:16
好用,谢谢大虾。这样我就可以通过读文件来判断传送成功与否了。另外还有个问题就是,我用的ftp原码是别人给我的,但我发现有如下问题:
当登陆成功后,可以无限制地dir 或 ls ,cd 等都没问题。但只能上传一次,没执行一次send 或 put 不管成功与否,ftp都断掉了。
你看可能的原因是什么呢?

 shxliang 回复于:2003-12-30 09:48:52
你是在shell里头还是上面那个函数里头!不行的话,你用mget或者mput试试!

 flyingbxf 回复于:2003-12-30 10:04:39
shell和函数里面都是这样。我怀疑是我的ftp原码的问题,因为调用的都是同一个ftp ,对吧?

 flyingbxf 回复于:2003-12-30 13:19:51
[quote:782330f15a="shxliang"]你是在shell里头还是上面那个函数里头!不行的话,你用mget或者mput试试![/quote:782330f15a]
这是我用[color=red:782330f15a]put[/color:782330f15a]发送文件的过程:
ftp> put /etc/hosts ./ho.txt
local: /etc/hosts [color=red:782330f15a]remote: ./ho.txt[/color:782330f15a]
200 PORT Command successful.
150 Opening ASCII mode data connection for ho.txt.
226 Transfer complete.
118 bytes sent in 0 secs (118 Kbytes/sec)
ftp> dir
pid 22: failed 4
/>

这是我用[color=red:782330f15a]mput[/color:782330f15a]的过程
ftp> mput /etc/hosts ./ho.txt
local: /etc/hosts [color=red:782330f15a]remote: /etc/hosts[/color:782330f15a]
200 PORT Command successful.
550 hosts: Cannot create file.
local: ./ho.txt remote: ./ho.txt
local: ./ho.txt: Unknown error 22
ftp> dir
ftp> close
ftp> bye
ftp>
也不退出, 不知道是何原因?

 shxliang 回复于:2004-01-01 20:32:59
我也不知道原因,
ftp> mput a.c b.c
mput a.c? y
227 Entering Passive Mode (192,168,0,13,30,83)
150 Opening BINARY mode data connection for a.c.
226 Transfer complete.
108 bytes sent in 6.4e-05 seconds (1.6e+03 Kbytes/s)
mput b.c? y
227 Entering Passive Mode (192,168,0,13,83,195)
150 Opening BINARY mode data connection for b.c.
226 Transfer complete.
1896 bytes sent in 7.2e-05 seconds (2.6e+04 Kbytes/s)
ftp>
-----------------------------------
ftp> put a.c b.c
local: a.c remote: b.c
227 Entering Passive Mode (192,168,0,13,9,8)
150 Opening BINARY mode data connection for b.c.
226 Transfer complete.
108 bytes sent in 6.4e-05 seconds (1.6e+03 Kbytes/s)
你就一个文件一个文件传么,应该可以的!

 flyingbxf 回复于:2004-01-02 09:53:31
下面是我的运行结果:
ftp> mput /etc/hosts
mput /etc/hosts? y
200 PORT Command successful.
550 hosts: Cannot create file.
ftp> ls
ftp> dir
ftp> bye
ftp> bye
ftp>

ftp也退不出来。看来就是我用的ftp不好了。
另外,还有个小问题:
在命令行敲命令传输文件的返回信息,传输成功的话会有:
226 Transfer complete.
[color=red:3dc4effa03]xxx(当然是不确定的啦)[/color:3dc4effa03] bytes sent in 0 secs (xxx Kbytes/sec) 

但我用if(dup2(fd,STDOUT_FILENO)==-1) 的话,在产生的log文件里面没有最后一句啊。

 flyingbxf 回复于:2004-01-02 10:04:07
又试了一下,传输倒是成功了不过还是无法接受后续命令。如下:
ftp> mput ftp(这次没有加路径,传输的是运行ftp的目录下的一个文件,名字叫ftp)
mput ftp? y
200 PORT Command successful.
150 Opening ASCII mode data connection for ftp.
226 Transfer complete.
843 bytes sent in 0 secs (843 Kbytes/sec)
ftp> dir
ftp> dir(dir 还是不起作用了)

 flyingbxf 回复于:2004-01-05 15:31:43
[quote:b735340153="flyingbxf"]在命令行敲命令传输文件的返回信息,传输成功的话会有: 
226 Transfer complete. 
xxx(当然是不确定的啦) bytes sent in 0 secs (xxx Kbytes/sec) 

但我用if(dup2(fd,STDOUT_FILENO)==-1) 的话,在产生的log文件里面没有最后一句啊。
[/quote:b735340153]

困惑ing……

 hanni 回复于:2004-05-21 12:04:06
能否总结一下给与参考呢?谢谢

 flyingbxf 回复于:2004-05-21 17:23:35
[quote:5b9bc7d9e1="hanni"]能否总结一下给与参考呢?谢谢[/quote:5b9bc7d9e1]
至今未解决

原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)