研究室SSHサーバ

Last updated: 2024/03/05

このページは本研究室のSSHサーバの使用方法を紹介します。このサーバは主にXRAIN粒子判別プログラムを動かすために立てましたが、普段の研究でpython等のプログラムの実行にも自由に使ってください。特にサーバ上ではFALMAとDALMAの波形データをすべて直接アクセスできるので、大量のデータを処理する場合は、サーバ上プログラムを直接実行したほうがデータをダウンロードする必要がないので便利です。(現時点FALMAとDALMAの波形データは100TBぐらいあるので、そもそも全部ダウンロードするのが不可能です)

SSHサーバを使うにはLinuxのほうがずっと簡単ですが、ここはWindowsでの使い方を説明します。サーバを使うには研究室のネットにつながる必要があります。

1. サーバ基本情報

2. WinSCP

SSHサーバにアクセスするには無料ソフトWinSCPを使います。

WinSCPを立ち上げて、下図の通りサーバのIPとPort及び与えられたユーサー名とパスワードを入力して、Saveして ("Save password"もチェック)、Loginをクリックしたら、ログインできるはずです。最初にログインする時、"Continue connecting to an unknow ..."というメッセージが出るが、Yesをクリックしてください。

# 次回以降のログインは保存されたサーバ名をクリックするだけでできます。

HOMEフォルダー

ログインしたら、最初はHOMEフォルダーに入ります (フルパス: /home/username/)。それぞれのユーザーが自分のHOMEフォルダーを持ちます。自分のファイルは原則自分のHOMEフォルダーに置きます。他のユーザーのHOMEフォルダーに入ったり、ファイルを作成や削除したりができません。

WinSCPの画面の右上に部屋のマークがあります。それをクリックしたらHOMEフォルダーに戻ることができます。

ダウンロード・アップロード

ファイルやフォルダーをドラッグすることで簡単にダウンロードやアップロードすることができます。また、ファイルやフォルダーの上に右クリックでもダウンロードとアップロードができます。

ファイル・フォルダーの作成

右クリック → New → File / Directory

3. PuTTY

SSHサーバの上にコマンドやプログラムを実行するには無料ソフトPuTTYを使います。

まず前文に述べた通りWinSCPでサーバにアクセスします。次はWinSCPの画面でCtrl+pを押してPuTTYを立ち上げます。PuTTYが見つからない、というエラーが出れば、以下のリンクでPuTTYをダウンロードして、インストールしてください。

# PuTTYダウンロード (64-bit x86を選んでください):
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

インストールした後、WinSCPの画面でもう一度Ctrl+pを押したら、PuTTYが立ち上がるはずです。PuTTYを最初に立ち上げる時も何らかの警告メッセージが出るが、Yesをクリックしてください。次はパスワードを入力してください (ユーサー名は自動的に入力される)。(パスワードを入力する時PuTTYの画面には何の変化も出ないです)

正常にログインしたら、(base) username@WangWuLab:~$の後ろにカーソルがあるという状態になります。ここでコマンドやプログラムを実行することができます。

ここのusernameは与えられたユーザー名です。人それぞれ違います。WangWuLabはこのパソコンの名前なので、変わらないです。~HOMEフォルダーを意味します。他のフォルダーに入ったら変わります。(base)はAnacondaの環境を示し、pythonを実行するには必要です。(base)が表示されなければ連絡してください。

# 基本のLinuxコマンドを少し分かるならサーバ上の操作に非常に役に立つので、「linuxコマンド」を検索して少し勉強したらいいと思います。例えば、htopを打つと、CPUとメモリの使用率が分かります。df -hを打つと、ディスクの使用量が分かります。

4. Pythonプログラムの実行

例えば一つ非常に時間がかかるPythonプログラムを実行する必要があるとします。自分のパソコンで実行してもいいですが、他にもいろいろしないといけない作業があるし、自分のパソコンは時々シャットダウンする必要もあります。こういう場合はこのプログラムをSSHサーバに移して、実行したほうが便利です。

