使用 C++ 在 linux 中安装网络驱动器
Mount a network drive in linux using c++
我想使用 C++ 在 linux 上安装网络驱动器。使用 "mount" 的命令行,我可以安装任何我想要的驱动器。但是使用C++,只有那些被用户共享的驱动器被成功挂载。
这是我的测试代码:
#include <sys/mount.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <string>
using namespace std;
int main()
{
string src = "//192.168.4.11/c$/Users";
string dst = "/home/krahul/Desktop/test_mount";
string fstype = "cifs";
printf("src: %s\n", src.c_str());
if( -1 == mount(src.c_str(), dst.c_str(), fstype.c_str(), MS_MGC_VAL | MS_SILENT , "username=uname,password=pswd") )
{
printf("mount failed with error: %s\n",strerror(errno));
}
else
printf("mount success!\n");
if( umount2(dst.c_str(), MNT_FORCE) < 0 )
{
printf("unmount failed with error: %s\n",strerror(errno));
}
else
printf("unmount success!\n");
return 0;
}
我想挂载机器的 "C:/Users" 驱动器。使用命令行,它可以工作,但不能通过此代码。我不知道为什么。 strerror() 打印的错误是 "No such device or address"。我正在使用 Centos,并且为这台机器配置了 Samba。我哪里错了?
mount.cifs 命令解析并更改传递给挂载系统调用的选项。使用 -v
选项查看它用于系统调用的内容。
$ mount -v -t cifs -o username=guest,password= //bubble/Music /tmp/xxx
mount.cifs kernel mount options: ip=127.0.1.1,unc=\bubble\Music,user=guest,pass=********
即它获取目标系统的 IP 地址(在 ip 选项中将我的 bubble
替换为 127.0.1.1
),并将带有反斜杠的完整 UNC 传递给挂载系统调用。
用我的挂载选项重写你的例子:
#include <sys/mount.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <string>
using namespace std;
int main()
{
string host = "127.0.1.1";
string src = "\\bubble\Music";
string dst = "/tmp/xxx";
string fstype = "cifs";
string all_string = "unc=" + src + ",ip=" + host + ",username=guest,password=";
printf("src: %s\n", src.c_str());
if( -1 == mount(src.c_str(), dst.c_str(), fstype.c_str(), MS_MGC_VAL | MS_SILENT , all_string.c_str()))
{
printf("mount failed with error: %s\n",strerror(errno));
}
else
printf("mount success!\n");
if( umount2(dst.c_str(), MNT_FORCE) < 0 )
{
printf("unmount failed with error: %s\n",strerror(errno));
}
else
printf("unmount success!\n");
return 0;
}
这应该有助于您编写工具来调用 mount2
。
我想使用 C++ 在 linux 上安装网络驱动器。使用 "mount" 的命令行,我可以安装任何我想要的驱动器。但是使用C++,只有那些被用户共享的驱动器被成功挂载。
这是我的测试代码:
#include <sys/mount.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <string>
using namespace std;
int main()
{
string src = "//192.168.4.11/c$/Users";
string dst = "/home/krahul/Desktop/test_mount";
string fstype = "cifs";
printf("src: %s\n", src.c_str());
if( -1 == mount(src.c_str(), dst.c_str(), fstype.c_str(), MS_MGC_VAL | MS_SILENT , "username=uname,password=pswd") )
{
printf("mount failed with error: %s\n",strerror(errno));
}
else
printf("mount success!\n");
if( umount2(dst.c_str(), MNT_FORCE) < 0 )
{
printf("unmount failed with error: %s\n",strerror(errno));
}
else
printf("unmount success!\n");
return 0;
}
我想挂载机器的 "C:/Users" 驱动器。使用命令行,它可以工作,但不能通过此代码。我不知道为什么。 strerror() 打印的错误是 "No such device or address"。我正在使用 Centos,并且为这台机器配置了 Samba。我哪里错了?
mount.cifs 命令解析并更改传递给挂载系统调用的选项。使用 -v
选项查看它用于系统调用的内容。
$ mount -v -t cifs -o username=guest,password= //bubble/Music /tmp/xxx
mount.cifs kernel mount options: ip=127.0.1.1,unc=\bubble\Music,user=guest,pass=********
即它获取目标系统的 IP 地址(在 ip 选项中将我的 bubble
替换为 127.0.1.1
),并将带有反斜杠的完整 UNC 传递给挂载系统调用。
用我的挂载选项重写你的例子:
#include <sys/mount.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <string>
using namespace std;
int main()
{
string host = "127.0.1.1";
string src = "\\bubble\Music";
string dst = "/tmp/xxx";
string fstype = "cifs";
string all_string = "unc=" + src + ",ip=" + host + ",username=guest,password=";
printf("src: %s\n", src.c_str());
if( -1 == mount(src.c_str(), dst.c_str(), fstype.c_str(), MS_MGC_VAL | MS_SILENT , all_string.c_str()))
{
printf("mount failed with error: %s\n",strerror(errno));
}
else
printf("mount success!\n");
if( umount2(dst.c_str(), MNT_FORCE) < 0 )
{
printf("unmount failed with error: %s\n",strerror(errno));
}
else
printf("unmount success!\n");
return 0;
}
这应该有助于您编写工具来调用 mount2
。