DD-WRTにsshで接続できた

どっかに設定ないのかなー、と思ってぼけーっと設定項目を見ていたら、ssh関連の設定項目を発見。

ネットワーク -> サーバ/サービス -> Secure Shell

  • SSH サービス: 有効
  • SSH TCP Forwarding: 無効
  • Login時にパスワードを使用する: 無効
  • ポート: お好きなポートに(デフォルトでは22)
  • Authorized Keys: $HOME/.ssh/identity.pubや$HOME/.ssh/id_rsa.pubなどの中身をコピペ

基本はSSH サービスを有効にしてAuthorized Keysを埋めておくだけでOKっぽいです。TCPフォワーディングをしたければSSH TCP Forwardingを有効にするといいと思うのですが、試していません。

管理 -> 管理 -> リモートアクセス

これは恐らく外部からアクセスする際の設定だと思う。基本全部切りにしておいた方が無難だと思うけど、必要があればここを有効にすれば良いっぽい。リモートでSSHを使う際はせめてパスワード不使用、ポート変更ぐらいはしてから利用したほうがいいと思います。
下のキャプチャはSSHのみ有効にした状態。前回の日記ではこれだけしか見つけられずに、「こいつをどうにか有効化できれば......」とか書いていました。現在はどっちも無効にしています。


ssh接続したところ

Buffalo WHR-HP-G54をDD-WRT化

ついかっとなってやった。今でも後悔していない。

前準備

IPの固定

有線接続の状態で

  • IP: 192.168.11.2
  • Mask: 255.255.255.0
  • Gateway: 192.168.11.1

に設定する。

ファームの準備

dd-wrt.v24_std_generic.bin 辺りをダウンロードしておく。megaだと容量足りずに失敗する。

3番目のポートにLAN接続

おまじない的なものかもしれないけど、Buffalo側の3番目のポートでtftpを受け付けているとかいう話がどこかに載っていた気がする。ソースは忘れた。

ルーターの再起動

電源引っこ抜いて再起動する。大体5〜10秒辺りがチャンスっぽい。

tftpコマンドでファームの転送

tftp -i 192.168.11.1 PUT dd-wrt.v24_std_generic.bin

ErrorとかTimeoutとか出なければいい。しばらくルーター側で赤いランプが点滅するけど、それが止まれば終了。

IPの再設定

DD-WRTは初期状態で192.168.1.1/24となるので、固定IPだったら192.168.1.2〜99のどこかを指定。DHCPだと192.168.1.100〜が割り当てられます。

ルーターパスワードの変更

初期状態では

  • ID: root
  • Password: admin

となっている。さすがにDD-WRT化しようと思うような人にデフォルトパスワードでルーターを運用しようとか考える人はいないと信じたいけど、ちゃんと変更しておく。

言語設定

Language SelectionのLanguageをjapaneseにすればGUIが日本語化します。

その他

ssh接続して管理ができるとかいう話を聞いてDD-WRT化したのですが、肝心のSSH管理インターフェイスが無効になっていて、かつ有効化できない状態です......orz

こいつをどうにか有効化できないのかなぁ。

はてなフォトライフにpostするgyazoを書いた on Mac OSX

はてなフォトライフAtomAPIの扱い方が分かったので、早速gyazoを使ってはてなフォトライフにpostするスクリプトを書いてみた。gyazo自体はRubyで書かれているので、書き換えるだけでOK......なんだけど、RubygemsのロードパスはMacに標準で入っているRubygemsのものになるので注意。おいらは別途MacPortsで入れているんだけど、動かなくて原因が分かるのに結構悩んでしまった。

前準備

atomutilをインストール。

sudo /usr/bin/gem install atomutil

これでMacPortsを使ったり、別途他のところにソースからインストールしている人でも標準のRubygemsにatomutilがインストールされる。

patch

*** /Applications/gyazo.app/Contents/Resources/script	2007-09-05 14:20:13.000000000 +0900
--- /Applications/gyazo.app/Contents/Resources/script	2008-09-14 14:27:16.000000000 +0900
***************
*** 1,6 ****
  #!/usr/bin/env ruby
  
! require 'net/http'
  
  program = ARGV[0]
  idfile = File.dirname(program) + "/gyazo.app/Contents/Resources/id"
