10 Jan 2014, 12:56

taskwarriorでタスクにメモを書くシェルスクリプト

最近は、タスク管理のために taskwarriorを利用しています。

タスクに対してメモをつけたいと思い、メモする方法を調べました。簡単にメモするならば、以下で注釈を追加

task 20 annotate hoehoge

もっとがっつり書きたいと調べたところ、以下のような記事を発見。

スクリプトを起動してメモを作成する方法です。さっそく参考にしました。

${HOME}/Documents/wiki/tasks/commentsにメモ保存用ディレクトリ作成

mkdir -p ${HOME}/Documents/wiki/tasks/comments

以下のようなスクリプトを作成

task idを指定してコマンドを実行すると、Descriptionに c が追加されて、メモをエディタで開けます。

$ taskcomments 20

20 Apr 2013, 07:50

Expect コマンドでパスワードなしでログインする方法(telnet,ssh,scp)

前回、sshを使ってパスワードなしでログインする方法を書きましたが、linuxのコマンド”expect”を利用することでも、パスワードなしでログインできたのでメモします。

環境

前回と同じように、CygwinからUbunsuサーバに接続してみる。

  • 接続先: ubuntu
  • 接続元: cygwin

expectコマンドの紹介

expectコマンドは対話型シェルを実現するためのコマンド。デフォルトでは入っていないようなので、手に入れる。インストール方法は省略します。

覚えるべきコマンドは以下の5つ。

  • set timeout
    設定した秒数の間、標準入力から応答がないとexpectは、終了します。
  • spawn
    自動で実行したいコマンドを指定します。
  • expect
    指定された文字列を待ちます。
  • send
    指定された文字列(「”」に囲まれた文字)を先に実行したコマンドのジョブに送信します。
  • interact
    実行ジョブの標準入出力をキーボードと画面にします。端末からログインしたのと同じ状態になります。

サンプルスクリプト

telnet,ssh,scpでのパスワードなし接続方法を書きます。
ubuntuサーバにtsu-neraユーザでログインします。

telnet

#!/bin/bash

# ログイン情報を入力
hostname=ubuntu
username=tsu-nera
password=*********

# expect コマンドを実行
expect -c "
# タイムアウト値の指定
set timeout 20
# spawnで新しいジョブ生成
spawn telnet $hostname

# login
expect login:
send \"$username\n\"
expect Password:
send \"$password\n\"

# spawnジョブを通常の通信にする
interact
"

ssh

#!/bin/bash

# ログイン情報を入力
hostname=ubuntu
username=tsu-nera
password=*********

# expect コマンドを実行
expect -c "
# タイムアウト値の指定
set timeout 20
# spawnで新しいジョブ生成
spawn ssh -l $username $hostname

# login
expect password:
send \"$password\n\"

# spawnジョブを通常の通信にする
interact
"

scp

ファイルパスは第一引数で指定します。

#!/bin/bash

# ログイン情報を入力
hostname=ubuntu
username=tsu-nera
password=*********

# ファイルパスは第一引数で
if [ "$1" != "" ]; then
    filepass=$1
else
    echo "Error: Input File Path"
    exit 1
fi

# expect コマンドを実行
expect -c "
# タイムアウト値の指定
set timeout 20
# spawnで新しいジョブ生成
spawn scp $username@$hostname:$filepass .

# login
expect password:
send \"$password\n\"

expect $
"
exit 0

17 Apr 2013, 23:15

リモートシェルの終了ステータス確認する方法のメモ

rshを利用してリモートホスト上のシェルスクリプトを実行すると、シェルスクリプトの成功・失敗にかかわらず終了ステータスはrst/sshの終了ステータスが返る。たとえば、リモートシェルが失敗した場合でも、通信が成功すると、終了ステータスは成功となる。

たとえは、これだと終了ステータスは正常終了の0がかえる。

#!/bin/bash
rsh tsu-nera@192.168.118.129 fail_shell
echo "$?"

こんなときは、コマンド実行結果をローカルファイルにリダイレクトして、その中身を見てみるとよい。ローカル側で $? が解釈されないように\$?とする必要があることに注意。

#!/bin/bash

# リモートシェル実行
rsh tsu-nera@192.168.118.129 "~/bin/fail_shell;echo \$?" > tmp

# ファイル出力から変数に代入
tail -n 1 tmp >> tmp2; rm tmp
read RESULT < tmp2;    rm tmp2

# 結果判定
if [ $RESULT -eq 0 ]; then
    echo "Shell Sucess"
    exit 0
else
    echo "Shell failed"
    exit 1
fi

もっとシンプルな書き方がある気がする。。。