hacks/lang

2015年01月30日

このエントリーをはてなブックマークに追加

CVE-2015-0235: GHOST Buster シェルスクリプト #CentOS-6 | blog.hansode.orgのCentOS-7編。

CVE-2015-0235関連

RHEL-7 / CentOS-7 関連

glibcを入れ替える必要がある。

2015/01/30時点の対応

検証用にbuildワーカーを複数環境扱ってるので、それぞれ対応する必要があった。CentOS-7系に関しては7.0.1406のみで良いので対応は大分軽度だ。手順と動作を確認し、上手く行ったのが下記シェルスクリプト。

 ghost-buster-rhel7.sh

バージョン判定には、

  • /etc/yum/vars/releaseverが存在する場合は使用し、
  • 存在しない場合は/etc/centos-releaseから情報取得
#!/bin/bash
#
# requires:
#  bash
#
set -e
set -o pipefail
set -x

if [[ -f /etc/yum/vars/releasever ]]; then
  releasever=$(< /etc/yum/vars/releasever)
else
  releasever=$(
   sed \
    -e '/^CentOS /!d' \
    -e 's/CentOS.*\srelease\s*\([0-9][0-9.]*\)\s.*/\1/' \
    < /etc/centos-release
  )
fi

arch=$(arch)
case "${arch}" in
  i*86)   basearch=i386 arch=i686 ;;
  x86_64) basearch=${arch} ;;
esac

case "${releasever}" in
  7.0.1406)
    yum update  -y \
      glibc \
      glibc-common \
      glibc-devel \
      glibc-headers
    ;;
esac

対象環境で実行するとglibcが入れ替わる。

あとがき

手元に都合の良く手頃な検証環境があるのは幸せな事なのだろう。




編集
@hansode at 18:00|PermalinkComments(0)TrackBack(0)

2015年01月29日

このエントリーをはてなブックマークに追加

CVE-2015-0235関連

RHEL-6 / CentOS-6 関連

glibcを入れ替える必要がある。

2015/01/29時点の対応

検証用にbuildワーカーを複数環境扱ってるので、それぞれ対応する必要があった。updatesが反映されているのは6.6のみ。それ以下を放置する訳にもいかない。それゆえ、6.66.[0-5]と言う場合分けが必要だ。手順と動作を確認し、上手く行ったのが下記シェルスクリプト。

 ghost-buster-rhel6.sh

バージョン判定には、

  • /etc/yum/vars/releaseverが存在する場合は使用し、
  • 存在しない場合は/etc/centos-releaseから情報取得
#!/bin/bash
#
# requires:
#  bash
#
set -e
set -o pipefail
set -x

if [[ -f /etc/yum/vars/releasever ]]; then
  releasever=$(< /etc/yum/vars/releasever)
else
  releasever=$(
   sed \
    -e '/^CentOS /!d' \
    -e 's/CentOS.*\srelease\s*\([0-9][0-9.]*\)\s.*/\1/' \
    < /etc/centos-release
  )
fi

arch=$(arch)
case "${arch}" in
  i*86)   basearch=i386 arch=i686 ;;
  x86_64) basearch=${arch} ;;
esac

case "${releasever}" in
  6.6)
    yum update  -y \
      glibc \
      glibc-common \
      glibc-devel \
      glibc-headers
    ;;
  6.[0-5])
    expected_version=2.12-1.149.el6_6.5
    case "$(rpm -qa --qf '%{Version}-%{Release}\n' glibc)" in
      ${expected_version})
        ;;
      *)
        base_uri=http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.6/updates/${basearch}/Packages
        yum install -y \
          ${base_uri}/glibc-${expected_version}.${arch}.rpm \
          ${base_uri}/glibc-common-${expected_version}.${arch}.rpm \
          ${base_uri}/glibc-devel-${expected_version}.${arch}.rpm \
          ${base_uri}/glibc-headers-${expected_version}.${arch}.rpm
        ;;
    esac
    ;;
esac

対象環境で実行するとglibcが入れ替わる。

あとがき

手元に都合の良く手頃な検証環境があるのは幸せな事か。

続きを読む


編集
@hansode at 21:30|PermalinkComments(0)TrackBack(0)

2015年01月25日

このエントリーをはてなブックマークに追加

if文を省略可

GitHub API v3をcurlコマンド経由でAPI呼び出しをしていると、Token有無による場合分けが、しばしば必要となる。普段は当たり前の様にbashスクリプトを活用してcurlコマンドオプションを組み立てている。そして、-n-zによる文字列テストによる場合分けをしていた。そう、今までは。

