需求描写叙述

编敲代码。完毕在主机上实现对备机上文件夹及文件的操作。

比如,主机为A,备机为B,要求编写的程序运行在A机上,该程序实如今B机上创建文件文件夹及复制文件的操作。

需求分析

我们先不考虑用程序实现需求,假设是让我们用手工实现需求中描写叙述的操作,我们会怎么做呢?大家或许都会想到使用telnet的方式。也就是说。在A机上使用telnet远程到B机上去,然后在B机上运行创建文件夹和复制文件的操作。

我们也能够在程序中使用telnet来完毕上述需求。

程序编写

我们能够使用两种方式来运行telnet命令,一种是直接使用系统提供的system函数。还有一种是使用管道的方式。

下面是这两种方式编写出来的程序:

1.使用system函数

/**********************************************************************
* 版权全部 (C)2015, Zhou Zhaoxiong。
*
* 文件名:System.c
* 文件标识:无
* 内容摘要:測试system的使用方法
* 其他说明:利用system实现远程操作
* 当前版本号:V1.0
* 作 者:Zhou Zhaoxiong
* 完毕日期:20151225
*
**********************************************************************/
#include <stdio.h>
#include <string.h> // 重定义数据类型
typedef unsigned char UINT8;
typedef signed int INT32; // 函数声明
void DealRemoteFile(void); /**********************************************************************
* 功能描写叙述:主函数
* 输入參数:无
* 输出參数:无
* 返 回 值:无
* 其他说明:无
* 改动日期 版本号号 改动人 改动内容
* ---------------------------------------------------------------
* 20151225 V1.0 Zhou Zhaoxiong 创建
***********************************************************************/
INT32 main()
{
DealRemoteFile(); return 0;
} /**********************************************************************
* 功能描写叙述:处理远端的文件
* 输入參数:无
* 输出參数:无
* 返 回 值:无
* 其他说明:无
* 改动日期 版本号号 改动人 改动内容
* ---------------------------------------------------------------
* 20151225 V1.0 Zhou Zhaoxiong 创建
***********************************************************************/
void DealRemoteFile(void)
{
UINT8 szCmdBuf[1024] = {0};
UINT8 szResultBuf[1024] = {0}; snprintf(szCmdBuf, sizeof(szCmdBuf)-1, "(sleep 0.5; echo zhou; sleep 1; echo zhou; sleep 5; echo \"cd /home/zhou/zhouzx/Test;mkdir -p TestFile;cp TestFile.txt ./TestFile;\"; sleep 2) | telnet 10.10.10.10"); printf("DealRemoteFile: Cmd is %s\n", szCmdBuf); system(szCmdBuf);
}

2.使用管道的方式

/**********************************************************************
* 版权全部 (C)2015, Zhou Zhaoxiong。
*
* 文件名:PipeOpenAndClose.c
* 文件标识:无
* 内容摘要:測试popen和pclose的使用方法
* 其他说明:利用popen和pclose处理远端的文件
* 当前版本号:V1.0
* 作 者:Zhou Zhaoxiong
* 完毕日期:20151225
*
**********************************************************************/
#include <stdio.h>
#include <string.h> // 重定义数据类型
typedef unsigned char UINT8;
typedef signed int INT32; // 函数声明
void DealRemoteFile(void); /**********************************************************************
* 功能描写叙述:主函数
* 输入參数:无
* 输出參数:无
* 返 回 值:无
* 其他说明:无
* 改动日期 版本号号 改动人 改动内容
* ---------------------------------------------------------------
* 20151225 V1.0 Zhou Zhaoxiong 创建
***********************************************************************/
INT32 main()
{
DealRemoteFile(); return 0;
} /**********************************************************************
* 功能描写叙述:处理远端的文件
* 输入參数:无
* 输出參数:无
* 返 回 值:无
* 其他说明:无
* 改动日期 版本号号 改动人 改动内容
* ---------------------------------------------------------------
* 20151225 V1.0 Zhou Zhaoxiong 创建
***********************************************************************/
void DealRemoteFile(void)
{
UINT8 szCmdBuf[1024] = {0};
UINT8 szResultBuf[1024] = {0};
FILE *fpPipe = NULL; snprintf(szCmdBuf, sizeof(szCmdBuf)-1, "(sleep 0.5; echo zhou; sleep 1; echo zhou; sleep 5; echo \"cd /home/zhou/zhouzx/Test;mkdir -p TestFile;cp TestFile.txt ./TestFile;\"; sleep 2) | telnet 10.10.10.10"); printf("DealRemoteFile: Cmd is %s\n", szCmdBuf); fpPipe = popen(szCmdBuf, "r");
if (NULL == fpPipe)
{
printf("DealRemoteFile: fpPipe is NULL!\n");
return;
} while (fgets(szResultBuf, sizeof(szResultBuf), fpPipe) != NULL)
{
if ('\n' == szResultBuf[strlen(szResultBuf)-1]) // 将换行符去掉
{
szResultBuf[strlen(szResultBuf)-1] = '\0';
} printf("DealRemoteFile: ResultBuf is %s\n", szResultBuf);
} pclose(fpPipe); // 关闭管道
fpPipe = NULL;
}

程序编译及运行

将System.c和PipeOpenAndClose.c文件上传到A机上,分别使用“gcc -g -o System System.c”和“gcc -g -o PipeOpenAndClose PipeOpenAndClose.c”命令对这两个文件进行编译,再分别运行“System”和“PipeOpenAndClose”命令,就可以在B机上观察到相关操作已运行成功(注意:要确保TestFile.txt文件存在于/home/zhou/zhouzx/Test文件夹下)。

程序说明

