概要
ここでは数値解析系研究室で計算機にデータを送ったり、逆にデータを受信する方法を記述していく。
はじめに転送コマンドscpの使い方に触れ、後半ではシェルスクリプトを使用して、効率的にデータの送受信ができるようにしていく。
リモート‐ローカル間のファイルコピー
基本中の基本のコマンド
なおローカルの環境では、ほとんどipアドレスがルーターによって自動的に割り振られるようになっているため、ファイルの送受信の操作はローカルから行うことにした。
#ローカルのPC => リモートの計算機サーバー
scp -r <ローカルのファイルパス> <リモートのUser>@<リモートのipアドレス>:<リモートのコピー元のファイルパス>
#リモートの計算機サーバー => ローカルのPC
scp -r <リモートのUser>@<リモートのipアドレス>:<リモートのコピー元のファイルパス> <ローカルのコピー先ファイルパス>
-rはコピー対象としてディレクトリーを含めるオプション
このコマンドを実行するとサーバーからパスワード認証を求められ、パスワード入力後にファイルの送受信が行われる。
シェルスクリプトの作成
パスワード認証は面倒だし、いちいちipアドレスを入力するのも面倒なので、前回の公開鍵認証と合わせて以下のような送信用と受信用の2つのシェルスクリプトを作成する。スクリプトの保存先は~/binにしておくと、コマンドサーチパスに含まれているので、どのディレクトリからでもスクリプトを実行することができる。
#! /bin/bash #シバン行(必須)
# ローカルのPC => リモートの計算機サーバー
scp -i ~/.ssh/id_rsa -r $1 <リモートのUser>@<リモートのipアドレス>:$2
#! /bin/bash
# リモートの計算機サーバ => ローカルのPC
scp -i ~/.ssh/id_rsa -r <リモートのUser>@<リモートのipアドレス>:$1 $2
\$1,\$2にはそれぞれシェルスクリプトを実行するときの引数の1番目と2番目がシェル変数として代入される。
実行権限の付与
作成したスクリプトには(おそらく)コマンドとして実行する権限(パーミッション)が付与されていないのでchmodコマンドを用いてパーミッションを変更する必要がある。現在の実行権限の確認にはls -l
コマンドを用いる。
-rwxr-xr-xの1文字目はファイルタイプと呼ばれ、'-, d, l'で表され、それぞれ以下の意味がある。
記号 | 意味 |
---|---|
- | 通常ファイル |
d | ディレクトリー |
l | シンボリックリンク |
残りの9文字は3文字1組でパーミッションを表し、先頭から順番にオーナー、グループ、その他ユーザーのパーミッションとなっている。
パーミッションの変更であるがchmodには記号で指定する方法と数値で指定する方法の2種類があるが、今回は後者の方法を用いる。後者の場合以下の表のように、それぞれrwxの権限を数値で対応させ、その和でパーミッションを変更する。
記号 | 数値 | 意味 |
---|---|---|
r | 4 | read(読み取り権限) |
w | 2 | write(書き込み権限) |
x | 1 | execute(実行権限) |
使い方
chmod <オーナの権限><グループの権限><その他ユーザの権限> <権限を変更するファイル>
具体例
#<file>のパーミッションをrwxr-xr-xにする
$ chmod 755 <file>
#<file>のパーミッションをrwxr-xr--にする
$ chmod 754 <file>
個人的に一番よく使うのはchmod 755
だと思う。
ここでは先ほど作成したシェルスクリプトにrwxr-xr-x
の権限を付与する。
$ chmod 755 scpl2r.sh scpr2l.sh
これでスクリプトが実行可能な状態になった。
シェルスクリプトの実行
作成したスクリプトはそれぞれ以下のように使用する。
#ローカルのPC => リモートの計算機サーバー
$ scpl2r.sh <ローカルのコピー元のファイルパス> <リモートのコピー先のファイルパス>
$1 $2
#リモートの計算機サーバー => ローカルのPC
$ scpr2l.sh <リモートのコピー元のファイルパス> <ローカルのコピー先のファイルパス>
$1 $2
リモートのファイルパスはローカルからでは'~'がリモートのホームディレクトリとして解釈されないので、ルートディレクトリからフルパスで指定しておくのが無難である。
コマンドが実行されないときは一度ターミナルを再起動すると、実行できるようになることがある。
それでも実行できないときはスクリプトの保存場所がサーチパスに含まれていない可能性があるのでecho $PATH
でサーチパスを確認した方がよい。サーチパスを追加するには.bashrcに以下を追記する。
export PATH="${HOME}/bin:$PATH"
追記後はターミナルを再起動するかターミナルでsource .bashrc
とすることで変更が反映されてサーチパスに~/binが追加される。
まとめ
今回はデータの送受信についてまとめ、シェルスクリプトによって送受信の効率化を行った。記述に誤りがあったり、他にもっといい方法があれば教えていただけると幸いです。