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 cha