• カテゴリー別アーカイブ Linux
  • cygwinのログインシェルをbashにする

    cygwin上のzshのプロンプトがおかしいのでカスタマイズしてみるの続きです。

    せっかくzshを入れたのは良いものの、このままではbashが起動してからzshを毎回起動しなければなりません。
    大概こういうときは、chshコマンドを使うのですが、どうやらcygwinには含まれないようです。

    /etc/passwdがない…!

    では直接/etc/passwdファイルを弄ろうとなる訳ですが、実はこのファイルが存在しないわけです。
    コマンドのファイルもない…詰んだ状態ですが、無ければ作りましょう。

    
    $ man mkpasswd
    
    

    としてマニュアルを読んでみると、

    
    Don't use this command to generate a local /etc/passwd file, unless you
    really need one. See the Cygwin User's Guide for more information.
    
    

    と、このコマンドを使うなと書かれていますね。
    しかし、See the Cygwin User’s Guideってことで見てみましたが、他の方法が見当たらない。
    ググってみると以下のページがヒットしました。

    Set Default Shell in Cygwin – Stack Overflow

    /etc/nsswitch.confを編集するのが良さそうです。

    
    $ vim /etc/nsswitch.conf
    
    db_shell: /bin/zsh
    
    

    このような感じで設定すれば、無事ログインシェルが変わります。


  • cygwin上のzshのプロンプトがおかしいのでカスタマイズしてみる

    zshを入れてみた

    cygwinの標準シェルはbashですが、zshを使おうと思ってzshを入れたは良いものの、bashのプロンプトをそのまま流用されてしまって変なことに。

    見事にエスケープ文字がそのまま出力されています…
    せっかくなのでzshのプロンプトをカスタマイズすることにします。

    カスタマイズと言っても…

    細かい設定は一旦置いといて、テーマで設定することにしてみます。

    $ man zshall
    

    と入力してマニュアルを表示してみると、

           promptinit
                  a prompt theme system for changing prompts easily, see the section `Prompt Themes'
    

    どうやらpromptinitと言うものがあるらしい。
    see the section Prompt Themesということなので、下の方の「PROMPT THEMES」を見ます。

    PROMPT THEMES
       Installation
           You should make sure all the functions from the Functions/Prompts directory of the source distribution are available; they all begin with the  string  `prompt_'  except
           for  the special function`promptinit'.  You also need the `colors' function from Functions/Misc.  All of these functions may already have been installed on your system;
           if not, you will need to find them and copy them.  The directory should appear as one of the elements of the fpath array (this should already be the case if  they  were
           installed),  and  at  least  the function promptinit should be autoloaded; it will autoload the rest.  Finally, to initialize the use of the system you need to call the
           promptinit function.  The following code in your .zshrc will arrange for this; assume the functions are stored in the directory ~/myfns:
    
                  fpath=(~/myfns $fpath)
                  autoload -U promptinit
                  promptinit
    
       Theme Selection
           Use the prompt command to select your preferred theme.  This command may be added to your .zshrc following the call to promptinit in order to start  zsh  with  a  theme
           already selected.
    
           prompt [ -c | -l ]
           prompt [ -p | -h ] [ theme ... ]
           prompt [ -s ] theme [ arg ... ]
                  Set  or  examine the prompt theme.  With no options and a theme argument, the theme with that name is set as the current theme.  The available themes are deter‐
                  mined at run time; use the -l option to see a list.  The special theme `random' selects at random one of the available themes and sets your prompt to that.
    
                  In some cases the theme may be modified by one or more arguments, which should be given after the theme name.  See the help for each theme  for  descriptions  of
                  these arguments.
    
                  Options are:
    
                  -c     Show the currently selected theme and its parameters, if any.
                  -l     List all available prompt themes.
                  -p     Preview the theme named by theme, or all themes if no theme is given.
                  -h     Show help for the theme named by theme, or for the prompt function if no theme is given.
                  -s     Set theme as the current theme and save state.
    

    ふむふむ。

    まずインストールが必要なようなので、promptinitを読み込ませましょう。
    一応.zshrcにも追記しておきます。

    $ autoload -U promptinit
    $ promptinit
    

    その後は取りあえず、-p でプレビュー表示して -s で保存すれば使えそうですね。
    では早速プレビューを表示してみます。

    カラフルなテーマがたくさん出てきました。
    この中からよさげなものを選択してみることにします。

    $ prompt -s bigfade red white grey white
    Set and save not yet implemented.  Please ensure your ~/.zshrc
    contains something similar to the following:
    
      autoload -Uz promptinit
      promptinit
      prompt bigfade red white grey white
    

    これでプロンプトのデザインが変わりました!
    言われたとおり、.zshrcも編集しておきましょう。


  • opensuse leap 42.1でVMware Playerの3Dアクセラレーションが有効にならない

    nvidia-gfxG04.conf更新後に、ldconfigを実行する手順を追加しました。(2016/9/23)

    
    

    今、opensuse linux(leap 42.1)を常用OSとして利用しているのですが、その上でVMware Workstation 12 Playerを使って、Windowsも動かしています。
    しかし起動当初から、「No 3D support is available from the host.」と表示され、どうも3Dアクセラレーションが効いていないようでした。
    たしかに動作がカクつく…とは思っていました。

    ちょっと時間も出来たので、重い腰を上げ、いっちょ解決してみようと思い試行錯誤した記録です。

    続きを読む 投稿 ID 1511


  • WeeChatで~(全角チルダ/波ダッシュ)を入力したい(iso-2022-jpなIRCサーバ環境)

    私はWeeChatを使ってIRCを使っています。
    このときに、「~」を入力するとLimeChat等の他のクライアントでは文字化けしてしまうという問題がありました。

    どうにかこれを改善したいと思って試行錯誤した結果、改善できたのでメモしておきます。

    環境

    • WeeChatを起動させているサーバ
      • CentOS7
        • WeeChat 1.4(但し0.x台の頃から変わらない事象です)
        • screen 4.01.00
      • Linuxの$LANGは、ja_JP.UTF-8
      • WeeChatで接続しているチャンネルの文字コードは、iso-2022-jp
      • /set charset.default.decode = “iso-2022-jp”
      • /set charset.default.encode = “iso-2022-jp”
    • WeeChatを表示させているクライアント
      • Windows7
      • cygwin
      • ssh接続でscreenを表示してその上のWeeChatを使用

    クライアントからWeeChatとLimeChat(Windows上で動作するIRCクライアント)を操作し、同じサーバ、同じチャンネルにJOINします。

    問題の事象

    WeeChat上で「~」を入力すると、LimeChatから見ると文字化けします。
    LimeChat上で「~」を入力しても、WeeChatでは文字化けしません。
    ですが、2つの波ダッシュは、WeeChat上では別の文字(波の向きが違う)で表示されます。

    • WeeChatで入力した「~」:wavedash_wee
    • LimeChatで入力した「~」をWeeChatで表示:wavedash_lime

    この事から、Windowsで使われる「~」がLinuxでは扱いが異なっているのではないかと想像できます。
    これについては参考ページが以下の様にいくつかあります。

    解決

    要はWeeChatから入力する「~」をwavedash_weeからwavedash_limeに変換してやればいいわけです。
    そのため、送信時にテキスト置換できるようなスクリプトがないかを調べたところ、「text_replace.py」というスクリプトがあったのでこれを使ってみました。

    以下はWeeChat上での操作です。

    
    /script install text_replace.py
    /set plugins.var.python.text_replace.replacement_pairs "~=~"
    
    

    plugins.var.python.text_replace.replacement_pairsには、=区切りで変換前と変換後のテキストを指定します。

    “~=~”の部分は実際には以下の様に指定します。

    • 左側:普通にWeeChatに入力した「~」
    • 右側:LimeChatで入力した「~」をWeeChatで表示したwavedash_limeをコピーアンドペースト
    • こんな感じ:”wavedash_wee=wavedash_lime

    これで、普通にWeeChatで入力したら文字化けする「~」を、LimeChatで見ても文字化けしない「~」に変換して送信することが出来るようになりました。


  • rsyncでドットファイルだけ同期する

    rsyncの–includeオプションと–excludeオプションを使って実現出来ます。
    –includeと–excludeは記載順で評価順が変わるので注意です。

    rsync -av --include '.**' --exclude '**' /home/username/ remote:~/backup/
    

    みたいな感じです。

    簡単なパラメータの説明をしておくと:

    • –include ‘.**’
      ドットから始まるファイルとディレクトリ以下のファイルを含めます。
    • –exclude ‘**’
      全てのファイルを除外します。

    ちなみに、除外したいドットファイルなどがある場合は、–include ‘.**’の前に記載をする必要があります。


  • さくらVPSではL2TPv3の利用は出来ない

    かなり寝かせてしまったお話なのですが…
    2015年7月頃、ふと何を思ったか、家のネットワークとさくらVPSのネットワークをL2TPv3で結んでみたいと思い立ったので、そそくさと構築してみたことがありました。

    L2TPv3を構築するも…

    家のルータ(VyOS)とさくらVPS上のルータ(VyOS)間でL2TPv3の設定をしてみたのですが、ルータまでは疎通があるのに、LAN配下(家もさくらも)の端末にはpingが飛ばなかったのです。
    家のネットワークについては原因が分かりました。
    VyOSをESXiの上で動かしていたのですが、vSwitchが「無差別モード(プロミスキャスモード)」を有効にしていないとダメだということでした。

    この設定を施してやることでLAN配下の端末への通信が通るようになりました。

    家の中には通信が通ったもののさくらには通信が通らない…

    が、相変わらずさくらVPSの方には通信が出来ません。
    大体原因の予想が付きますよね。
    家と同じで、プロミスキャスモードが有効になっていないのだろうと。

    ただ正確なところは分からないため、一度サポートに問い合わせることにしました。

    VPSのローカルネットワークを構成する仮想スイッチ上でプロミスキャスモードは有効になっていますでしょうか?

    回答は、ブリッジ等ではプロミスキャスモードが有効になっている、とのことでした。
    ただtcpdumpのデータをくれれば原因調査してくれるとのことだったので、ルータと配下のサーバでパケットキャプチャを行って送付したところ、原因不明。

    基盤側でパケット見ることも出来るよ、と言ってくれたのでお言葉に甘えて調査してもらいました。

    原因判明

    最終的に、さくらさんにパケットキャプチャしてもらった結果、こんな回答が返ってきました。

    弊社にてホスト側のtcpdumpを確認した結果、「vyos_sakura」の収容ホストサーバ側のセキュリティ設定によって、パケットがフィルタされていたことが判明いたしました。

    前回までのご案内にて原因の特定に至らず、お手間をおかけいたしましたこと、深くお詫び申し上げます。

    ホストサーバ上ではARP-spoofingや、MAC-Spoofingを防ぐためのセキュリティ設定を導入しており、その影響によりフィルタされておりました。

    セキュリティ設定に関しましては、現時点で変更することが困難でございます。何卒ご了承ください。

    プロミスキャスモードじゃないけどMAC偽装は出来ないよってことで、ファイナルアンサーでした。

    結論

    さくらVPSではおとなしくIPsecとかでVPN張りましょう、ということです。

    いやしかし、こんな格安でサービス提供してくださっている上に、サポートも非常に充実していて、改めて素敵なサービスだと実感しました。
    みなさん、さくらインターネットでクラウド初めてみませんか?

    ※この記事は広告ではありませんw


  • putty.iniからssh_configを生成する(手抜き)スクリプトを作ってみた

    沢山あるPuTTyのホスト設定を移行するのが面倒だったので、かっとなって作りました。

    • PuTTyをiniファイル形式で使っている人用ですが。
    • PuTTyのバージョンによっては使えないかもしれません。
    • 全ての設定を変換するわけではありません。
    • 手抜きなので、Default Settingsも変換します(ご自身で削除して下さい)。
    • bash用です。
    • うまく変換できないときは、putty.iniの改行コードをLFにしてみて下さい。

    変換できる設定は以下のものだけです。

    • セッション名
      • これが接続Hostになりますが、基本的には変換後にご自身で手を入れて頂くのが良いかと。エスケープ文字とかも入ると思うので。
    • 接続先情報(ホスト名、ポート番号)
    • ユーザ名
    • 秘密鍵
      • 但し、末尾の拡張子.ppkは除去します(どうせそのままでは使えないので)。
    • プロキシ(ホスト名・ポート番号)
      • SOCKS4、SOCKS5に限ります。
      • 認証は考えていません。
      • 実際に動作させるためには、connectコマンドを導入している必要があります。
    • トンネル

    スクリプトの変数は以下の様に定めています。
    それ以外は内部で使っているものなので変更はしないで下さい。

    • INIFILE
      • putty.iniのファイル名
    • CONFFILE
      • sshのconfigのファイル名
    • SOCKSCMD
      • connectコマンドのパス
    • TRCMD
      • trコマンドのパス

    実行は、引数を付けずに実行するだけです。
    CONFFILEに指定したファイルに出力しますが、標準出力にも同時に出力します。
    標準出力に何も表示されずにコマンドが終了したときは、putty.iniの改行コードをLFにして再度試してみて下さい。

    
    #!/usr/bin/bash
    
    INIFILE=./putty.ini
    CONFFILE=./p2config
    SOCKSCMD=/usr/bin/connect
    TRCMD=/usr/bin/tr
    
    TMP_PXY_ENABLED=no
    TMP_PXY_HOST=""
    TMP_PXY_PORT=0
    TMP_FWD_LALL=no
    TMP_FWD_RALL=no
    TMP_FWD_LIST=""
    
    cat $INIFILE | while read -r LINE; do
    
        if [[ "$LINE" =~ ^\[Session:(.+)\]$ ]]; then
            TMP_PXY_ENABLED=no
            TMP_PXY_HOST=""
            TMP_PXY_PORT=0
            TMP_FWD_LALL=no
            TMP_FWD_RALL=no
            TMP_FWD_LIST=""
            echo Host ${BASH_REMATCH[1]} | tee -a $CONFFILE
        elif [[ "$LINE" =~ ^HostName=\"(.+)\"$ ]]; then
            echo -e \\tHostName\\t${BASH_REMATCH[1]} | tee -a $CONFFILE
        elif [[ "$LINE" =~ ^PortNumber=([0-9]+)$ ]]; then
            echo -e \\tPort\\t${BASH_REMATCH[1]} | tee -a $CONFFILE
        elif [[ "$LINE" =~ ^UserName=\"(.+)\"$ ]]; then
            echo -e \\tUser\\t${BASH_REMATCH[1]} | tee -a $CONFFILE
        elif [[ "$LINE" =~ ^PublicKeyFile=\"(.+)\.ppk\"$ ]]; then
            echo -e \\tIdentityFile\\t${BASH_REMATCH[1]} | tee -a $CONFFILE
        elif [[ "$LINE" =~ ^ProxyMethod=1|2$ ]]; then
            TMP_PXY_ENABLED=yes
        elif [[ "$LINE" =~ ^ProxyHost=\"(.+)\"$ ]]; then
            TMP_PXY_HOST=${BASH_REMATCH[1]}
        elif [[ "$LINE" =~ ^ProxyPort=([0-9]+)$ ]]; then
            TMP_PXY_PORT=${BASH_REMATCH[1]}
        elif [[ "$LINE" =~ ^LocalPortAcceptAll=1$ ]]; then
            TMP_FWD_LALL=yes
        elif [[ "$LINE" =~ ^RemotePortAcceptAll=1$ ]]; then
            TMP_FWD_RALL=yes
        elif [[ "$LINE" =~ ^PortForwardings=\"(.+)\"$ ]]; then
            TMP_FWD_LIST=${BASH_REMATCH[1]}
        fi
    
        # ProxyCommand
        if [ "$TMP_PXY_PORT" != "no" -a "$TMP_PXY_HOST" != "" -a $TMP_PXY_PORT -ne 0 ]; then
            echo -e \\tProxyCommand\\t$SOCKSCMD -S $TMP_PXY_HOST:$TMP_PXY_PORT %h %p | tee -a $CONFFILE
            TMP_PXY_ENABLED=no
            TMP_PXY_HOST=""
            TMP_PXY_PORT=0
        fi
    
        # PortForward
        if [ "$TMP_FWD_LIST" != "" ]; then
            FWD_LIST=( `echo "$TMP_FWD_LIST" | $TRCMD -s ',' ' '` )
            for ITEM in ${FWD_LIST[@]}; do
                if [[ "$ITEM" =~ ^L([0-9]+)=(.+:[0-9]+)$ ]]; then
                    echo -en \\tLocalForward\\t | tee -a $CONFFILE
                    if [ "$TMP_FWD_LALL" != "no" ]; then
                        echo -n : | tee -a $CONFFILE
                    fi
                    echo -e ${BASH_REMATCH[1]}\\t${BASH_REMATCH[2]} | tee -a $CONFFILE
                fi
                if [[ "$ITEM" =~ ^R([0-9]+)=(.+:[0-9]+)$ ]]; then
                    echo -en \\tRemoteForward\\t | tee -a $CONFFILE
                    if [ "$TMP_FWD_RALL" != "no" ]; then
                        echo -n : | tee -a $CONFFILE
                    fi
                    echo -e ${BASH_REMATCH[1]}\\t${BASH_REMATCH[2]} | tee -a $CONFFILE
                fi
                if [[ "$ITEM" =~ ^D([0-9]+)$ ]]; then
                    echo -e \\tDynamicForward\\t${BASH_REMATCH[1]} | tee -a $CONFFILE
                fi
            done
            TMP_FWD_LALL=no
            TMP_FWD_RALL=no
            TMP_FWD_LIST=""
        fi
    
    done
    
    

    バグ報告は歓迎しますが、修正するとは限りません(ぇ


  • cpanでperlモジュールをサーバ全体で使えるディレクトリにインストールする

    cpanでperlのモジュールをインストールするとき、デフォルトではユーザのホームディレクトリ以下にインストールされます。
    しかしこのままだと、Apache等でモジュールを読むことが出来ずに面倒なことになります。

    そこで、OS全体でパスが通っているディレクトリへインストールをする様に設定を変更します。

    続きを読む 投稿 ID 1511


  • SSHポートフォワード(SSHトンネル)【ローカル・リモート・ダイナミック総集編】

    みんな大好き、SSHトンネル。
    外から接続できないイントラネットのサーバへ、踏み台のSSHサーバ経由で接続できるようにする方法ですね。
    ですがそれはSSHトンネルの1つの使い方に過ぎないのです!

    SSHトンネルは、3つの使い方があります。

    • ローカルフォワード
    • リモートフォワード
    • ダイナミックフォワード

    今日はこの3つの方法について、WindowsのsshクライアントであるPuTTyでの接続方法(おまけでsshコマンドでの接続方法)と、活用例を紹介します。

    続きを読む 投稿 ID 1511


  • CentOS6.4とPX-W3PEで作る録画サーバ

    PLEXから発売されている、地上波*2+BS/CS*2のチューナーを内蔵したテレビチューナーPX-W3PEとLinuxを使ってテレビ録画サーバを構築します。
    これまでPX-W3PEはLinuxドライバが公開されておらずWindowsで使うほかありませんでしたが、2012年9月にはLinuxドライバが公開されており容易に利用出来るようになりました。
    ところが割と最近の公開であるせいか、Linuxで動作させている実例が少ないため、ここで記録しようと思います。

    続きを読む 投稿 ID 1511