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 |