--- 1,7 ----
  #!/usr/bin/env ruby
  
! require 'rubygems'
! require 'atomutil'
  
  program = ARGV[0]
  idfile = File.dirname(program) + "/gyazo.app/Contents/Resources/id"
***************
*** 25,56 ****
  imagedata = File.read(tmpfile)
  File.delete(tmpfile)
  
! boundary = '----BOUNDARYBOUNDARY----'
  
! HOST = 'gyazo.com'
! CGI = '/upload.cgi'
  
! data = <<EOF
! --#{boundary}\r
! content-disposition: form-data; name="id"\r
! \r
! #{id}\r
! --#{boundary}\r
! content-disposition: form-data; name="imagedata"\r
! \r
! #{imagedata}\r
! \r
! --#{boundary}--\r
! EOF
! 
! header ={
!   'Content-Length' => data.length.to_s,
!   'Content-type' => "multipart/form-data; boundary=#{boundary}"
! }
! 
! Net::HTTP.start(HOST,80){|http|
!   res = http.post(CGI,data,header)
!   url = res.response.to_ary[1]
!   system "echo #{url} | pbcopy"
!   system "open #{url}"
! }
--- 26,46 ----
  imagedata = File.read(tmpfile)
  File.delete(tmpfile)
  
! post_uri = 'http://f.hatena.ne.jp/atom/post'
! userid = '******'
! pass = '******'
! 
! entry = Atom::Entry.new({
!   :title => 'post by gyazo',
!   :updated => Time.now,
!   :content => Atom::Content.new { |c|
!     c.body = [imagedata].pack('m')
!     c.type = "image/jpeg"
!     c.set_attr(:mode, "base64")
!   },
! })
  
! auth = Atompub::Auth::Wsse.new :username => userid, :password => pass
! client = Atompub::Client.new :auth => auth
  
! client.create_entry(post_uri, entry, "post bv gyazo")

中のuseridとpassにはてなアカウント、パスワードを書いてください。別途設定ファイルを準備してもよかったんだけど面倒だったので直接書くことにした。

はてなフォトライフのAtomAPIをRubyでほげほげしてみた

はてなフォトライフAtomAPIについてははてダキーワードを参照の事。

その1: net/httpで叩いてみる

WSSE認証用のライブラリがあるので導入する。

sudo gem install wsee

で、コードは以下。

require 'socket'
require 'net/http'
require 'rubygems'
require 'wsse'

#config
uri = 'f.hatena.ne.jp'
id = 'id'
pass = 'pass'

#wsse auth
http = Net::HTTP.start(uri,80)
res = http.get('/atom/feed',{'X-WSSE' => WSSE::header(id,pass)})

ここで指定してる /atom/feed は投稿された写真のうち最近のエントリをAtomフィードで取得するためのエンドポイント。はてなでフィードしているatomフィードと同じものが返ってくるらしい。res.bodyにStringクラスで入っているので、Xml-Simpleなどを使ってハッシュなんかにすると扱いやすいんじゃないかな。
ただ、これの場合postするときがクソ面倒そう...。

その2: atomutilを使ってみる。

atom/atompubを扱うライブラリがあるので導入する。

sudo gem install atomutil

で、コードは以下。

require 'rubygems'
require 'atomutil'

#config
feed_uri = 'http://f.hatena.ne.jp/atom/feed'
id = 'id'
pass = 'pass'

#create client
auth = Atompub::Auth::Wsse.new :username => id, :password => pass
client = Atompub::Client.new :auth => auth

#get feed
feed = client.get_feed(feed_uri)

動作自体はその1とほぼ同じだけど、返ってきたものは feed.elem に REXML::Element クラスで入っている。
atomutil使う利点はpost時。リクエスト用のXMLを書くのが楽。

require "rubygems"
require "atomutil"
require "pathname"

#create post xml
image = Pathname.new("hogehoge.jpg")

entry = Atom::Entry.new({
  :title => image.basename.to_s,
  :updated => Time.now,
  :content => Atom::Content.new do |c|
    c.body = [image.read].pack('m')
    c.type = "image/jpeg"
    c.set_attr(:mode, "base64")
  end,
})

