->
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
こうしておくと、
とするだけで、serverAにsshできるようになる。
ServerBの設定はServerAを踏み台にして、ServerAと同じLAN内のマシンにsshする際に使える。ただ、踏み台となるマシンにncコマンドが入っていない場合は使うことができない。秘密鍵でなく、パスワードでログインする場合はServerCの設定のようになる。最後にある*は全てのサーバにある設定を使うような場合に設定する。これは必ず一番下に書く必要がある。
参考サイト
SSH_CONFIG (5)
$HOME/.ssh/configを活用していますか?
研究室内においてある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が可能になる。
と、ちょっと回りくどいやり方ではあるが一応できるようになった。
ただ毎回やるのは面倒なのでもっと効率的な方法がないか模索していく予定。
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
・
・
・
代表的なデバイスファイル
装置用のファイル
| デバイス名 | 意味 |
| ad | IDEハードディスク |
| acd | ATAPI CD/DVD装置 |
| usb | USBポート |
| sysmouse | マウス |
特殊ファイル
| デバイス名 | 意味 |
| stdin | 標準入力 |
| stdout | 標準出力 |
| stderr | 標準エラー出力 |
| null | ヌルファイル |
| random | ランダムデータファイル |
| zero | ゼロデータファイル |
| dsp | 音源ファイル |
| sndstat | 音源チップ情報ファイル |
| console | 標準コンソール |
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
コマンド履歴とは?
シェルは以前に入力したコマンドの情報を保持している
コマンド履歴の呼び出し
% 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
履歴の実行
直前の実行コマンドを実行
以前に入力したコマンドの検索
Esc-p
使い方はTabによる補完と同じ
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
となり、エラー箇所の出力のみが表示されるようになり、人が見てもどこでエラーが起きているのか非常に分かりやすくなる。
プログラムを書く際には、標準出力と標準エラー出力をうまく使い分けて人に分かりやすいプログラムを書くことを心がけたい。
環境変数とは?
アプリケーションなどの振る舞いを変える
環境変数の例
% setenv LANG ja_JP.eucJP
% cal
日本語のカレンダーが表示
% setenv LANG ro_RO.ISO8859-2
% cal
英語のカレンダーが表示
代表的な環境変数の一覧
LANG
利用するロケールの設定
PATH
実行ファイルのパス
XMODIFIERS
XIMクライアント
コマンド
% setenv
現在の環境変数を表示
% setenv PATH [path1]:[path2]:
[path]を:で区切って記述し、実行ファイルを置いてあるディレクトリを指定