Linux中在主机上实现对备机上目录及文件的操作的C代码实现

简介: 需求描述 编写程序,完成在主机上实现对备机上目录及文件的操作。例如,主机为A,备机为B,要求编写的程序运行在A机上,该程序实现在B机上创建文件目录及拷贝文件的操作。

需求描述
编写程序,完成在主机上实现对备机上目录及文件的操作。例如,主机为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后面的变量是用户名,第二个echo后面的变量是密码,第三个echo便执行具体的创建目录和拷贝文件的操作。

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

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

目录
相关文章
|
1天前
|
存储 移动开发 Linux
Linux系统之部署h5ai目录列表程序
【5月更文挑战第3天】Linux系统之部署h5ai目录列表程序
11 1
|
1天前
|
Linux
Linux 文件查找
Linux 文件查找
|
1天前
|
运维 NoSQL Linux
linux环境收集core文件步骤
请注意,生成core文件可能会占用磁盘空间,因此应谨慎使用。一旦完成故障排查,建议将相关的core文件删除以释放磁盘空间。
12 4
|
4天前
|
Linux 开发工具 Perl
|
6天前
|
Linux Shell 调度
【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)
【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)
|
6天前
|
Linux
Linux文件误删恢复
请注意,成功恢复误删文件的机会取决于多个因素,包括文件被删除后经过的时间、磁盘的使用情况以及您采取的操作。因此,尽可能快速采取行动,并避免在误删文件所在的磁盘上写入新数据,以提高恢复成功的可能性。
10 0
|
7天前
|
存储 监控 Linux
|
7天前
|
安全 Linux
【亮剑】如何在Linux使用 chattr 命令更改文件或目录的扩展属性?
【4月更文挑战第30天】`chattr`是Linux中用于管理文件和目录扩展属性的命令,影响文件系统处理方式。常用属性包括:`a`(追加)、`i`(不可变)、`s`(安全删除)和`S`(同步更新)。通过`chattr [选项] &lt;模式&gt; &lt;文件或目录&gt;`设置属性,如`chattr +i &lt;文件名&gt;`使文件不可变,`-i`移除不可变属性。`lsattr`用于查看属性。注意,只有root用户有权更改属性,不是所有文件系统都支持所有属性,且更改关键文件属性前应备份。`chattr`有助于提升系统安全性和数据保护。
|
4月前
|
Linux
百度搜索:蓝易云【Linux中如何对文件进行压缩和解压缩?】
这些是在Linux中进行文件压缩和解压缩的常见方法。根据您的需求和具体情况,可能会使用其他压缩工具和选项。您可以通过查阅相应命令的帮助文档来获取更多详细信息。
53 1
|
5月前
|
NoSQL Java Linux
Linux常用命令(文件目录操作、拷贝移动、打包压缩、文本编辑、查找)
Linux常用命令(文件目录操作、拷贝移动、打包压缩、文本编辑、查找)