アーカイブ

‘Linux’ カテゴリーのアーカイブ

$HOME/.ssh/configでsshを便利に使う

2010 年 8 月 3 日 takus コメントはありません



sshのコマンドを毎回叩くのが面倒なため、aliasに記述する、シェススクリプトを使うといったことをやっていたが、便利そうなものを見つけたので使ってみた。

$HOME/.ssh/config を編集すると、ホスト毎に様々なパラメータ設定して簡単にsshできる。
今回作ったconfigファイルは以下のようなもの。

Host serverA
  User      user_name
  HostName  servera.example.com
  IdentityFile    ~/.ssh/servera_key 
 
Host serverB
  HostName 192.168.0.1
  ProxyCommand ssh serverA nc %h %p
 
Host serverC
  User      user_name
  HostName  serverc.example.com
 
Host *
  EnableSSHKeysign    yes 
  TCPKeepAlive        yes 
  ServerAliveInterval 15
  ServerAliveCountMax 3

こうしておくと、

ssh serverA

とするだけで、serverAにsshできるようになる。

ServerBの設定はServerAを踏み台にして、ServerAと同じLAN内のマシンにsshする際に使える。ただ、踏み台となるマシンにncコマンドが入っていない場合は使うことができない。秘密鍵でなく、パスワードでログインする場合はServerCの設定のようになる。最後にある*は全てのサーバにある設定を使うような場合に設定する。これは必ず一番下に書く必要がある。

参考サイト

SSH_CONFIG (5)
$HOME/.ssh/configを活用していますか?

カテゴリー: Linux タグ:

SSHでポートフォワーディング

2010 年 8 月 1 日 takus コメントはありません

研究室内においてあるLinuxサーバへ自宅から接続したかったのだが、そのサーバはローカルネットワークからの接続しか許可されていないため、

自宅PC(PC) → 認証サーバ(authorize.example.com) → 目的のサーバ(192.168.0.1)

という風に、いったん目的のサーバと同じネットワークにあるコンピュータにログインし、内部ネットワークからの通信としてサーバに接続を行う必要があるため、SSHのポートフォワーディング機能でこれを実現した。

ポートフォワーディングって?

特定のポートに送られてきたデータを、SSHで暗号化した上で、任意のホスト、ポートに対して転送する機能である。この機能は、基本的には外部ホストからLAN内にアクセスしたいが、外部から直接アクセスは危険な場合に使用するのに使われる。具体的には、外部ホストから、
  • LAN内のみからアクセスできるサーバに接続
  • 自宅WindowsPCに外部ホストからリモートデスクトップ接続
のようなことを行うことが可能になる。

手順

目的のサーバ(192.168.1.0)を起動して、認証サーバからSSHできることを確認しておく。

PCのターミナル(puttyなども可能)から認証サーバに接続し、目的のサーバのローカルIP(192.168.0.1)に向けてトンネルを掘る。ちなみに、ここではPCのローカルポート1234を目的のサーバ(192.168.0.1)の22にフォワードしている。

$ ssh -L 1234:192.168.0.1:22 user@authorize.example.com
# SSH -L <ローカルポート番号>:<転送先ホスト>:<転送先ポート番号> <リモートホスト>

ここまでやっておけば、後はターミナルから、

$ ssh -p 1234 user@localhost

とすれば、目的のサーバへSSHが可能になる。


と、ちょっと回りくどいやり方ではあるが一応できるようになった。
ただ毎回やるのは面倒なのでもっと効率的な方法がないか模索していく予定。

カテゴリー: Linux タグ:

文字コード変換コマンドnkfの使い方まとめ

2010 年 7 月 26 日 takus コメントはありません

manを引けば分かる話だが、よく使い方を忘れるので一度まとめてみる。

構文


$ nkf オプション ファイル名 [> 出力ファイル名]

オプション一覧

-j          : JISコード(ISO-2022-JP)を出力
-e           : EUCコードを出力
-s           : Shift-JISコードを出力
-w           : UTF-8コードを出力(BOM無し)
-Lu          : unix改行形式(LF)に変換
-Lw          : windows改行形式(CRLF)に変換
-Lm          : macintosh改行形式(CR)に変換
-g(--guess)  : 自動判別の結果を表示
--overwrite  : 引数のファイルに直接上書き
--version    : バージョン情報を表示(インストール済チェック)

使用例

以下は使い方の例。

文字コードチェック

$ nkf -g example.csv
Shift_JIS


