使用execl()进行SMB挂载失败

时间:2015-05-20 09:57:41

标签: linux-kernel filesystems mount smb cifs

目前我要在源代码中使用system()调用来安装CIFS,这是有效的。如果我尝试在shell上手动运行命令,它也可以工作。

$ mount -t cifs //IP/dir /mnt -o user=name,pass=PASS,domain=mydomain,nounix
$ mount.cifs //IP/dir /mnt -o user=name,pass=PASS,domain=mydomain,nounix

但如果我用exec()系列替换相同的命令,我会看到错误。

if(fork() == 0) 
{
  if (execl("/bin/mount", "/bin/mount", "-t", "cifs", "//IP/dir",  "/mnt", 
  "-o user=name,pass=PASS,domain=mydomain,nounix", (char*) NULL) < 0)
  ...
}
else
  ...

错误:mount:在// IP / dir / mnt上挂载cifs失败:没有这样的文件或目录。它看起来像挂载目录&#34; / mnt&#34;安装过程无法识别或看不到。

尝试下面的事情,但没有运气:

  • 正如论坛中使用sec = ntlmv2和其他选项
  • 所建议的那样
  • with mount.cifs
  • 组合参数&#34; // IP / dir&#34;和&#34; / mnt&#34; as&#34; // ipaddr / dir / mnt&#34;

这里的原因是什么?如何查看exec()&#39; ed程序的命令行参数?

mount版本:

mount.cifs version: 1.14-x

问候, - AK

2 个答案:

答案 0 :(得分:1)

假设您已安装samba

sudo apt-get install samba

在文件/etc/samba/smb.conf的全局部分,你应该这样: -

workgroup = WORKGROUP
netbios name = PCNAME
name resolve order = bcast host

相应地更改WORKGROUP和PCNAME。设置名称解析顺序,如图所示,以便使用Nautilus浏览Windows共享。

答案 1 :(得分:1)

使用strace()查找传递给execl()的参数。使用系统调用mount()umount()解决了我的问题。