LoginSignup
1
0

More than 5 years have passed since last update.

計算機サーバーとのデータのやり取り(scpコマンドの使い方)

Last updated at Posted at 2018-10-10

概要

ここでは数値解析系研究室で計算機にデータを送ったり、逆にデータを受信する方法を記述していく。
はじめに転送コマンドscpの使い方に触れ、後半ではシェルスクリプトを使用して、効率的にデータの送受信ができるようにしていく。

リモート‐ローカル間のファイルコピー

基本中の基本のコマンド
なおローカルの環境では、ほとんどipアドレスがルーターによって自動的に割り振られるようになっているため、ファイルの送受信の操作はローカルから行うことにした。

#ローカルのPC => リモートの計算機サーバー
scp -r <ローカルのファイルパス> <リモートのUser>@<リモートのipアドレス>:<リモートのコピー元のファイルパス>
#リモートの計算機サーバー => ローカルのPC
scp -r <リモートのUser>@<リモートのipアドレス>:<リモートのコピー元のファイルパス> <ローカルのコピー先ファイルパス>

-rはコピー対象としてディレクトリーを含めるオプション

このコマンドを実行するとサーバーからパスワード認証を求められ、パスワード入力後にファイルの送受信が行われる。

シェルスクリプトの作成

パスワード認証は面倒だし、いちいちipアドレスを入力するのも面倒なので、前回の公開鍵認証と合わせて以下のような送信用と受信用の2つのシェルスクリプトを作成する。スクリプトの保存先は~/binにしておくと、コマンドサーチパスに含まれているので、どのディレクトリからでもスクリプトを実行することができる。

~/bin/scpl2r.sh
#! /bin/bash    #シバン行(必須)
# ローカルのPC => リモートの計算機サーバー
scp -i ~/.ssh/id_rsa -r $1 <リモートのUser>@<リモートのipアドレス>:$2
~/bin/scpr2l.sh
#! /bin/bash
# リモートの計算機サーバ => ローカルのPC
scp -i ~/.ssh/id_rsa -r <リモートのUser>@<リモートのipアドレス>:$1 $2

\$1,\$2にはそれぞれシェルスクリプトを実行するときの引数の1番目と2番目がシェル変数として代入される。

実行権限の付与

作成したスクリプトには(おそらく)コマンドとして実行する権限(パーミッション)が付与されていないのでchmodコマンドを用いてパーミッションを変更する必要がある。現在の実行権限の確認にはls -lコマンドを用いる。
screen.PNG
-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に以下を追記する。

~/.bashrc
export  PATH="${HOME}/bin:$PATH"

追記後はターミナルを再起動するかターミナルでsource .bashrcとすることで変更が反映されてサーチパスに~/binが追加される。

まとめ

今回はデータの送受信についてまとめ、シェルスクリプトによって送受信の効率化を行った。記述に誤りがあったり、他にもっといい方法があれば教えていただけると幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0