Linux & Server」カテゴリーアーカイブ

composer モジュールのバージョンの調べ方

composer モジュールのバージョンは composer.lock に記録されていますが、これを取り出すコマンドを考えてみました。

まずは composer コマンドを使う方法。

$ composer show --ansi laravel/framework | less -R

composer--ansi は出力結果を常に色付きにするためのオプションで、less-R は色情報を解釈してカラー表示にしてくれるオプションです。

これだと色んな情報が一度に出力されてしまうので、バージョン番号だけほしいときはちょっと不便。

なので jq を使って JSON ファイルを直接漁る方法も考えてみました。

$ cat composer.lock | jq -r '.packages | map(select(.["name"] == "laravel/framework")) | .[0].version'

jq-r は出力する文字列のダブルクォーテーションを外すためのオプションです。

Hyper-V 上の Fedora が grub2 メニュー後の解像度が切り替わるタイミングで固まる

普段から開発に使っている Hyper-V 上の Fedora 27 が起動しなくなってしまったので、その一時回避策をメモしておきます。

通常 Fedora を起動すると、初めに grub2 のメニューが表示され、タイムアウトで自動的にメニュー項目が選択されると、画面解像度が切り替わって、グラフィカルな進捗バー(スプラッシュ画面と呼ぶらしい)が表示され、その後、ログイン画面が表示されるといった流れになるかと思うのですが、画面解像度が切り替わるタイミングで以下のように上辺に赤いノイズの入った画面が表示され、そのまま固まってしまうという現象が起こりました。
Hyper-V 上の Fedora 27 が起動時に固まったときの様子

CentOS 7 で Let's Encrypt が使えなかったときにやったこと

Let's Encrypt で SSL 証明書を取得するための certbot が CentOS 7 でうまく動かなかったので、そのときにやったことをメモしておきます。

yum でインストールした certbot コマンドを実行すると、次のようなエラーが発生してしまいました。

ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.

pyOpenSSL というモジュールを v0.14 以上にアップデートしてねと書いてあります。
pyOpenSSLcertbot と一緒に yum でインストールしたものが入っていて、バージョンは v0.13.1 でした。
これをアップデートすればよさそうです。

Python モジュールのアップデートには pip コマンドを使います。

$ sudo pip install --upgrade --force-reinstall pyOpenSSL

このとき --force-reinstall を付けないとアップデート後も同じエラーが出てしまいました。

以上で certbot コマンドが使えるようになりました。

PuTTY+tmux 環境で Ctrl+矢印 が効かなかった原因が解ったかも

tmux で <Ctrl+矢印> を使いたい場合は、.tmux.confに以下のように設定しろという記事をよく見かけます。

set-window-option -g xterm-keys on

しかし、PuTTY から SSH アクセスしている時に、この設定をしていても、<Ctrl+矢印> が tmux の中で実行しているプログラムにうまく伝わってくれなくて、そのために Ctrl + 左右キーで vim のタブ切り替えをする という設定が使えず、もう何年も tmux を使うのを諦めていました。

ところが、ようやくxterm-keysの意味と、PuTTY を使った環境でなぜこの設定が効かなかったのかが解ってきたので、改めてここに記しておきます。

カーソルキーを押したときにpecoの表示がバグる

zsh でコマンド履歴を表示するのに peco を使っているのですが、root ユーザにsuした状況で peco を起動し、選択項目を変更するために上下カーソルキーを押すと、表示が崩れる問題に悩んでいました。12
カーソルキーを使わず、Ctrl + N / Ctrl + P を使えば、表示が崩れないので、しばらくそうしていたのですが、やっと原因となる要素が特定できました。

LANG=en_US.UTF-8 だと崩れるみたいです。

英語に設定されているとどうして崩れるのか、というところまではまだ調べられていないのですが、とりあえず原因が分かったので、対策を講じられそうです。

zsh のコマンド履歴を peco で表示するために、.zshrc に以下のような設定を書いているのですが、

