リモートから別のマシンを操作する仕組みの一種に、SSH (Secure Shell)というものがあります。ユーザはインターネットを介してSSHサーバにログインすることで、離れた場所からサーバを操作することができます。通常は、SSHでログインするとシェルを使うことができます。つまり、場所を選ばすにコンパイルやプログラムの実行ができるということです。本年度の情報科学基礎実験は、自宅のコンピュータからECCSの計算機にアクセスすることで演習を行います。そのため、自宅にインターネットに接続できるコンピュータがあれば、大学に来る必要はありません。(自宅にコンピュータがない場合は、情報教育棟の演習室にて課題を行って構いません。)
ECCSには外部からアクセス可能なSSHサーバが用意されています。詳しくは、ECCSのページを見てください。(該当ページの、「リモートアクセス環境」ではなく「SSHサーバ」の方をご覧ください)
手元のマシンでsshクライアントが使えるなら、以下のコマンドをシェルで実行することでログインができます。(「username」の部分は自分のものに置き換える必要があります。)
ssh username@ssh01.ecc.u-tokyo.ac.jp
一般的には、ここでパスワードを聞かれるのですが、ECCSではパスワードによるリモートログインは許可されていません。ECCSでSSHを利用するには、以下に述べる公開鍵を準備する必要があります。
sshクライアントとしては、Mac OSの場合はターミナルを使えば問題ありません。Windowsの場合も、Windows 10ならばPowerShellがsshクライアントとして利用できます。それ以前のOSを使っている場合は、puttyなどを利用してください。
公開鍵暗号では、鍵は公開鍵と秘密鍵からなります。秘密鍵は自分のローカルで管理し、外部に漏れないようにしなければなりません。逆に、公開鍵は世界中に公開することが想定されています。公開鍵暗号には代数学が利用されているので、仕組みを詳しく調べると勉強になります。それはさておき、鍵は以下のコマンドで生成できます。鍵はどこで作ってもかまわないのですが、秘密鍵を無闇に移動するのは危険なので、普通は秘密鍵を置くマシン上で実行するとよいでしょう。今回のシチュエーションでは、家のマシンということになります。 鍵の作成方法はOSによって異なります。
次のシェル命令を打ちます。
ssh-keygen
すると、鍵のファイル名などを聞かれます。デフォルトでは (~~/.ssh/id_rsa)となっていると思いますが、それで特に問題なければEnter Keyを押します。(よくわからない場合はそのままにしておいてください。) なお~~の部分は人によって違います。~~の部分に、新たに.sshというフォルダが作成され、そこに鍵のファイルが作成されます。なお、.から始まるフォルダは隠しフォルダであるため、単にlsとするだけでは見ることができません。隠しフォルダの存在を確認するにはls -aとする必要があります。作成の途中で、パスフレーズというものを決める必要がありますので、ある程度の長さのパスフレーズを設定してください。作成において、(デフォルト名ならば)id_rsaというファイルとid_rsa.pubという2つのファイルができたかと思いますが、後者のid_rsa.pubが公開鍵となります。id_rsa自体は秘密鍵となりますので、絶対に他人に情報開示してはいけません。
puttyをダウンロードしたページから、公開鍵を作成するためのツールであるputtygenが公開されています。
鍵ができたら、公開鍵の方だけECCSに登録してください。登録の方法は、上記のECCSのページに解説があります。Parametersの中からSSH2 RSAを選択し、Generateを押すと鍵が生成するプログラムが実行されます。鍵を生成するための乱数を発生させるために、枠内で適当にマウスを動かしてください。鍵が作成できたら、Key passphraseとConfirm passphraseにパスフレーズを入力し、Save public keyとSave private keyで鍵を保存してください。
鍵ができたら、公開鍵の方だけECCSに登録してください。登録の方法は、上記のECCSのページに解説があります。
ECCSのSSHサーバにログインできたら、シェルを操作することができます。gccもguileもspikeも自由に使えます。また、SSHによる通信は暗号化されているので、パスワードのような情報を入力しても外部から読み取られる心配はほとんどありません。
ただし、残念ながら、ターミナルの外で動くアプリをSSHで使うことはできません。ファイルの編集は、
/Applications/Emacs.app/Contents/MacOS/Emacs -nw
とすることで、問題なくファイルの編集ができます。もしこのままでは編集とコンパイルを交互に行うのが面倒だなと思った場合は、手っ取り早い解決策として、もう1つターミナルのウィンドウを増やしてSSH接続をすることがあげられます。(他にも、シェルの機能を使えば、1つのSSH接続内でエディタとコンパイラを交互に使うことが可能ですが、ここでは説明しません。やはり説明しませんが、tmuxやscreenといったコマンドを使うと、並列に作業が行える上、作業の途中で接続が切れても復帰できるかも知れません。)
ssh接続を終了する際には
exit
と打ちます。
これまでの方法は安定してSSH接続が維持できることが前提ですが、ネットのない環境でも作業したいという場面もあると思います。この場合は、手元で編集しておいたファイルを後でリモートにコピーすることができます。以下がそのコマンドです。ローカルのシェルで実行してください。
scp hoge.c username@ssh01.ecc.u-tokyo.ac.jp:foo/
scpコマンドの使い方は普通のcpコマンドとほとんど変わりありません。違いは、リモートであることを意味する「username@ssh0-01.ecc.u-tokyo.ac.jp:」をファイル名の頭に付けるということだけです。上のコマンドを実行すると、ローカルの「hoge.c」がリモートの「foo」というディレクトリにコピーされます。普段と同じく相対パスも絶対パスも使えます。リモートの相対パスの起点はリモートのホームディレクトリです。
逆に、リモートのファイルをローカルにコピーするのもscpコマンドでできます。やはり、リモートのファイル名に「username@ssh0-01.ecc.u-tokyo.ac.jp:」を付けるだけです。以下の例もローカルで実行することが想定されています。
scp username@ssh01.ecc.u-tokyo.ac.jp:foo/hoge.c ./