RECOMMEND

ハッカーと画家
ハッカーと画家
プログラマ必読。→感想


C言語ポインタ完全制覇
C言語ポインタ完全制覇
C言語 対ポインタ最強兵器。
感想

COUNTER

MONTHLY

CATEGORIES

RECENT ENTRIES

RECENT COMMENTS

RECENT TRACKBACKS

twitter

Twitterボタン

APPENDIX

sugarball

こまごまと、プログラミング関係のtipsを。

[スポンサー広告]スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[UNIX]コマンドの絶対パスを知る(whichコマンド) 

unixやlinuxを使っていると、たまに「このコマンドってどこのディレクトリにあったっけ?」というように、絶対パスがわからなくなる時があります。

まぁ、基本的にfindコマンドで検索すれば良いのですが、例えば2箇所以上にインストールされていて、どちらもパスが通っているコマンドだと、どちらのコマンドが使われているかわからなくなってしまいます。

そんな時は、whichコマンドで絶対パスを取得しましょう。
$ which gawk
/usr/bin/gawk  …コマンドの絶対パスが表示される
スポンサーサイト

[UNIX]コマンドやスクリプトの実行時間を計測する 

UNIXをいじっていると、「このスクリプトは一体何分かかるんだろう?」とか、コマンドやスクリプトの実行時間を計測したくなるケースがあります。そんなときに使えるのがtimeコマンド。
$ time script.sh  ← timeコマンドの引数に、時間を計測したいコマンドを渡す

real 0m0.062s  ← script.shを実行するのにかかった時間
user 0m0.030s  ← script.shを実行したときにユーザモードだった時間
sys 0m0.030s  ← script.shを実行したときにカーネルモードだった時間

ということで、「real」の値がスクリプトを実行するのにかかった時間ということですね。
(参考:Manpage of TIME

ちなみに、timeコマンドを使わないと
$date; script.sh; date
Fri Dec 14 01:42:16 2007
(script.shの実行結果)
Fri Dec 14 01:42:16 2007
のようにおバカなことやってしまいがちです。やっぱり、timeコマンドを使った方がいいですね。

ところで、Solarisの場合はtimeコマンドの他にtimexコマンドというtimeコマンドよりも高機能(っぽい)ものがあるみたいです。

[UNIX]シェルで文字列変数をコマンドとして実行する(eval、exec) 

シェルで文字列変数に実行したいコマンドを格納したはいいけど、「どうやって実行すんの?」みたいな状況になったときに使えるのがevalコマンドとexecコマンドです。
$ HENSU="ls" ←この「HENSU」をコマンドとして実行したい。。

使い方は簡単で、
$ eval $HENSU
data1.txt ← lsコマンドの結果が表示される
のように、コマンドとして実行したい文字列変数をevalコマンドの引数に指定すればOKです。上記の例では、evalコマンドを使用しましたが、execコマンドを使用することでも、ほぼ同様の結果を得ることができます。

しかし、execコマンドを使用する場合は、コマンドの実行結果が表示された直後にシェルが終了してしまうので注意が必要です。
(参考:Manpage of EXEC
$ exec $HENSU
data1.txt ← lsコマンドの結果が表示される
※ここでシェルが終了してしまう

[UNIX]絶対パスで固められたtarファイルを任意のディレクトリに展開する 

普通、絶対パスで固められたtarファイルを展開するとき、展開先を選択できないのですが、展開時にtarコマンドの「-C」オプションを使用することで任意のディレクトリに展開することができます。
(tarファイルの作成)
$ pwd
/home
$ tar cvf ./absolute.tar /export/home/user/test.txt
… カレントディレクトリ(/home)にabsolute.tarが作成されます。 …

(tarファイルの展開)
$ tar xvf ./absolute.tar -C /tmp
… /tmp/export/home/user/test.txt が作成されます。 …

絶対パスで展開してしまうと、上書きされたくないファイルが上書きされたりなんて事を避けたい場合に使えます。

しかし、tarコマンドのバージョンによっては「-C」オプションに対応していないものもあるので注意が必要です。

[UNIX]scpでパスワードを自動化(cygwinでexpect) 

UNIXやLinuxでscpコマンドを使う場合、パスワードの入力を求められます。こんな感じで。
$ scp data.txt user@192.168.0.3:/tmp/
user@192.168.0.3's password:

で、これが結構曲者で、スクリプトなんかでscpによるファイルコピーを自動化したい場合、一筋縄ではいきません。というのも、毎回パスワードを聞かれてしまうので、ヒアドキュメントを使っても自動的にパスワードを入力することができません。

そこで登場するのが、expect というコマンドです。expectコマンドは、対話型によるコマンドライン入力の自動化を可能にするコマンドです。例えば、suコマンドによるユーザの変更した場合のパスワードの入力まで自動的に行うことが可能です。
(参考:Manpage of EXPECT

で、本題のscpでパスワードを自動化する方法は以下のとおりです。


クライアント(コピー元マシン)からサーバ(コピー先マシン)にscpコマンドによるコピーを行うという状況で説明します。

クライアントは、windowsでもUNIXでもLinuxでも問題ありません。scpとexpectが使えることが前提です。クライアントにwindowsマシンを使用する場合は、cygwinをscpとexpectパッケージを含めた形でインストールすると良いでしょう。

では、data.txtをscpコマンドでサーバにコピーするスクリプトを紹介します。
auto_scp.sh

#!/bin/sh
expect -c ”
spawn scp data.txt user@192.168.0.3:/tmp/
expect {
¥”Are you sure you want to continue connecting (yes/no)?¥” {
send ¥”yes¥r¥”
expect ¥”password:¥”
send ¥”(パスワード)¥r¥”
} ¥”password:¥” {
send ¥”(パスワード)¥r¥”
}
}
interact

で、このauto_scp.shを実行するとサーバの/tmpディレクトリに、data.txtがコピーされます。(「¥r」を半角で入力すると、fc2ブログでは勝手に改行されてしまいます…そんな事情もあるので、「”」と「¥」は全部半角に直してください)

実行すると、こんな感じになります。
$ ./auto_scp.sh
spawn scp data.txt user@192.168.0.3:/tmp/
user@192.168.0.3's password:
data.txt 100% 37 0.0KB/s 00:00



ちなみに、対象のサーバに初めてsshやscpで接続する場合、以下のメッセージが表示されます。
$ ./auto_scp.sh
spawn scp data.txt user@192.168.0.3:/tmp/
The authenticity of host '192.168.0.3 (192.168.0.3)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)?

対象のサーバに初めてsshやscpで接続する場合には、「対象のサーバを知ってるサーバのリストに追加しますよ?」ってことでyes/noを聞かれているので、「yes」と入力することが必要です。2回目以降だと、このyes/noの入力を求められることはありません。(すでに知っているサーバなので)

ちなみに、上で紹介したauto_scp.shは初めての接続の場合でも、それ以降の問題なく使えます。興味がある方は、Manpage of EXPECTを読んでexpectの仕組みを理解すると良いでしょう。


«  | HOME |  »

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。