[[ -n "${GITHUB_TOKEN}" ]] && { echo "-H \"Authorization: token ${GITHUB_TOKEN}\""; }

ある日、時々シェルスクリプトを書く@unakatsuoが言う。

文字列展開のうち、+の使い方・使い処が分かった。 echo ${var:+"foo ${var}"} みたいに書くと良い。

存在は知っていたが、使わずに来た。

未開拓のパラメタ展開

man bash(1)より。

   Parameter Expansion

       ${parameter:+word}
              Use Alternate Value.  If parameter is null or unset, nothing is substituted, otherwise the expansion of word is substituted.
  • parameterがnullかunsetの場合は置き換えない
  • そうでない場合は置き換える

これを上手く使うと、if文を省略して書けると言う。先述のコードを、+によるパラメタ展開を使い書き直すと、

before:

[[ -n "${GITHUB_TOKEN}" ]] && { echo "-H \"Authorization: token ${GITHUB_TOKEN}\""; }

after:

echo ${GITHUB_TOKEN:+"-H \"Authorization: token ${GITHUB_TOKEN}\""}

コードが短くなった。

おまけ:test-github-issues.sh

普段使いのスクリプトから一部を抜粋。

#!/bin/bash
#
#
set -e
set -o pipefail

function curl() {
  echo curl "${@}"
}

function github_issues() {
  curl \
   -fsSkL \
   $([[ -n "${GITHUB_TOKEN}" ]] && { echo "-H \"Authorization: token ${GITHUB_TOKEN}\""; } ) \
   "https://api.github.com/repos/${owner}/${repo}/issues"
}

function github_issues2() {
  curl \
   -fsSkL \
   ${GITHUB_TOKEN:+"-H \"Authorization: token ${GITHUB_TOKEN}\""} \
   "https://api.github.com/repos/${owner}/${repo}/issues"
}

owner=github
repo=github

GITHUB_TOKEN=     github_issues
GITHUB_TOKEN=     github_issues2

GITHUB_TOKEN=asdf github_issues
GITHUB_TOKEN=asdf github_issues2

[[ "$(GITHUB_TOKEN=     github_issues)" == "$(GITHUB_TOKEN=     github_issues2)" ]]
echo ${?}
[[ "$(GITHUB_TOKEN=asdf github_issues)" == "$(GITHUB_TOKEN=asdf github_issues2)" ]]
echo ${?}

上記スクリプトを実行すると、こうなる。

$ chmod +x ./test-github-issues.sh
$ ./test-github-issues.sh
curl -fsSkL https://api.github.com/repos/github/github/issues
curl -fsSkL https://api.github.com/repos/github/github/issues
curl -fsSkL -H "Authorization: token asdf" https://api.github.com/repos/github/github/issues
curl -fsSkL -H "Authorization: token asdf" https://api.github.com/repos/github/github/issues
0
0
  • GITHUB_TOKEN あり / なし
  • github_issuesgithub_issues2 による生成文字列

生成された文字列が改良前後で同一かどうかをテストし、同一である事を確認。

あとがき

多用し過ぎると可読性が低下しそうなので、ご利用は計画的に。




編集
@hansode at 17:00|PermalinkComments(0)TrackBack(0)

2013年12月26日

このエントリーをはてなブックマークに追加

Ruby 2.1.0 is released

今年も12/25リリースとなった。お疲れ様でした。

We are pleased to announce the release of Ruby 2.1.0.

Ruby 2.1 has many improvements including speed up without severe incompatibilities

自分は得意分野のrpmspec作成と、パッケージビルドを終えた。

ビルド済みRPMはGitHubに置いてあるので、ご自由にどうぞ。インストール手順は下記の通り。

検証環境
  • CentOS 6.5
  • kernel-2.6.32-431.el6.x86_64
事前準備
git clone
$ git clone https://github.com/hansode/ruby-rpm
ruby.rpmはlibyamlに依存しているので、epelをインストールしておく
$ sudo rpm -Uvh http://dlc.wakame.axsh.jp.s3-website-us-east-1.amazonaws.com/epel-release
パッケージインストール
x86_64の場合
$ sudo rpm -ivh ruby-rpm/6/x86_64/ruby-2.1.0-2.el6.x86_64.rpm
i*86の場合
$ sudo rpm -ivh ruby-rpm/6/i386/ruby-2.1.0-2.el6.i386.rpm
あとがき

2.1からはバージョニングポリシーが変わった?

参考文献



編集
@hansode at 10:00|PermalinkComments(0)TrackBack(0)

2013年07月01日

このエントリーをはてなブックマークに追加

世間では余り使われてないのか

test(1)コマンドによる変数の中身やファイル・ディレクトリの存在有無を確認する方法は、良く知られている気がする。しかし、functionに関して触れらてるエントリを見かけないので、ここに書いておく。

declareかtypesetの出番

declareとtypeset、どちらでも良い。同じ意味。自分は何となくな理由で declare を使っている。

declare -f [name]

サンプルコード

#!/bin/bash

function defined_func() { :; }

declare -f defined_func
echo $? # should be zero

declare -f undefined_func
echo $? # should be non-zero

実行結果は、こうなる。

defined_func ()
{
    :
}
0
1
結果まとめ
項目declare -f 実行結果終了ステータス
定義済み関数の内容0
未定義無し1

もしも関数の内容を表示させたくない場合は /dev/null へリダイレクトすれば良い。

declare -f [name] >/dev/null
使い所は?

declare -f [name] を上手く使うと、bashでDSLが可能になって来る。bashでDSLのネタを書く為の前提エントリとして書いたのが、本エントリ。次回、bash-DSLエントリをお楽しみに?

続きを読む


編集
@hansode at 13:00|PermalinkComments(0)TrackBack(0)

2013年06月30日

このエントリーをはてなブックマークに追加

個人見解: 大半は "$@" にしておけば、期待する動作となる

幾つかスクリプトを書いて来て、気を付けておいた方が良かったことの1つが、$@の扱い。$@ と "$@" は、内部処理では大きく違う。サンプルコードと結果を、まとめてみた。

dump-vers.sh

#!/bin/bash
#
# $ dump-vers.sh [args]
#

function dump_vers() {
  while [[ "$1" ]]; do
    echo "'$1'"
    shift
  done
}

echo '#1'; dump_vers $@
echo
echo '#2'; dump_vers "$@"

実行例1: " なし

$ ./dump-vers.sh a b c d
#1
'a'
'b'
'c'
'd'

#2
'a'
'b'
'c'
'd'
  • #1 引数4つ
  • #2 引数2つ

実行例2: " あり

$ ./dump-vers.sh "a b" "c d"
#1
'a'
'b'
'c'
'd'

#2
'a b'
'c d'
  • #1 引数4つ
  • #2 引数2つ
まとめ
引数#1#2
実行例1a b c d44
実行例2"a b" "c d"42

大半は "$@" にしておけば、期待する動作となる。

続きを読む


編集
@hansode at 15:00|PermalinkComments(0)TrackBack(0)

2012年03月06日

このエントリーをはてなブックマークに追加

フォルダに日本語が入ってる時に"make html"が失敗する

Sphinxを利用してドキュメントを作成していたら、make htmlに失敗する現象に遭遇した。

$ make html
sphinx-build -b html -d _build/doctrees   . _build/html
Running Sphinx v1.1.2
WARNING: the config value '__file__' is set to a string with non-ASCII characters; this can lead to Unicode errors occurring. Please use Unicode strings, e.g. u'Content'.
loading pickled environment... not yet created
building [html]: targets for 4 source files that are out of date
updating environment: 4 added, 0 changed, 0 removed
reading sources... [ 25%] cloud-client
Exception occurred:
  File "/usr/lib/python2.6/site-packages/Sphinx-1.1.2-py2.6.egg/sphinx/environment.py", line 758, in read_doc
    pub.set_source(None, src_path.encode(fs_encoding))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 73: ordinal not in range(128)
The full traceback has been saved in /tmp/sphinx-err-Cg4EMC.log, if you want to report the issue to the developers.
Please also report this if it was a user error, so that a better error message can be provided next time.
Either send bugs to the mailing list at <http: groups.google.com="" group="" sphinx-dev=""></http:>,
or report them in the tracker at <http: bitbucket.org="" birkenfeld="" sphinx="" issues=""></http:>. Thanks!
make: *** [html] Error 1

幾つか試してみると、失敗する時は、フォルダ名に日本語が入っている。 この辺を検索してみると、同じように日本語フォルダ/ファイル名問題に失敗してる事例を発見。

Sphinx翻訳ハッカソン(2011/3/19)

手元の環境にhttp://paste.pocoo.org/show/355901/を適用してみると動かない。これはSphinxのバージョン差異が問題だった。

  • Sphinx 1.0.7

上記パッチを参考に書いたのが、下記検証環境において動作確認したパッチ。

検証環境
  • CYGWIN_NT-6.1
  • Python 2.6.5
  • Sphinx 1.1.2
Sphinx-1.1.2-py2.6.patch(日本語フォルダ/ファイル名を扱えるようにするパッチ)
あとがき

