Archive : 2011-11

NOV
24

Cygwinを捨てたWindowsのCUI環境

Published:2011-11-24 23:00:39 UTC

いますぐコマンドプロンプトを捨てて、Cygwinを使うべき10+の理由 – ブックマクロ開発に

「コマンドプロンプトからCygwinへ」の記事への補足 – ブックマクロ開発に

CygwinはWindows環境にそのままLinuxCUIツールを導入できる。もう「コマンドプロンプト」に拘る必要は薄くなりました。僕は今年1年の一番の収穫はCygwinを使ったこと。Cygwinを使うことでターミナルを使いこなせるようになった。そしてMacに移行してもターミナルさえあるから困らないと思えるようになりました。

cygwinが進化していることを知らなかったので、このエントリは勉強になったのですが、まぁでもラップトップ用のDDR3メモリ4GB*2ですら三千円程で買えるこのご時世、もうcygwinで無理にWindows上にUNIXライクなインターフェイスを作る必要はないんじゃないかな、と思います。CUI環境がほしければ、VirtualBoxにLinux入れてSSH、あとはMinGW/MSYSでカバーすればよい、というのが自分の意見。や、元記事もMinGWいいよね、と言ってますし、ケンカ売りたいわけじゃないです。念の為。あくまで個人の生活スタイルとか、趣味で決まる問題ですが、まぁ自分はこうしてるよ、というメモとして。

自分が手元にUNIXライクなインターフェイスを持った環境を求める理由は、生活環境(Explorerなんて要らない!全部CUIで操作する!みたいな)というよりは、Linux上で動かすアプリケーションの開発用、という面が強いのですが、そうした場合、開発環境は本番環境となるべく似た環境で揃えた方が、後でいざテストの段階になった時に環境起因の問題にぶつかりにくくてやりやすいです。一番良いのは本番環境と同じディストリ、同じパッケージをインストールした環境を用意することで、そういった点では、cygwinは、どんなに進化してもcygwinであって、Linuxではないので、使いにくいな、と。元記事の人はその役割をグローバルIPのついた外のホストに求めているようですが、何時でも接続性が得られるとも限りませんし、手元にあった方がSSHの反応良くて良いです。つまり、Cygwinの代わりにMinGW/MSYSを使い、外のホストの代わりに、VMを使っているイメージですね。

LinuxをホストOSとしてしまうのもいいな、とは思うのですが、その点については、自分はC#とVisual Studioが大好きという理由で、今のところ踏み切ってません。

そんなわけでWindowsから離れられない自分のCUIがらみの環境はこんな感じ:

  • VirtualBox
  • VboxHeadlessTray
  • Ubuntu Desktop
  • MinGW/MSYS
    • open-ssh
    • mintty
  • MsysGit
  • Putty
  • PowerShell

VirtualBox

image

言わずと知れた、ホストハイパーバイザ。VMware Playerと比べて、こちらのほうが自分はGUI的に好きで選びました。VMのNICは、eth0がNAT、eth1がHost Only Adapter、eth2,3は必要に応じて内部ネットワークに充てたり、という構成にしています。

eth0はVMからインターネットに抜ける用で、VMはDHCPでIP他を受け取るようにするとよいでしょう。但し悲しいかな、DNS Proxy的な機能は提供されていないようで、DHCPでは、ホストOSが使っているDNSのアドレスが直接振ってきます。そのため、ホストOSのネットワーク環境が変わると、名前解決が出来なくなります。その場合は、ゲストOS側で、例えばUbuntuなら

sudo dhclient eth0

とかやってやる必要があります。ちょっとイケてないですね。。Windowsのインターネット接続共有を使えば、解決できるかも?

eth1はホストOSからSSHする用で、こちらは固定IPにしています。このIPをWindowsのhostsファイルにIPとホスト名の対応を書いて多くと色々楽です。元記事ではVMware PlayerでTCPのコネクションがよく切れると言っていますが、VirtualBoxでは特に感じたことはないです。Mintty/MSYSからVirtualBox上のVMにSSHした状態でラップトップをスリープさせても、特に切れることなく復帰できます。

リモートデスクトップも、仮想マシンのディスプレイの設定のところから設定可能で、これを設定しておくと、後述のVboxHeadlessTrayでタスクトレイに格納した状態でも適宜画面を呼び出せて便利です。

VboxHeadlessTray

image

VirtualBoxをタスクトレイに格納可能にするユーティリティです。VirtualBox、タスクバーに常時出ているとちょっと邪魔ですしね。スタートアップで起動するようにしておけば、Windows再起動時にVMをいちいち立ち上げるよっこらせ感がなくなります。タスクトレイアイコンのコンテキストメニューから、VMにRDP張れたり、VMのサスペンドが出来たりするのも便利です。

Ubuntu

色々楽です。Cygwinだと、何かうまくいかないときに、Cygwinだから悪いのか、自分のミスかの切り分けが発生しますが、そういうのが無いのが何より良いですね。

MinGW/MSYS

  • msys-openssh

インストールはmingw-get installでmsys-opensshパッケージをインストール。Linuxで使っていた~/.ssh/configがそのまま持ち込めて便利です。msys-opensshパッケージではsshコマンドのほかに、scpとssh-agentコマンドも提供されており、scpでのファイル転送や、秘密鍵のメモリ上へのキャッシュが出来て便利です。ssh-agentといえば、lazy-ssh-agentという秘密鍵のパスフレーズの入力を必要になるまで遅延させてくれるスクリプトが非常に便利でLinux環境では重宝しているのですが、MinGW/MSYS環境でも使いたいよね、ということで、ちょっと手直しして使ってます。いやほんと、Linux使いもMinGW/MSYS使いもCygwin使いもみんな使うべき。便利だから。