文字コード変換(UTF-8)

$ nkf -w--overwrite example.csv


よくやってしまう失敗例


$ nkf -w example.csv > example.csv

上記のコマンドでは、ファイルの中身が空っぽになってしまう。

上書きでいい場合は–overwriteオプションをつける。

そうでない場合はmvなどでファイル名を変更して使う必要がある。

カテゴリー: Linux, まとめ タグ:

覚えておくと便利なBash Tips

2010 年 7 月 11 日 takus コメントはありません

Bashによる引数の展開

以下のように記述すると、bashによって自然に展開される。


$ cp some/deep/path/{foo,bar}.xml
↓
$ cp some/deep/path/foo.xml some/deep/path/bar.xml


深い階層のファイルをバックアップする場合

普通にコマンドを書くと次のように結構記述が長くなるが、以下のように書くこともできる。


$ cp some/deep/path/hoge.txt some/deep/path/hoge.txt.bak
↓
$ cp some/deep/path/hoge.txt{,.bak}


Bashによる引数の再利用

次のようにファイルをコピーしたうえで、そのファイルをエディタを使って編集などの作業をよく行うことがある。


$ cp some/path/hoge.txt some/path/fuga.txt
$ vi some/path/fuga.txt


このような場合は、特殊変数を使うことで、過去に実施したコマンドの引数を再利用することができる。前述の例では、前述のコピー&編集の流れを次のように記述できる。

$ cp some/path/hoge.txt some/path/fuga.txt
$ vi !:2


基本的に「ビックリマーク+コロン+引数の位置」の組み合わせなので覚えやすい。

カテゴリー: Linux タグ:

デバイスファイル – UNIXリファレンス

2009 年 4 月 22 日 takus コメントはありません

UNIXでは外部装置をファイルとして扱い、このファイルをデバイスファイルと呼ぶ。デバイスファイルは/devに格納されている。

デバイスファイルを確認する


% ls /dev/
acd0  acpi  ad4  ad4s1  ad4s1a  ad4s1b
ad4s1c  ad4s1d  ad4s1e  ad4s1f  agpgart
ata  atkbd0  audit  bpf0  bpsm0  console
consolectl  ctty  cuad0  cuad0.init  cuad0.lock
da0  dcons  devctl  devstat  dgdb  dumpdev
fd  fido  geom.ctl  io  kbd0  kbd1  kbdmux0
klog  kmem  log  mdctl  mem  net  net1
net2  network  nfs4  nfslock
・
・
・



代表的なデバイスファイル

装置用のファイル
デバイス名意味
adIDEハードディスク
acdATAPI CD/DVD装置
usbUSBポート
sysmouseマウス
特殊ファイル
デバイス名意味
stdin標準入力
stdout標準出力
stderr標準エラー出力
nullヌルファイル
randomランダムデータファイル
zeroゼロデータファイル
dsp音源ファイル
sndstat音源チップ情報ファイル
console標準コンソール



カテゴリー: Linux タグ:

スライスとパーティション – UNIXリファレンス

2009 年 4 月 21 日 takus コメントはありません

PC/AT互換機では、一つのHDに複数のOSをインストールすることが可能である。FreeBSDでは、このHDの区切りをの単位を「スライス」と呼ぶ。また、スライスをさらに区切るとき、この分割単位を「パーティション」という。これらはWINDOWSとは呼び方が違うので注意が必要。

スライスとパーティションの確認


% df 
Filesystem   1K-blocks    Used    Avail Capacity  Mounted on
/dev/ad4s1a  10154158  201858  9139968     2%    /
devfs               1       1        0   100%    /dev
/dev/ad4s1f  76213128   49368 70066710     0%    /home
/dev/ad4s1e  50777034 4249974 42464898     9%    /usr
/dev/ad4s1d  10154158  108402  9233424     1%    /var


カテゴリー: Linux タグ:

コマンド履歴 – UNIXリファレンス

2009 年 4 月 21 日 takus コメントはありません

コマンド履歴とは?

シェルは以前に入力したコマンドの情報を保持している

コマンド履歴の呼び出し


% history
     1	21:33	startx
     2	21:47	root
     3	21:48	exit
     4	21:52	startx
     5	21:54	exit
     6	21:59	su
     7	21:59	bye


履歴の実行


% !6


直前の実行コマンドを実行


% !!


以前に入力したコマンドの検索

Esc-p
使い方はTabによる補完と同じ

カテゴリー: Linux タグ:

標準出力と標準エラー出力の違い

2009 年 4 月 18 日 takus コメントはありません

UNIXにおける入出力

標準出力と標準エラー出力の違いを考える前に、C言語でプログラムを書いたことがある人なら一度は聞いたことがあるであろう、標準入力、標準出力、標準エラー出力について簡単にまとめてみる。

標準入力
プログラムへデータを入力するための入り口であり。一般的に、stdin と呼ばれる。通常、キーボードから入力されたデータは標準入力である。

標準出力
プログラムの計算結果などのデータを出力する出力先。こちらは一般的に、stdout とも呼ばれる。特に指定がない場合、標準出力はディスプレイに表示される。
⇒ リダイレクト

標準エラー出力
プログラムにエラーが起きた場合の診断用のメッセージなどを出力するための出力先。標準エラー出力は、stderr とも呼ばれる。特に指定がない場合、標準エラー出力はディスプレイに表示される。

標準出力と標準エラー出力の違い

上の説明を見ると疑問に思うことが、標準出力と標準エラー出力の違いである。どちらも指定がない場合はディスプレイに出力することになっていて、以下のようなプログラムを実行すると両方の文字列が出力される。

test1.c

1
2
3
4
5
#include<stdio.h>
main(){
 fprintf(stdout, "stdout\n");
 fprintf(stderr, "stderr\n");
}



出力結果

% gcc test1.c
% a.out
stdout
stderr



しかし、これをリダイレクトさせてみると結果が変化することが分かる。

出力結果

% gcc test1.c
% a.out > result.txt
stderr



今度は、stderrだけが出力され、stdoutはリダイレクト先であるresult.txtに保存されている。つまり、標準エラー出力は、プログラムの状態やエラーなどを、出力とは別にユーザに知らせるために用意されたものであると言える。例のような短いプログラムではこの有難みは分かりにくいが、何百行、何千行と処理を行い、その結果を出力するプログラムでは出力も何百行に及んだりすることもあり、どこでエラーが起きたか分かりにくくなってしまうことがある。例として、次のようなプログラムを考えてみる。

test2.c

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
main(){
 int i;
 
 for(i=0; i<50; i++){
  if(i==39)
   fprintf(stderr, "error : %d\n", i);
  else
   fprintf(stdout, "%d\n", i);
 }
}



これは、0~49までの数字を出力するプログラムであるが、39を出力するときだけエラーが起きたと仮定し、標準エラー出力にエラーを表示させるようにしている。これを先ほどと同じようにリダイレクトすると、

出力結果

% gcc test2.c
% a.out > result2.txt
error : 39



となり、エラー箇所の出力のみが表示されるようになり、人が見てもどこでエラーが起きているのか非常に分かりやすくなる。

プログラムを書く際には、標準出力と標準エラー出力をうまく使い分けて人に分かりやすいプログラムを書くことを心がけたい。

カテゴリー: Linux タグ:

環境変数の設定(setenv) – UNIXリファレンス

2009 年 4 月 9 日 takus コメントはありません

環境変数とは?


アプリケーションなどの振る舞いを変える

環境変数の例


% setenv LANG ja_JP.eucJP % cal
日本語のカレンダーが表示

% setenv LANG ro_RO.ISO8859-2 % cal
英語のカレンダーが表示

代表的な環境変数の一覧


LANG

利用するロケールの設定

PATH

実行ファイルのパス

XMODIFIERS

XIMクライアント
 

コマンド


% setenv
現在の環境変数を表示

% setenv PATH [path1]:[path2]:
[path]を:で区切って記述し、実行ファイルを置いてあるディレクトリを指定

カテゴリー: Linux タグ:

入出力のリダイレクト – UNIXリファレンス

2009 年 4 月 9 日 takus コメントはありません

リダイレクトとは?

 シェルにおける入出力先を変更する機能

 ◆関連リンク
 →標準入力・標準出力・標準エラー出力とは?


コマンド例

 

[file] < [command]

  標準入力を[file]に変更

 

[command] > [file]

  標準出力を[file]に変更
  ファイルが存在すれば上書き

 

[command] >> [file]

  [file]が存在すれば出力をfile末尾に追加
  なければ新規作成して標準出力を書き込む

 

[command] >& [file], [command] >>& [file]

  標準エラー出力もリダイレクトする


シェルでの典型的な使い方

 

[command] >& /dev/null

 メッセージやエラーメッセージを表示しない


カテゴリー: Linux タグ: