理工系研究者のための Mac OS X, Windows, Linux メモ
 
ホーム >> UNIX >> SSH
このエントリーをはてなブックマークに追加

SSH, SFTP

  1. バージョン
  2. 鍵の生成と公開鍵の登録
  3. ポートフォワーディング(Port forwarding)の利用
  4. sftp Tips


環境:MacOSX 10.3.2,OpenSSH_3.6.1p1+CAN-2003-0693,
SSH protocols 1.5/2.0, OpenSSL 0x0090702f

鍵の生成と公開鍵の登録

鍵を生成するには、

% ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user_name/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/user_name/.ssh/id_rsa.
Your public key has been saved in /Users/user_name/.ssh/id_rsa.pub.
The key fingerprint is:
9a:da:83:2f:84:??:??:??:??:2b:4b:a7:d8:ba:6a:f8 user_name@localhost
するとホームディレクトリの ~/.ssh/ 以下に
id_rsa id_rsa.pub
が生成される。アクセスしたいコンピュータのユーザーのホームディレクトリに、~/.ssh/authorized_keys を作成して id_rsa.pub の中身を書き加える。もともとあるならばその中に書き加える。id_rsa.pub を開いてみたら、末尾の部分が次のようになっていた。
.......Vt0U= user_name@localhost
最後の user_name はクライアント(sshしようとしている側)のユーザー名で正しいが、@以下のドメイン名がおかしいので、次のように正しいホスト名(ここではhogehoge)に書き直しておく。
.......Vt0U= user_name@hogehoge
このように書き直したものを、authorized_keysに書き加えておく。 後は、
% ssh -l user_name host
の様に受け入れ側でのユーザー名を陽に指定してログインする。ログイン時に訊かれるのはパスフレーズだけなのでパスワードも流れない。

ポートフォワーディング(Port forwarding)

以下では典型的な例として

  • Firewallの中にあるPC
    • ドメイン名:inside.foo.com,ユーザー名: taro_work
  • Firewallの外にあってinside.foo.co.jpからアクセス可なPC
    • ドメイン名:gate.foo.com,ユーザー名:taro_gate
  • 自宅のPC
    • ドメイン名:my.home.com,ユーザー名:taro_home
  • 自宅のCVSサーバー
    • ドメイン名:cvs.home.com,ユーザー名:taro_cvs
を用いる。

職場からプロパイダのメールを取得する方法

ファイアウォール内の PC (inside.foo.com) から、自宅の PC (my.home.com) まで ssh で接続できるとする。

ファイアウォールがあるために外部のプロバイダのメールが取得できない場合、ファイアウォールの外まで ssh でトンネルを作ってアクセスする。プロバイダのメールサーバー(POP3サーバー)を mail.provider.com とする。

まず inside.foo.com からトンネルを作成。

inside$ ssh -N -l taro_prvt my.home.com \
-L 10110:mail.provider.com:110
これで localhost の10110番ポートにアクセスすると、 my.home.com を経由して mail.provider.com の 110 番ポートに接続できる。これで localhost のポート番号 10110 へのアクセスが自宅PCを経由してメールサーバーへのアクセスとなる。

メーラーの設定では、受信用メールサーバーに localhost、ポート番号を10110にする。

メール送信に用いるsmtpサーバーの使うポート番号は25なので、同様にポートフォワーディングする。

inside$ ssh -N -l taro_prvt my.home.com \
-L 10025:mail.provider.com:25
メーラーの設定では、送信用メールサーバーに localhost、ポート番号を10025にする。

自宅からオンライン論文を取得する方法

論文誌によってはオンラインからPDFファイルを取得できる。IPアドレスによるアクセス制限が掛かっている場合には、まずオンライン論文が取得可能なIPアドレスを持つPCにsshでポートフォワーディングする。論文取得可能なPCのドメイン名を gate.foo.com とする。

例えば、Phys. Rev. Lett. の論文を取得するとする。 リンクを辿ってPDFファイルへのリンクを見つける。例えばリンクは