#!/bin/sh 
# lazy-ssh-agent: 
#   run single ssh-agent (per host) on first ssh/scp/sftp attempt 
# 
# usage: 
#  first, place this script into a $PATH dir. 
# 
#  (in .{bash,zsh}rc) 
#   eval `lazy-ssh-agent setup ssh scp sftp` 
# 
#  (in .{bash_,z}logout) 
#   eval `lazy-ssh-agent clean` 
# 
#  (in .bash_profile ; when you are using zsh not as the login shell) 
#   ZSH=`which zsh` 
#   if [ -x "$ZSH" ]; then 
#       exec "$ZSH" -l 
#   fi 
# 
# Author : 7bit <http://nanabit.net/> 
# History: 
#   20090405 first release 
#   20111117 modified to run in MSYS by shiroica <http://blog.sharplab.net/>

umask 0066

SSH_AGENT_DIR=~/.sshagent 
SSH_AGENT_FILE=$SSH_AGENT_DIR/.$(hostname)

if [ "$1" = "clean" ]; then 
  ps -s -u "$USER" | awk 'NR!=1{print $1, $4;}' | grep -E '^[0-9]+ /usr/bin/ssh-agent$' | \ 
    awk '{print $1}' | while read LINE; do 
    kill "$LINE" 
  done 
  test -f "$SSH_AGENT_FILE" && rm "$SSH_AGENT_FILE" 
  echo 'unset SSH_AGENT_PID; unset SSH_AUTH_SOCK;' 
  exit 
fi

if [ "$1" = "setup" ]; then 
  shift 1 
  for SSHCMD in "$@"; do 
    echo "alias $SSHCMD='';" 
    echo "unalias $SSHCMD;" 
    echo "ORIGINAL_SSH_$SSHCMD=$(which $SSHCMD);" 
    echo "alias $SSHCMD='eval \$(lazy-ssh-agent) || ssh-add; '"'$ORIGINAL_SSH_'"$SSHCMD ;" 
  done 
  exit 
fi

if [ ! -d "$SSH_AGENT_DIR" ]; then mkdir -p "$SSH_AGENT_DIR"; fi

function reuse_ssh_agent() { 
  FOUND=0 
  # try to use existing ssh-agent 
  if [ -f "$SSH_AGENT_FILE" ]; then 
    F=$(cat "$1") 
    eval "$F"

    # kill extra ssh-agent 
    ps -s -u "$USER" | awk 'NR!=1{print $1, $4;}' | grep -E '^[0-9]+ /usr/bin/ssh-agent$' | \ 
      awk '{print $1}' | while read LINE; do 
      test "$LINE" -ne "$SSH_AGENT_PID" && kill "$LINE" 
      #echo "echo 'killed $LINE';" 
    done

    # find SSH_AGENT_PID process 
    FOUND=$(ps -s -u "$USER" | awk 'NR!=1{print $1, $4;}' | grep -E '^[0-9]+ /usr/bin/ssh-agent$' | \ 
      awk '{print $1}'| grep "$SSH_AGENT_PID" | wc -l) # should be 1 (header line, result line) 
  fi

  test "$FOUND" -eq 1 
}

reuse_ssh_agent "$SSH_AGENT_FILE" 
RET=$? 
if [ "$RET" -eq 0 ]; then 
  #echo "echo found: $SSH_AGENT_PID;" 
  cat "$SSH_AGENT_FILE" 
  echo "true" 
else 
  #echo "echo re-exec;" 
  ssh-agent | head -n 2 > "$SSH_AGENT_FILE" 
  reuse_ssh_agent "$SSH_AGENT_FILE" 
  #echo "echo 'and done $? ($SSH_AGENT_PID)';" 
  cat "$SSH_AGENT_FILE" 
  echo "false" # connect like: eval `lazy-ssh-agent` || ssh-add 
fi

psコマンドの出力まわりの扱いを変えてます。

  • msys-rsync

差分ファイル転送、便利ですよね。ちゃんとrsyncも提供されてます。

  • msys-mintty

image

MinTTY!これのAero Glass表示が使いたいがためにMinGW/MSYS環境を整えたといっても過言ではありません。いや、後で気づいたのですが、Puttyでも最近はAero Glass表示ができるようになったらしいですが。。

MsysGit

これはmingw-getコマンドで落ちてきません。MsysGitという別プロジェクトのようで、別途インストールする必要があります。どうしてこうなった。。こちらのGitBashというコンソールは使いにくいので、MSYSのMinTTYから使えるよう、MSYS環境側でパスを通しておいています。

Putty

「なんだよ結局Putty使うのかよ!」と怒られそうですが。うん、ルータやスイッチの設定とかでシリアルポートとる時に必要だから。。誰かMSYS環境だけでシリアルをとる方法をご存知の方、教えてください。そこでCygwinですよ!とか言われそうですが。。上でも述べましたが、最近のPuttyはAero Glass表示に対応しています

PowerShell

やっぱWindows使うならCUIの本命はPowerShellでしょう。Ctrl+Lとかが効かないのが辛いところですが、C#で書いたアセンブリとの親和性もよく、便利な筈です・・・・。すいません、あまり使ってません。。

 

以上、Cygwin捨ててもWindowsで幸せになれるよね、という一例として。