Last updated: 2025/10/16
このページは本研究室の二つのSSHサーバの使用方法を紹介します。SSHサーバを使うにはLinuxのほうがずっと簡単ですが、ここはWindowsでの使い方を説明します。サーバを使うには研究室のネットにつながる必要があります。
このサーバは主にXRAINの降水粒子判別プログラムの実行に使われます。
サーバ1と同じこのサーバは性能の非常にいいパソコンを使っているので、主に時間がかかるプログラムの実行に使われます。特に、このサーバではFALMAとDALMAの波形データをすべて直接アクセスできるので、大量のデータを処理する場合は、サーバ上プログラムを直接実行したほうがデータをダウンロードする必要がないので便利です。(現時点FALMAとDALMAの波形データは100TBぐらいあるので、そもそも全部ダウンロードするのが不可能です)
WindowsでSSHサーバにアクセスするには無料ソフトWinSCPを使うのが便利です。
WinSCPを立ち上げて、下図の通りサーバのIPとPort(下図はサーバ1の場合)及び与えられたユーサー名とパスワードを入力して、Saveして ("Save password"もチェック)、Loginをクリックしたら、ログインできるはずです。最初にログインする時、"Continue connecting to an unknow ..."というメッセージが出るが、Yesをクリックしてください。

# 次回以降のログインは保存されたサーバ名をクリックするだけでできます。
HOMEフォルダーログインしたら、最初はHOMEフォルダーに入ります (フルパス: /home/username/)。それぞれのユーザーが自分のHOMEフォルダーを持ちます。自分のファイルは原則自分のHOMEフォルダーに置きます。他のユーザーのHOMEフォルダーに入ったり、ファイルを作成や削除したりはできません。
WinSCPの画面の右上に部屋のマークがあります。それをクリックしたらHOMEフォルダーに戻ることができます。
# HOMEフォルダーに大量のデータを長期間保存するのはサーバの正常の使用に支障が出ることがあるので避けてください。目安としては100Gを超えないようにしてください。コマンドdu -sh ~で現在のデータ量を確認できます。これ以上大量のデータを保存しないといけない場合は相談してください。
ファイルやフォルダーをドラッグすることで簡単にダウンロードやアップロードすることができます。また、ファイルやフォルダーの上に右クリックでもダウンロードとアップロードができます。
右クリック → New → File / Directory
ログインする前に、以下のように設定すれば解決できます。
編集→設定→環境→ファイル名をUTF-8でエンコード→オン
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はサーバ1のパソコンの名前なので、変わらないです。サーバ2の名前はWangWuLab2です。~はHOMEフォルダーを意味します。他のフォルダーに入ったら変わります。(base)はAnacondaの環境を示し、pythonを実行するには必要です。(base)が表示されなければ連絡してください。
# 基本のLinuxコマンドを少し分かるならサーバ上の操作に非常に役に立つので、「linuxコマンド」を検索して少し勉強したらいいと思います。例えば、htopを打つと、CPUとメモリの使用率が分かります。df -hを打つと、ディスクの使用量が分かります。上矢印キーを押すと、前に入力したコマンドが表示されます。Ctrl+rで以前入力したコマンドを検索することができます。
# PuTTYは若干使いにくいかもしれません。似たようなソフトはいろいろあります。興味があれば、"Windows SSH client"で検索してみてください。
例えば一つ非常に時間がかかるPythonプログラムを実行する必要があるとします。自分のパソコンで実行してもいいですが、他にもいろいろしないといけない作業があるし、自分のパソコンは時々シャットダウンする必要もあります。こういう場合はこのプログラムをSSHサーバ(サーバ2)に移して、実行したほうが便利です。
まず、自分のパソコンでPythonプログラム (.pyファイル)を用意します。次はこの.pyファイルをサーバにアップロードします。例えば自分のHOMEフォルダーに置きます。次はPuTTYの画面で以下のコマンドを打ったらプログラムが実行されます (仮にプログラムのファイル名はmyprogram.py)。
(base) username@WangWuLab2:~$ python3 myprogram.py
(base) username@WangWuLab2:~$ python3 myprogram.pyもしHOMEフォルダーに新しいフォルダーを作って (仮にフォルダー名はpython)、プログラムのファイルmyprogram.pyをこのフォルダーに置きます。実行するにはまずcdコマンドでこのフォルダーに入る必要があります。
(base) username@WangWuLab2:~$ cd python (base) username@WangWuLab2:~/python$ python3 myprogram.py
(base) username@WangWuLab2:~$ cd python
(base) username@WangWuLab2:~/python$ python3 myprogram.py与えられたパスワードを変更することができます。PuTTYでログインした後、passwdを打つことで変更できます。
FALMA、DALMAのすべての波形データは以下のフォルダーに保存されています:
/media/lightning/HDDn (nは0からの整数)
一般のユーザーはこれらのデータに読み取り権限のみを持っています。(書き込みや削除はできない)
SHAREフォルダー/media/SHARE/
このフォルダーにはすべてのユーザーがフルコントロール権限(読み取り、書き込み、削除等の権限)を持つように設定しています。大量のデータを互いに共有するとき、このフォルダーを使うのが便利です。
https://www1.gifu-u.ac.jp/~lrg/ssh.html
以下のコードを自分のHOMEフォルダーに置いて実行すれば、直接指定時刻のすべてのFALMAサイトの波形を作ることができます。行10のstrTimeは指定の時刻 (linux time)です。行11のpicDirは図の保存場所で、usernameを実際のユーザー名に変更する必要があります。
行20〜39に各時期のデータの保存場所を設定する必要があります。
#!/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<='20230325':
dataRoot = '/media/lightning/HDD4/2022LF/'+strDate+'/'
elif strDate<='20231015':
dataRoot = '/media/lightning/HDD6/2023LF/'+strDate+'/'
elif strDate<='20240808':
dataRoot = '/media/lightning/HDD8/2024LF/'+strDate+'/'
else:
dataRoot = '/media/lightning/HDD10/2024LF/'+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+'.\n Check if the directories are correct.')
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=150)#!/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<='20230325':
dataRoot = '/media/lightning/HDD4/2022LF/'+strDate+'/'
elif strDate<='20231015':
dataRoot = '/media/lightning/HDD6/2023LF/'+strDate+'/'
elif strDate<='20240808':
dataRoot = '/media/lightning/HDD8/2024LF/'+strDate+'/'
else:
dataRoot = '/media/lightning/HDD10/2024LF/'+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+'.\n Check if the directories are correct.')
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=150)サーバ2はFTPサーバでもあります。これを利用して、プログラミングでデータをダウンロードするのが便利です。
以下のコードで指定時刻のすべてのFALMAサイトの波形をダウンロードすることができます。行11をダウンロードデータの保存先に変更して、行39, 40のusernameとpasswordは付与されたユーザーネームとパスワードに変更する必要があります。
#!/usr/bin/env python3
import os
import datetime
from ftplib import FTP
strTime = '1548422986'
strDate = datetime.datetime.fromtimestamp(int(strTime)).strftime('%Y%m%d')
storeDir = 'D:/download/'
if os.path.exists(storeDir)==False:
os.mkdir(storeDir)
#実際の保存先を確認する必要がある
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<='20230325':
dataRoot = '/media/lightning/HDD4/2022LF/'+strDate+'/'
elif strDate<='20231015':
dataRoot = '/media/lightning/HDD6/2023LF/'+strDate+'/'
elif strDate<='20240808':
dataRoot = '/media/lightning/HDD8/2024LF/'+strDate+'/'
else:
dataRoot = '/media/lightning/HDD10/2024LF/'+strDate+'/'
ftp_add = '10.226.82.15'
ftp_port = 21
ftp_account = 'username'
ftp_key = 'password'
ftp = FTP()
ftp.connect(ftp_add, ftp_port)
ftp.login(ftp_account, ftp_key)
ftp.cwd(dataRoot)
siteMat = ftp.nlst()
for siteName in siteMat:
if len(siteName)!=3:
continue
ftp.cwd(dataRoot+siteName)
fileName = siteName+'L'+strTime+'.bz2'
try:
ftp.size(fileName) #Check if the file exists
except:
continue
fidFile = open(storeDir+fileName, 'wb')
ftp.retrbinary('RETR '+fileName, fidFile.write)
fidFile.close()
print('Downloaded '+fileName)
ftp.close()#!/usr/bin/env python3
import os
import datetime
from ftplib import FTP
strTime = '1548422986'
strDate = datetime.datetime.fromtimestamp(int(strTime)).strftime('%Y%m%d')
storeDir = 'D:/download/'
if os.path.exists(storeDir)==False:
os.mkdir(storeDir)
#実際の保存先を確認する必要がある
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<='20230325':
dataRoot = '/media/lightning/HDD4/2022LF/'+strDate+'/'
elif strDate<='20231015':
dataRoot = '/media/lightning/HDD6/2023LF/'+strDate+'/'
elif strDate<='20240808':
dataRoot = '/media/lightning/HDD8/2024LF/'+strDate+'/'
else:
dataRoot = '/media/lightning/HDD10/2024LF/'+strDate+'/'
ftp_add = '10.226.82.15'
ftp_port = 21
ftp_account = 'username'
ftp_key = 'password'
ftp = FTP()
ftp.connect(ftp_add, ftp_port)
ftp.login(ftp_account, ftp_key)
ftp.cwd(dataRoot)
siteMat = ftp.nlst()
for siteName in siteMat:
if len(siteName)!=3:
continue
ftp.cwd(dataRoot+siteName)
fileName = siteName+'L'+strTime+'.bz2'
try:
ftp.size(fileName) #Check if the file exists
except:
continue
fidFile = open(storeDir+fileName, 'wb')
ftp.retrbinary('RETR '+fileName, fidFile.write)
fidFile.close()
print('Downloaded '+fileName)
ftp.close()Back to Python関連資料