1.以上两个程序中的szCmdBuf中的命令是程序的核心。其模式是“shell命令 | telnet x.x.x.x”,当中“x.x.x.x”是B机的IP。shell命令中的“sleep”让程序休眠,第一个echo后面的变量是username。第二个echo后面的变量是password,第三个echo便运行详细的创建文件夹和复制文件的操作。

2.popen和pclose配合来实现相关shell命令的运行。popen函数通过创建一个管道。调用fork产生一个子进程,这个进程必须由pclose函数来关闭。

本文中的程序已经提到了GitHub上,欢迎下载阅读:https://github.com/zhouzxi/PipeOpenAndClose

Linux中在主机上实现对备机上文件夹及文件的操作的C代码实现的更多相关文章

  1. 如何在Linux中使用sFTP上传或下载文件与文件夹

    如何在Linux中使用sFTP上传或下载文件与文件夹 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全;它通过 ...

  2. 在Linux中要修改一个文件夹或文件的权限

    在Linux中要修改一个文件夹或文件的权限我们需要用到linux chmod命令来做,下面我写了几个简单的实例大家可参考一下. 语法如下: chmod [who] [+ | - | =] [mode] ...

  3. Linux上统计文件夹下文件个数以及目录个数

    对于linux终端用户而言,统计文件夹下文件的多少是经常要做的操作,于我而言,我会经常在谷歌搜索一个命令,“如何在linux统计文件夹的个数”,然后点击自己想要的答案,但是有时候不知道统计文件夹命令运 ...

  4. SecureCRT SSH Linux中不显示彩色 字体颜色、文件夹和文件显示的颜色区别开解决办法

    SecureCRT SSH Linux中不显示彩色 字体颜色.文件夹和文件显示的颜色区别开解决办法 实验环境: 刚开始我的情况是这样的:带颜色的显示不出来,然后还能看到,此处有内容,猜测是Secure ...

  5. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现

    最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现.使用时需先导入这个模 ...

  6. day18 时间:time:,日历:calendar,可以运算的时间:datatime,系统:sys, 操作系统:os,系统路径操作:os.path,跨文件夹移动文件,递归删除的思路,递归遍历打印目标路径中所有的txt文件,项目开发周期

    复习 ''' 1.跨文件夹导包 - 不用考虑包的情况下直接导入文件夹(包)下的具体模块 2.__name__: py自执行 '__main__' | py被导入执行 '模块名' 3.包:一系列模块的集 ...

  7. linux安装PyCharm,PyCharm常用快捷键及调试模式,pycharm里面对文件夹或者文件进行重命名

    PyCharm常用快捷键及调试模式 2017年10月18日 23:13:43 菜鸟之神 阅读数:5835    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...

  8. albert1017 Linux下压缩某个文件夹(文件夹打包)

    albert1017 Linux下压缩某个文件夹(文件夹打包) tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把 ...

  9. 从GitHub远程仓库中删除文件夹或文件

    在上传项目到github时,忘记忽略了某个文件夹target,就直接push上去了, 最后意识到了此问题,决定删除掉远程仓库中的target文件夹 删除前: 删除后: 在github上只能删除仓库,却 ...

随机推荐

  1. [Linux]history 显示命令执行的时间

    显示历史命令之行时间 这里的环境是centos5.8 vim  ~/.bashrc 或者 ~/.bash_profile 增加 export HISTTIMEFORMAT="%F %T  & ...

  2. Linux - 目录结构与查看,复制,删除,剪切指令

    Linux当中,一切皆文件. Linux目录结构 / 根分区,只有root用户对此目录拥有写权限. /etc 配置文件 /boot 启动文件 /var 可增长的目录 .日志,文件等. /root 管理 ...

  3. Tomcat容器的Session管理

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  4. 常用图片、文字轮播插件SuperSlide

    SuperSlide 是致力于实现网站统一特效调用的函数,能解决大部分标签切换.焦点图切换等效果,还能多个slide组合创造更多的效果.(兼容ie内核(包括无敌的ie6).webkit内核.ff.op ...

  5. hdu 3729 最大匹配

    此题是我AC的HDU的201道题目.泪流满面啊! 字典序最大(最小)真是个烦人的东西. 学生i与其对应的分数区间的每个点连一条边.字典序最大,编号最大的学生开始匹配. HK无法AC啊,试了很久.我不会 ...

  6. fopen函数打开文件总是返回NULL错误

    有时候,调用fopen函数用来打开文件,但是总会返回NULL.对于此类问题.一定是一下两种原因之一造成的. 1.路径错误.(路径中斜杠和反斜杠的问题) 2.文件在另一个进程中被打开,再次打开当然不行( ...

  7. UWP App Services in Windows 10

    1.AppServices in Universal Windows Platform(UWP) UWP 应用服务可以提供给另一个UWP应用.在Win10系统中,一个应用服务当作应用的一个方法和机制来 ...

  8. <转>Socket编程——基础介绍

    最近系统的看了下unix网络编程的一些内容,对socket的理解有了进一步的加深,在看APUE的时候,那会儿看socket上面介绍的比较少,只是模糊的懂了如何去写一个简单的TCP服务端和客户端,对其中 ...

  9. Illegal instruction 问题的解决方法

    写的程序在一些arm板子上可以运行, 可在一些板子上出现 Illegal instruction 这个一般是 arm指令不匹配的问题. 在编译参数中, 加上  -march=armv4t  就可以解决 ...

  10. 从U盘安装CentOS7.3教程(转载)

    0.准备工作: 一台没系统的普通电脑u盘一个(大于1G,最小安装的话不超过1G,根据选择系统大小匹配U盘即可) CentOS7.3 iso文件一个UltraISO工具 1.制作U盘 ①使用UltraI ...