まず、自分のパソコンでPythonプログラム (.pyファイル)を用意します。次はこの.pyファイルをサーバにアップロードします。例えば自分のHOMEフォルダーに置きます。次はPuTTYの画面で以下のコマンドを打ったらプログラムが実行されます (仮にプログラムのファイル名はmyprogram.py)。

(base) username@WangWuLab:~$ python3 myprogram.py
(base) username@WangWuLab:~$ python3 myprogram.py

もしHOMEフォルダーに新しいフォルダーを作って (仮にフォルダー名はpython)、プログラムのファイルmyprogram.pyをこのフォルダーに置きます。実行するにはまずcdコマンドでこのフォルダーに入る必要があります。

(base) username@WangWuLab:~$ cd python
(base) username@WangWuLab:~/python$ python3 myprogram.py
(base) username@WangWuLab:~$ cd python
(base) username@WangWuLab:~/python$ python3 myprogram.py

5. パスワードを変更する

与えられたパスワードを変更することができます。PuTTYでログインした後、passwdを打つことで変更できます。

6. サーバ上FALMA波形図を作るコード例

以下のコードを自分のHOMEフォルダーに置いて実行すれば、直接指定時刻のすべてのFALMAサイトの波形を作ることができます。行10のstrTimeは指定の時刻 (linux time)です。行11のpicDirは図の保存場所で、usernameを実際のユーザー名に変更する必要があります。

行19〜34から各時期のデータの保存場所が分かります。

#!/usr/bin/env python3

import os
import bz2
import numpy as np
import datetime
import matplotlib.pyplot as plt
plt.rcParams['agg.path.chunksize'] = 20000

strTime = '1548422986'
picDir = '/home/username/pic/'

if os.path.exists(picDir)==False:
    os.mkdir(picDir)

strNatTime = datetime.datetime.fromtimestamp(float(strTime)).strftime('%Y%m%d-%H%M%S')
strDate = strNatTime[0:8]

if strDate<'20180101':
    dataRoot = '/media/lightning/HDD1/2017Trans/'+strDate+'/'
elif strDate<='20190331':
    dataRoot = '/media/lightning/HDD1/2018LF/'+strDate+'/'
elif strDate<='20200331':
    dataRoot = '/media/lightning/HDD1/2019LF/'+strDate+'/'
elif strDate<='20210509':
    dataRoot = '/media/lightning/HDD1/2020LF/'+strDate+'/'
elif strDate<='20220331':
    dataRoot = '/media/lightning/HDD2/2021LF/'+strDate+'/'
elif strDate<='20220705':
    dataRoot = '/media/lightning/HDD2/2022LF/'+strDate+'/'
elif strDate<='20230320':
    dataRoot = '/media/lightning/HDD4/2022LF/'+strDate+'/'
else:
    dataRoot = '/media/lightning/HDD6/2023LF/'+strDate+'/'

absFileMat = []
siteMat = os.listdir(dataRoot)
siteMat.sort()
for siteName in siteMat:
    absFileName = dataRoot+siteName+'/'+siteName+'L'+strTime+'.bz2'
    if os.path.exists(absFileName)==True:
        absFileMat.append(absFileName)
fileNum = len(absFileMat)
if fileNum==0:
    raise SystemExit('No data exist for '+strTime)
    
f = plt.figure(figsize=(8,10))
axNum = fileNum
be = 0.05
te = 0.04
vb = 0
h = (1-be-te-vb*(axNum-1))/axNum
le = 0.08
re = 0.03
w = 1-le-re

axMat = list(range(axNum))
for i in range(axNum):
    axMat[i] = f.add_axes([le, be+(h+vb)*(axNum-1-i), w, h])
    if i<axNum-1:
        axMat[i].set_xticks([])