本パッチのベースとなるパッチを作成・公開して下さった @shimizukawa 様、ありがとうございます。

続きを読む


編集
@hansode at 13:00|PermalinkComments(0)TrackBack(0)

2011年11月01日

このエントリーをはてなブックマークに追加

インターネット非接続環境でgemパッケージをインストールする必要があった

要件は下記の通り。

  • インストール作業対象は、インターネット非接続環境
  • gemパッケージはbundlerで管理

『恐らくローカルリポジトリを作成出来れば解決出来るだろう』と考え、gemコマンドを調査。


$ gem help commands
GEM commands are:

...
    generate_index    Generates the index files for a gem server directory
...

helpの中にgenerate_indexコマンドを発見。 調査・検証後、ローカルgemリポジトリを作成可能である事が判明した。 下記は、ローカルgemリポジトリ構築手順をまとめたものである。

検証環境
  • Ubuntu 10.04.3 Server LTS
  • ruby 1.8.7
  • rubygems 1.3.7
作業概要

後に登場する"gem generate_index"コマンドは、"gems/"にgemファイルがある事を期待している。 よって、gemsディレクトリを作成し、gemsディレクトリにgemファイルを配置する。

  1. gemsディレクトリ作成
  2. gemsディレクトリにgemファイルを配置
  3. gem generate_indexを実行
作業内容

gemsディレクトリ作成


$ mkdir gems/

gemsディレクトリにgemファイルを配置。サンプルとして bundler を配置。


$ cd gems/
$ wget http://rubygems.org/downloads/bundler-1.0.21.gem
$ cd ../

gem generate_indexを実行


$ gem generate_index

生成されたインデックス、およびメタデータ、階層構造を確認


$ find .
.
./Marshal.4.8
./Marshal.4.8.Z
./gems
./gems/builder-3.0.0.gem
./latest_specs.4.8
./latest_specs.4.8.gz
./prerelease_specs.4.8
./prerelease_specs.4.8.gz
./quick
./quick/Marshal.4.8
./quick/Marshal.4.8/builder-3.0.0.gemspec.rz
./quick/builder-3.0.0.gemspec.rz
./quick/index
./quick/index.rz
./quick/latest_index
./quick/latest_index.rz
./specs.4.8
./specs.4.8.gz
./yaml
./yaml.Z
ローカルリポジトリを使うには

gem sourceコマンドで指定


$ gem source -a file://`pwd`/
$ gem source -a file:///path/to/local-gems/

bundlerを使う場合は、Gemfile


source "file:///path/to/local-gems/"

どうにかして生成したローカルリポジトリをインターネット非接続環境へ配置すれば、 インターネット接続環境のような状態でgemパッケージをインストール出来る。

あとがき

納品物など、ローカルリポジトリ形式で梱包してしまうのは便利かも知れない。

続きを読む


編集
@hansode at 11:30|PermalinkComments(0)TrackBack(0)

2010年07月26日

このエントリーをはてなブックマークに追加

PHPからcurlを使うと何が良いのかは不明

要望があったので設定。

▼検証環境

  • Ubuntu-8.04 LTS
  • Linux 2.6.24-6-xen

▼環境構築


$ sudo apt-get install php5-curl
$ sudo /etc/init.d/apache2 restart

▼テストコード


<?php

if ($ch = curl_init('http://www.google.com/')) {
  echo curl_exec($ch);
  curl_close($ch);
}

この場合、Googleのトップページが表示されれば良い。




編集
@hansode at 14:40|PermalinkComments(0)TrackBack(0)

2010年04月16日

このエントリーをはてなブックマークに追加

[SMTP][tcpdump] SMTPのデータストリームをダンプ』のRuby版

tcpdumpコマンド + stringsコマンドだとゴミが混じる。
ゴミ掃除とRubyの練習目的に下記スクリプトを書いた。

▼smtpdump.rb

#!/usr/bin/env ruby

require 'pcap'
require 'pcaplet'

port = 25
nic  = 'eth0'

smtpdump    = Pcaplet.new("-n -i #{nic} -s 8192")
smtp_filter = Pcap::Filter.new("tcp port #{port}", smtpdump.capture)
smtpdump.add_filter(smtp_filter)

smtpdump.each_packet do |pkt|
  next if pkt.tcp_data_len == 0
  case pkt.sport
    when port
      prefix = 'S'
    else
      prefix = 'C'
    end
  pkt.tcp_data.to_s.split("\n").each { |line| puts "#{prefix}:#{line}\n" }
end



編集
@hansode at 18:00|PermalinkComments(0)TrackBack(0)