1 概述
libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh,您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C++封装。
libssh下载地址
3 实现
3.5 Dir
Dir类型管理远程路径,通过SFTP和Channel实现(有的服务端不支持SFtp).
3.5.1 Dir定义
3.5.1.1 Dir
class DirPrivate;
class SFtp;
class Scp;
class FileInfoPtr;
class FileInfos;
class Dir
{
public:enum Filter {Dirs = 0x001,Files = 0x002,Drives = 0x004,NoSymLinks = 0x008,AllEntries = Dirs | Files | Drives,TypeMask = 0x00f,Readable = 0x010,Writable = 0x020,Executable = 0x040,PermissionMask = 0x070,Modified = 0x080,Hidden = 0x100,System = 0x200,AccessMask = 0x3F0,AllDirs = 0x400,CaseSensitive = 0x800,NoDot = 0x2000,NoDotDot = 0x4000,NoDotAndDotDot = NoDot | NoDotDot,NoFilter = -1};enum SortFlag { Name = 0x00,Time = 0x01,Size = 0x02,Type = 0x03,Property = 0x04,Unsorted = 0x07,SortByMask = 0x07,DirsFirst = 0x08,Reversed = 0x10,IgnoreCase = 0x20,DirsLast = 0x40,LocaleAware = 0x80,NoSort = -1};Dir(SFtp const& sftp, const char* path);Dir(Scp const& scp, const char* path);~Dir();bool is_root() const;const char* dirname() const;FileInfos fileinfos(Filter filter = NoFilter, SortFlag sortFlag = NoSort);bool mkdir(const char* path);bool rmdir(const char* path);bool mkfile(const char* filename);bool rmfile(const char* filename);bool rename(const char *original, const char *newname);bool chmod(const char* filename, uint16_t mode);static std::string dirname(const char* filename);static std::string basename(const char* filename);
private:void sort(FileInfos &fileInfos, SortFlag sortFlag);Dir(Dir const&);Dir & operator == (Dir const&);DirPrivate* d;
};
接口函数:
- is_root 是否root目录
- dirname 返回路径名称
- fileinfos 返回该目录文件列表
- mkdir 创建目录
- rmdir 删除目录
- mkfile 创建文件
- rmfile 删除文件
- rename 文件目录改名
- chmod 修改文件权限
- dirname 获取文件目录名
- basename 获取文件基本名称
3.5.1.2 DirPrivate
class DirPrivate
{
public:DirPrivate(const char * p): path(p){}virtual ~DirPrivate() {}virtual bool opendir() = 0;virtual sftp_attributes readdir() = 0;virtual void closedir() = 0;virtual bool mkdir(const char* path) = 0;virtual bool rmdir(const char* path) = 0;virtual bool mkfile(const char* filename) = 0;virtual bool rmfile(const char* filename) = 0;virtual bool rename(const char *original, const char *newname) = 0;virtual bool chmod(const char* filename, uint16_t mode) = 0;bool is_relative_path(const char * path);inline bool is_empty(const char * path) { return !path || *path == 0; }inline std::string absolute_path(const char * p) { return path + "/" + p; }std::string path;
};
接口定义:
- opendir 打开目录开始遍历
- readdir 读取目录信息
- closedir 关闭目录遍历
- mkdir 创建目录
- rmdir 删除目录
- mkfile 创建文件
- rmfile 删除文件
- rename 文件改名
- chmod 修改文件权限
- is_relative_path 判断路径是否是相对路径
- is_empty 判断路径是否为空
- absolute_path 返回绝对路径
3.5.1.3 SftpDirPrivate
基于SFTP协议实现DirPrivate接口
class SftpDirPrivate : public DirPrivate
{
public:SftpDirPrivate(const char * p, sftp_session s): DirPrivate(p), sftp(s), dir(0){}bool opendir() override;sftp_attributes readdir() override;void closedir() override;bool mkdir(const char* path) override;bool rmdir(const char* path) override;bool mkfile(const char*