function peco-select-history() {
    local tac
    if which tac &> /dev/null; then
        tac="tac"
    elif which gtac &> /dev/null; then
        tac="gtac"
    else
        tac="tail -r"
    fi

    BUFFER=$(\history -n 1 | eval $tac | peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle clear-screen
}

if which peco &> /dev/null; then
    zle -N peco-select-history
    bindkey '^r' peco-select-history
fi

赤字で示した peco を呼び出している部分に、環境変数LANG=ja_JP.UTF-8を指定するようにしました。

BUFFER=$(\history -n 1 | eval $tac | LANG=ja_JP.UTF-8 peco --query "$LBUFFER")

これで、peco を表示している間だけLANG=ja_JP.UTF-8となり、表示が崩れなくなりました。

  1. Windows 8.1 + PuTTY-GDI で Fedora 21 or CentOS 6.6 + zsh + peco v0.3.2 の環境で発生しました。
  2. PuTTY で使用しているフォントは Ricty for Powerline で、文字コードの設定は UTF-8 で "CJK 用の文字幅を使用する" にチェックを入れています。

SELinuxを有効にした状態でhttpdのDocumentRootを変える方法

昔からの慣例というか癖で、開発マシンの httpd の DocumentRoot を、/mine/www/というところに設定しているのですが、Fedora に SELinux という仕組みが搭載されてから、怒られるようになってしまいました。

調べてみると、新しく設定したドキュメントルートに、httpd がアクセスするための SELinux のラベルが設定されていないのが原因のようで、こちらの記事に対処方法が書いてありました。

基本的にはこの通り実行しただけなのですが、自分の環境だとラベルがちょっと違ったので、それも含めてメモしておきます。
なお、自分の環境は、Fedora 21 で、ドキュメントルートは/mine/www/です。

参考にさせてもらっている記事のやり方にならって、まずは、もともとドキュメントルートに設定されていた/var/www/の設定を見てみます。

$ ls --context /var/ | grep www
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 www/

$ ls --context /var/www/
drwxr-xr-x. root  root  system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin/
drwxr-xr-x. root  root  system_u:object_r:httpd_sys_content_t:s0 html/

参考元の記事と違って、最後にs0というラベルが付いていますね。
これも含めて、新しいドキュメントルートに対し、ラベルを設定します。

今回は Web の開発マシンということで、どこでも CGI が動くようにしたいので、cgi-binに設定されているラベルを適用したいと思います。

$ sudo chcon system_u:object_r:httpd_sys_script_exec_t:s0 /mine/www/ -R
$ ls --context /mine/ | grep www
drwxrwxr-x. root  developers  system_u:object_r:httpd_sys_script_exec_t:s0 www/

ちなみにs0無しでやってみたら、設定が適用されませんでした。

設定ができたら、httpd を再起動してみます。

$ sudo systemctl restart httpd.service

特に怒られなければ成功です。

GNU Screenの上でSSHすると文字入力が変になるサーバーがある

普段作業マシンで GNU Screen を使っていて、もちろん .screenrc は秘伝のタレ状態で、その状態で他人の用意したサーバーに SSH でアクセスしたときの話。
文字入力がなんか変で、バックスペースが効かなかったり、カーソルキーを押すと直前の文字が繰り返し入力されたりということがたまにあります。

なんでだろうと思っていたら、SSH セッションを閉じたときに、次のように表示されました。

'screen-256color-bce': unknown terminal type.

どうもサーバーさんにscreen-256color-bceという定義が見付からないらしいです。

screen-256color-bceというのは、screen を起動したときにTERMという環境変数に設定される値で、おそらく .screenrc の以下の設定項目から作られています。

~/.screenrc
defbce on
term screen-256color

なんでこんな設定をしたかというと、vim で 256 色表示を使いたかったからなのですが、一時的に作業する他人のマシンでまでこの設定を維持する必要は無いので、ログインしたらすぐに

$ TERM=xterm

と入力すればTERMの値が変更されて、文字入力も希望している通りに認識されるようになります。

サーバーによってはxterm-256colorだったら受け入れてくれたりするので、

$ TERM=xterm-256color

も試してみる価値あるかも。

一度しかアクセスしないサーバーならこれでもいいけど、何度もこれやるのは面倒だなあと思ったら、SSH コマンドを打つときにTERMを指定する方法もあります。

$ TERM=xterm-256color ssh user@hostname -p 2222

相手のサーバーでTERMの値がscreen-256color-bceになってる理由は、まず screen が screen を実行したマシンのシェルの環境変数TERMを設定していて、これが SSH によってサーバーに渡されて、サーバー側のシェルの環境変数に設定されているので、SSH で繋ぐ直前にTERMの値を変えてしまおうというわけです。
コマンドを実行するときに代入した変数の値は、そのコマンドが終了すると破棄されるので、クライアント側のマシンには影響ありません。

この方法だったら、シェルの履歴からアクセスしたり、シェルスクリプト書いたり、エイリアス書いたりすれば入力が省略できますね。

他にも .screenrc をちゃんとする方法とか、~/.ssh/config を使った設定方法とかもありそうだけど、今回はここまで。