Time to Read

1分

みなさん! Windowsは好きですか? 僕は普通です。

「社内共有ファイルサーバはWindowsだけど、Railsとかそういうのから、例えば集計結果CSVを送りつけなきゃいけない!」 みたいな時、RubyのSamba関連ライブラリが大変イマイチなので、いっそsmbclientコマンドで送りつけようと思ったときのコードのメモ。

まずはインストール(@Debian、Ubuntu)。

1
aptitude install smbclient

外部コマンドを発行したいとき、こういうインタラクティブシェルがあるコマンドなら、Open3を使うと楽。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
 
require 'rubygems'
require 'open3'
require 'logger'
 
logger = Logger.new(STDERR)
logger.level = Logger::DEBUG
 
logger.info "--- Start putting files... ---"
cmd = '/usr/bin/smbclient -U udzura -W YOURDOMAIN \\\\\\\\file.server\\\\共有フォルダ XXXXXXXX'
Open3.popen3(cmd) do |stdin, stdout, stderr|
  logger.debug "smbclient connect successfully."
  t1 = Thread.new(stdout) {|io| while ln = io.gets; logger.warn '[smbclient] ' + ln end }
  t2 = Thread.new(stderr) {|io| while ln = io.gets; logger.info '[smbclient] ' + ln end }
  logger.debug "smbclient logging thread created."
 
  # main - sending commands to smbclient
  stdin.puts "lcd /home/udzura/ピクチャ"
  stdin.puts "cd dogs"
  dirname = Time.now.strftime'%Y-%m-%d'
  stdin.puts "mkdir target\\#{dirname}"
  stdin.puts "put akubi3.jpg target\\#{dirname}\\akubi3.jpg"
  stdin.puts "exit"
 
  # end jobs
  stdin.close
  sleep 5 # to wait for threads to complete logging
  [t1, t2].each {|t| Thread.kill t }
end
 
logger.info "--- End putting files...   ---"
 
exit

参考