http://ojps.aip.org/getpdf/servlet/GetPDFServlet?filetype=pdf&
id=PRLTAO000***001&idtype=cvips
のようになっている。次に自宅からgate.foo.comにsshトンネルを掘る。
my$ ssh -l taro_gate gate.foo.com -L 10080:ojps.aip.org:80
すると localhost の10080番ポートへのアクセスがojps.aip.orgの80番ポートへのアクセスにフォワードされる。そしてブラウザから先ほどのリンクを次の様に変えることで論文のPDFファイルが取得できる。
http://localhost:10080/getpdf/servlet/GetPDFServlet?filetype=pdf&
id=PRLTAO000***001&idtype=cvips

自宅PCからファイアウォール内のPCにアクセスする方法

ファイアウォール内から自宅PCに ssh でアクセスできるとする。アクセスできない場合は stone 等を使う。

ファイアウォール内のPCは inside.foo.com 、自宅のPCを my.home.com とする。

あらかじめ inside.foo.com から、次の様に打っておく。

inside$ ssh -N -l taro_prvt my.home.com -R 2200:inside.foo.com:22
オプション -R は遠隔地にある my.home.com の2200番ポートを、今使っている inside.work.com の22番ポートに接続することを表している。あとは自宅に帰って、次の様にするとinside.work.comにアクセスできる。
my$ ssh -p 2200 -l taro_work localhost

ファイアウォール内PCから自宅PCにファイル転送する方法

ファイアウォールのせいで直接ファイル転送できない場合がある。ftpやsftpなどで自宅にあるサーバーに接続は出来るものの、ファイルを全く送ることができない。この場合は、ファイアウォール外のPCを経由して送るとよいことがある。次のようにして gate.work.com を経由したルートを作る。

inside$ ssh -l taro_gate gate.foo.com -L 2200:my.home.com:22
その後、sftp や scp を使ってファイル転送を行えばよい。接続方法は、
inside$ sftp -oPort=2200 taro_prvt@localhost
inside$ scp -oPort=2200 file.txt taro_prvt@localhost:~/
ポート番号の指定 -oPort=2200 を付けないと、自分自身に接続してしまうので注意。

自宅PCから職場のPCにファイルを転送する方法

これは、上記の「自宅PCから職場PCにアクセスする方法」と「ファイアウォール内の職場PCから自宅PCにファイル転送する方法」を組み合わせて行う。つまり、職場のPCにまずアクセスして、そこから逆に自宅のPCにsftpでアクセスする。そしてファイルのやり取りを行えばよい。

ファイアウォール外のCVSサーバーを使う方法

ファイアウォールのためにファイルの転送が出来なくなっている場合もsshトンネルを用いる必要がある。ここでは :ext: 方式によるCVSサーバーの利用について述べる。CVSサーバーを cvs.home.com とする。またリポジトリは /usr/local/cvsroot とする。CVSサーバー上でのユーザー名は taro_cvs とする。ファイアウォール内のPC (inside.foo.com) から、ファイル転送可能な経路をsshで作る。今の場合はファイアーウォール外にある gate.foo.com を使うことにする。cvsを:ext:方式で利用する時は、ファイルの転送にsshを使う。しかし今の場合は port forwarding を用いるのでsshが使うポートを変更する必要がある。そこで次の一行を書いた ssh_with_port を作成する。

ssh -p ${CVS_SSH_PORT} $*

ssh_with_port はパスの通った場所に置く。またssh_with_portには実行権を付けておく。

環境変数として以下のものを準備しておく(exportによる設定はbashの場合なので、cshを使っているなら setenv を使う)。

# CVSリポジトリの指定
export CVSROOT=":ext:taro_cvs@localhost:/usr/local/cvsroot"
# CVSが用いるrshもしくはsshを指定
export CVS_RSH=ssh_with_port
# ssh_with_portが用いるポート番号の指定
export CVS_SSH_PORT=2200

これらはその場で打ち込むか、 ~/.bashrc などに書いておけばよい。

さて次にsshでトンネルを作る。

inside$ ssh -l taro_gate gate.foo.com \
-L ${CVS_SSH_PORT}:cvs.home.com:22

後は別のターミナルから

inside$ cvs update

などを行えばよい。

▼参考サイト or 参考文献

sftp Tips

ftp を使っている時に delete キーを押すと ^H になってしまう。 解決するには、sftp を使っている時に Cont-z でsuspend して、

$ stty erase ^H

と打ち、fg で戻ると良い。