tMat = np.linspace(0, 1000, 1000000)

for i in range(axNum):
    absFileName = absFileMat[i]
    fid = bz2.BZ2File(absFileName)
    dataMat = np.frombuffer(fid.read(), np.int16)
    if len(dataMat)==5000000:
        dataMat = dataMat[0::5]
    fid.close()

    axMat[i].plot(tMat, dataMat, lw=1)
    axMat[i].set_xlim([tMat[0], tMat[-1]])
    axMat[i].text(0.98, 0.97, absFileName[-18:-15], horizontalalignment='right', verticalalignment='top', transform = axMat[i].transAxes)
axMat[-1].set_xlabel('Time (ms)')
axMat[0].set_title(strNatTime)
    
plt.savefig(picDir+strTime+'.png', dpi=300)
#!/usr/bin/env python3

import os
import bz2
import numpy as np
import datetime
import matplotlib.pyplot as plt
plt.rcParams['agg.path.chunksize'] = 20000

strTime = '1548422986'
picDir = '/home/username/pic/'

if os.path.exists(picDir)==False:
    os.mkdir(picDir)

strNatTime = datetime.datetime.fromtimestamp(float(strTime)).strftime('%Y%m%d-%H%M%S')
strDate = strNatTime[0:8]

if strDate<'20180101':
    dataRoot = '/media/lightning/HDD1/2017Trans/'+strDate+'/'
elif strDate<='20190331':
    dataRoot = '/media/lightning/HDD1/2018LF/'+strDate+'/'
elif strDate<='20200331':
    dataRoot = '/media/lightning/HDD1/2019LF/'+strDate+'/'
elif strDate<='20210509':
    dataRoot = '/media/lightning/HDD1/2020LF/'+strDate+'/'
elif strDate<='20220331':
    dataRoot = '/media/lightning/HDD2/2021LF/'+strDate+'/'
elif strDate<='20220705':
    dataRoot = '/media/lightning/HDD2/2022LF/'+strDate+'/'
elif strDate<='20230320':
    dataRoot = '/media/lightning/HDD4/2022LF/'+strDate+'/'
else:
    dataRoot = '/media/lightning/HDD6/2023LF/'+strDate+'/'

absFileMat = []
siteMat = os.listdir(dataRoot)
siteMat.sort()
for siteName in siteMat:
    absFileName = dataRoot+siteName+'/'+siteName+'L'+strTime+'.bz2'
    if os.path.exists(absFileName)==True:
        absFileMat.append(absFileName)
fileNum = len(absFileMat)
if fileNum==0:
    raise SystemExit('No data exist for '+strTime)
    
f = plt.figure(figsize=(8,10))
axNum = fileNum
be = 0.05
te = 0.04
vb = 0
h = (1-be-te-vb*(axNum-1))/axNum
le = 0.08
re = 0.03
w = 1-le-re

axMat = list(range(axNum))
for i in range(axNum):
    axMat[i] = f.add_axes([le, be+(h+vb)*(axNum-1-i), w, h])
    if i<axNum-1:
        axMat[i].set_xticks([])

tMat = np.linspace(0, 1000, 1000000)

for i in range(axNum):
    absFileName = absFileMat[i]
    fid = bz2.BZ2File(absFileName)
    dataMat = np.frombuffer(fid.read(), np.int16)
    if len(dataMat)==5000000:
        dataMat = dataMat[0::5]
    fid.close()

    axMat[i].plot(tMat, dataMat, lw=1)
    axMat[i].set_xlim([tMat[0], tMat[-1]])
    axMat[i].text(0.98, 0.97, absFileName[-18:-15], horizontalalignment='right', verticalalignment='top', transform = axMat[i].transAxes)
axMat[-1].set_xlabel('Time (ms)')
axMat[0].set_title(strNatTime)
    
plt.savefig(picDir+strTime+'.png', dpi=300)

Back to Python関連資料