#config
post_uri = 'http://f.hatena.ne.jp/atom/post'
id = 'id'
pass = 'pass'

#create client
auth = Atompub::Auth::Wsse.new :username => id, :password => pass
client = Atompub::Client.new :auth => auth

#post data
client.create_entry(post_uri, entry)

Apache 2 + mod_dav_svnでsvnレポジトリをサブドメインで運用する

何気に結構ハマってしまったのでメモる。使用したOSはCentOS 5.1。

名前ベースのバーチャルホストを使う

今回は同一サーバで動かすので、名前ベースで利用する。

#
# Use name-based virtual hosting.
#
#NameVirtualHost *:80

コメントアウトされているのを外す。

#
# Use name-based virtual hosting.
#
NameVirtualHost *:80

mod_dav_svnをインストール

yumでインストールできるのでそこから。

sudo yum install mod_dav_svn

mod_dav_svn用のバーチャルホスト設定

おいらは下記のように /opt/svn/repos 以下にプロジェクトごとにレポジトリを作るやり方をいつもしている。

  • opt
    • svn
      • repos
        • project1
        • project2
        • project3

このとき、プロジェクトごとに設定を増やすのがめんどいので /opt/svn/repos以下を一気に設定できるようにしてみた。

<VirtualHost *:80>
  ServerName svn.sample.com
  <Location />
    DAV svn
    SVNListParentPath on
    SVNParentPath /opt/svn/repos
    AuthType Basic
    AuthName "Authorization Realm"
    AuthUserFile /opt/svn/repos/.htpasswd
    Require valid-user
  </Location>
</VirtualHost>

Locationディレクティブの部分を '/' で終わらせてSVNListParentPathをonにすると、SVNParentPath以下のsvnレポジトリを svn.sample.com にアクセスすることで /opt/svn/repos 以下のレポジトリ一覧を出力してくれるっぽい。そして svn.sample.com/project1, svn.sample.com/project2, svn.sample.com/project3 はそれぞれのレポジトリにアクセスできる。
おいらはVirtualHostの設定は全部 /etc/httpd/conf/sites 以下に入れているので、それを読みにいくように httpd.confの最終行にでも書き加える。

Include conf/sites/*.conf

別に指定の仕方は conf/sites/* でも構わないけど、一時的に使用不可にするのに *.conf.disable とかやるので、こういう感じの書き方で。

.htpasswdの準備

さすがに公開する訳にもいかないものが数多く入っているので、Basic認証をかける。ので.htpasswdを準備。上のconfの書き方だと /opt/svn/repos/.htpasswd に書く。

sudo htpasswd -c .htpasswd user

続いてパスワードの入力を求められるので、Basic認証で使うパスワードを入力する。
もうファイルがある場合は -c オプションを外す。

sudo htpasswd .htpasswd new_user

Apacheの再起動

sudo /etc/init.d/httpd restart

ここにあると補完しにくいから、何かしらalias作った方が良さそうな気もするなー、と常々思っているところ。

特定バージョンのRailsを使う

Redmineが2.0.2にのみ対応だったので、古いバージョンのRailsをインストールしてfreezeさせるところまでやった。バージョン指定をよく忘れてしまうのでメモる。

特定バージョンのRailsインストール

sudo gem install rails -v 2.0.2

特定バージョンのRailsを使ってRailsアプリ生成

rails _2.0.2_ myapp

特定バージョンのRailsRailsアプリで使う

rake rails:freeze:gems VERSION=2.0.2

Rubygemsのバージョン指定の仕方、Railsのバージョン指定の仕方、Rakeのバージョン指定の仕方が全部異なるので毎回毎回混乱する。めんどい。

CentOS5 on PowerEdgeでXが起動しない

何度も同じことをやっているのでメモる。

/etc/X11/xorg.confの書き換え

Section "Device"
  Identifier "Videocard0"
  Driver "radeon"
EndSection

Section "Device"
  Identifier "Videocard0"
  Driver "vesa"
EndSection

に書き換える。

/etc/inittabの書き換え

id:3:initdefault:

id:5:initdefault:

に書き換える。

再起動

reboot

でリブートするとXが使えるようになる。