我正在开发一个必须在Ubuntu上安装samba共享的项目。该项目将由非root用户使用。现在我正在使用一个名为gvfs-mount
的应用程序,因为它不需要root密码来安装。
我的应用程序使用特定的命令行参数运行该可执行文件并且它可以工作,但错误检查很困难。我正在使用一个名为pstreams
的库来启动gvfs-mount
并写入并读取它的stdin / out,但我可以预测应用程序何时会向stdout写入内容。这是一个问题,因为如果我想从gvfs-mount
的输出中读取内容,但应用程序没有写任何内容,主机应用程序将被阻止,因为这将等待永远不会发生的事情
我知道我可以使用mount
中的sys/mount.h
函数,但这需要root权限。我的问题是:在C ++中是否有关于此主题的API,库或教程?
编辑:
正如影片提到的那样,我看了gvfs-mount的源代码,然后转换为C ++。这是我的基本代码:
#include <gtkmm.h>
#include <stdexcept>
#include <iostream>
Glib::RefPtr<Gio::File> file;
Glib::RefPtr<Glib::MainLoop> main_loop;
void on_async_ready(Glib::RefPtr<Gio::AsyncResult>& result)
{
file->mount_enclosing_volume_finish(result);
main_loop->quit();
}
int main()
{
Gio::init();
Glib::init();
main_loop = Glib::MainLoop::create(false);
file = Gio::File::create_for_commandline_arg("smb://192.168.1.3/Memory\\ core");
Glib::RefPtr<Gio::MountOperation> mount_operation = Gio::MountOperation::create();
mount_operation->set_domain("domain");
mount_operation->set_username("user");
mount_operation->set_password("password");
try
{
file->mount_enclosing_volume(mount_operation, &on_async_ready);
}
catch(const Glib::Error& ex)
{
std::cerr << ex.what() << std::endl;
}
main_loop->run();
return 0;
}
#include <gtkmm.h>
#include <stdexcept>
#include <iostream>
Glib::RefPtr<Gio::File> file;
Glib::RefPtr<Glib::MainLoop> main_loop;
void on_async_ready(Glib::RefPtr<Gio::AsyncResult>& result)
{
file->mount_enclosing_volume_finish(result);
main_loop->quit();
}
int main()
{
Gio::init();
Glib::init();
main_loop = Glib::MainLoop::create(false);
file = Gio::File::create_for_commandline_arg("smb://192.168.1.3/Memory\\ core");
Glib::RefPtr<Gio::MountOperation> mount_operation = Gio::MountOperation::create();
mount_operation->set_domain("domain");
mount_operation->set_username("user");
mount_operation->set_password("password");
try
{
file->mount_enclosing_volume(mount_operation, &on_async_ready);
}
catch(const Glib::Error& ex)
{
std::cerr << ex.what() << std::endl;
}
main_loop->run();
return 0;
}
问题是,当我以普通用户身份运行此代码时,我得到了这个输出:
(程序:5816):glibmm-CRITICAL **: 信号处理程序中未处理的异常(类型为Glib :: Error): domain:g-io-error-quark 代码:0 什么:无法挂载Windows共享:不允许操作
当我以sudo身份运行时,我得到了这个:
(程序:5862):glibmm-CRITICAL **: 信号处理程序中未处理的异常(类型为Glib :: Error): domain:g-io-error-quark 代码:15 什么:卷没有实现mount
有关解决这个问题的任何建议吗?代码应该使用普通用户权限。
编辑2:
我更新了源代码,因为它在uri中是一个错误。我发现如果我将gvfs-mount作为sudo运行,我会得到与我的应用程序相同的错误消息。所以我的想法是权限有问题。我的用户名属于熔丝组,这很重要。
#include <gtkmm.h>
#include <iostream>
Glib::RefPtr<Gio::File> file;
Glib::RefPtr<Glib::MainLoop> main_loop;
void on_async_ready(Glib::RefPtr<Gio::AsyncResult>& result)
{
try
{
file->mount_enclosing_volume_finish(result);
}
catch(const Glib::Error& ex)
{
std::cerr << ex.what() << std::endl;
}
main_loop->quit();
}
int main()
{
Gio::init();
Glib::init();
main_loop = Glib::MainLoop::create(false);
file = Gio::File::create_for_commandline_arg("smb://192.168.1.3/Memory core");
Glib::RefPtr<Gio::MountOperation> mount_operation = Gio::MountOperation::create();
mount_operation->set_domain("domain");
mount_operation->set_username("user");
mount_operation->set_password("password");
file->mount_enclosing_volume(mount_operation, &on_async_ready);
main_loop->run();
return 0;
}