Ruby读取Samba共享

时间:2011-10-11 23:17:59

标签: ruby samba smb

我正在寻找一种从samba共享中读取的方法。我想像Dir类一样使用它,例如打开和读取目​​录。这在Ruby中是否可行?

4 个答案:

答案 0 :(得分:3)

如果您的主机操作系统是Posix(类UNIX)系统(不确定Windows ...),Sambala gem应该适合您:

gem install sambala

只要您的主机操作系统在$ PATH中的某个位置具有可用的smbclient可执行文件,此gem就可以正常工作。只要您使用的是Mac OS X,Linux或其他一些UNIX变体,您就应该可以从终端运行以下命令,看看您的路径中是否有某个smbclient:

which smbclient

如果您没有得到结果,请进行谷歌搜索,了解如何获取当前主机操作系统的smbclient。如果您使用的是Mac OS X,只需install MacPorts,然后从终端运行以下命令即可安装smbclient:

sudo port install samba3

答案 1 :(得分:1)

我认为你可以尝试检查我的宝石,我已经启动它因为我和sambala有同样的问题

https://github.com/reivilo/rsmbclient

答案 2 :(得分:0)

Sambala gem适用于Posix(类UNIX)系统上的1.8.x Ruby实现

gem install sambala

对于1.9.x Ruby on Posix使用GLSIGNAL的fork。

git clone https://github.com/glsignal/sambala.git
cd sambala
gem build samabala
gem install ./sambala.gem

注意:GLSignal的gem使用github丰富的源代码,可以在1.9.x上运行

正如lottscarson所说,只要您的主机操作系统在$ PATH中的某个地方有一个可用的smbclient可执行文件,这些宝石就会起作用。只要您使用的是Mac OS X,Linux或其他一些Posix变体,您就应该可以从终端运行以下命令,看看您的路径中是否有smbclient:

which smbclient

如果您没有得到结果,请进行谷歌搜索,了解如何获取当前主机操作系统的smbclient。 (例子)

(RHEL/CENTOS/etc) yum install samba

(ubuntu/debian) sudo apt-get install samba smbfs

(osx) brew install samba

作为smbclient包装器的替代品,您可以使用名为'net-smb'的C扩展ruby gem。这需要本机编译,而不是纯粹的ruby。

gem install net-smb

这也需要一些东西。

Ruby 1.9.3+
Samba 3.5+ (libsmbclient)
C compiler

安装示例

sudo apt-get install libsmbclient libsmbclient-dev

答案 3 :(得分:0)

Ruby_SMB是SMB协议家族的本地Ruby实现。

来自README

  sock = TCPSocket.new address, 445
  dispatcher = RubySMB::Dispatcher::Socket.new(sock)

  client = RubySMB::Client.new(dispatcher, username: 'msfadmin', password: 'msfadmin')
  client.negotiate
  client.authenticate

  begin
    tree = client.tree_connect('TEST_SHARE')
    puts "Connected to #{path} successfully!"
  rescue StandardError => e
    puts "Failed to connect to #{path}: #{e.message}"
  end

  files = tree.list(directory: 'subdir1')

  files.each do |file|
    create_time = file.create_time.to_datetime.to_s
    access_time = file.last_access.to_datetime.to_s
    change_time = file.last_change.to_datetime.to_s
    file_name   = file.file_name.encode("UTF-8")

    puts "FILE: #{file_name}\n\tSIZE(BYTES):#{file.end_of_file}\n\tSIZE_ON_DISK(BYTES):#{file.allocation_size}\n\tCREATED:#{create_time}\n\tACCESSED:#{access_time}\n\tCHANGED:#{change_time}\n\n"
  end