【初心者向け】Linuxリモートサーバを使うときに役に立つメモ

# 本記事の目的

本記事では、Linuxサーバでよく使用されるコマンドとツール、そして特にリモートサーバへのアクセス方法、ファイルのやり取り方法、Anacondaを使用した環境構築、そしてEmacsエディタの基本的な使い方、Screenコマンドの基本的な使い方について詳しく説明します。これらの情報は、Linuxユーザーにとって役立つ基本的なスキルを身につけるのに役立つでしょう。

# リモートサーバへのアクセス方法
リモートサーバーにアクセスするには、SSH（Secure Shell）プロトコルを使用します。以下のように``ssh``コマンドを使います。

```
ssh remote_username@remote_host
```
ここで、``remote_username``は事前にサーバに登録されたリモートサーバーへのユーザー名を、``remote_host``はリモートサーバーのホスト名またはIPアドレスを指定します。たとえば、ユーザ名が``taro``でIPアドレスが``198.51.100.255``の場合、次のように入力します。

```
ssh taro@198.51.100.255
```

sshセッションを終了してローカルシェルセッションに戻るには、

```
exit
```
と入力、または``Crtl + d``キーを押します。

## X11転送を有効にする
リモートサーバー上でグラフィカルなアプリケーションを実行する場合、X11転送を有効にすることが必要です。X11転送を有効にするには、``-Y``オプションを``ssh``コマンドに追加します。下記のようにコマンドを書きます。

```
ssh -Y remote_username@remote_host
```

X11転送を有効にすることで、リモートサーバー上でGUIアプリケーションを実行し、ローカルデスクトップに表示することができます。これは、グラフィカルなツールやエディタをリモートサーバ上で使用する場合に非常に便利です。

# ローカルとリモートサーバ間のファイルのやり取り

ローカルとリモートサーバ間でファイルをやり取りする方法の一つとして、``rsync``コマンドを使用することができます。``rsync``は、ファイルをコピーおよび同期するための強力なツールで、デフォルトではファイルの更新差分だけを転送することができます。以下は、ローカル側からの``rsync``を使用したファイルの送信を説明した例です。

:::note warn
リモートサーバからのファイル転送について
リモートサーバ側からローカルへのファイルのやり取りは、セキュリティの観点から推奨されていないので、本記事ではローカル側からのファイルのやり取りのみを示します。
:::

## 1. ローカルからリモートサーバへのファイルの転送
基本構文:
```
rsync [オプション] [送信元ファイル/ディレクトリ] [リモートユーザー@リモートホスト:送信先ディレクトリ]
```

例:
```
rsync -avz my_file.txt remote_username@remote_host:/path/to/destination/
```

* -a オプション: アーカイブモード。ファイル属性やタイムスタンプを保持しつつコピーします。
* -v オプション: 冗長モード。詳細な情報を表示します。
* -z オプション: 圧縮モード。データ転送時に圧縮を行います。

このコマンドは、``my_file.txt``をリモートサーバーの``/path/to/destination/``ディレクトリにコピーします。必要に応じて、オプション等を変更してください。

## 2. リモートサーバからロカールへのファイルの転送
基本構文:
```
rsync [オプション] [リモートユーザー@リモートホスト:送信元ファイル/ディレクトリ] [受信先ディレクトリ]
```
例:
```
rsync -avz remote_username@remote_host:/path/to/remote_file.txt /path/to/loacl_destination/
```
このコマンドは、リモートサーバーから``/path/to/remote_file.txt``をローカルの``/path/to/loacl_destination/``ディレクトリにコピーします。


# 仮想環境の構築ができるAnacondaの基本的な使い方

AnacondaはPythonプログラミング環境で、データサイエンス、機械学習、科学技術計算などの分野で幅広く使用されています。Anacondaの特徴の一つに、仮想環境の容易な作成が可能であり、Pythonのプロジェクトごとに仮想環境を作成することで、パッケージのバージョンや依存関係を安全に管理できます。

以下では、LinuxでAnacondaをインストールする手順と、基本的な使い方を紹介します。

## 1. Anacondaのダウンロードとインストール

1.&nbsp;[Anacondaの公式ウェブサイト](https://www.anaconda.com/download)にアクセスし、ページ下部の「Linux」>「64-Bit (x86) installer」を右クリックし、リンクをコピーします。

2.&nbsp;サーバ内でターミナルを開き、``wget``コマンドを使ってAnacondaをダウンロードします。
``wget``は、Webからリモートサーバ上に直接ファイルをダウンロードする際に便利なコマンドです。
（下記は2023年9月時点での最新版のリンクですので、最新版のリンクを使用してください。）
```
wget https://repo.anaconda.com/archive/Anaconda3-2023.07-2-Linux-x86_64.sh
```

3.&nbsp;ダウンロードしたシェルスクリプトを実行し、Anacondaのインストールプロセスを開始します。

```
bash Anaconda3-2023.07-2-Linux-x86_64.sh
```
インストールプロセスが開始され、以下の項目が表示されます。

* ライセンスの受諾
* インストール先の設定

必要な情報を提供してインストールを完了します。下記は私の環境での実行例で、特に問題がなければ下記のように設定してください。

```
(略)
Do you accept the license terms? [yes|no]
[no] >>> yes
(略)
[/home/user_name/anaconda3] >>> 
PREFIX=/home/user_name/anaconda3
Unpacking payload ...
(略)
installation finished.
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
[no] >>> yes
(略)
Thank you for installing Anaconda3!
```

## 2. PATHの設定
1.&nbsp;Anacondaが正常にインストールされたら、``~/.bashrc``ファイルを読み込んでAnacondaの環境を有効にするため、以下のコマンドを実行します。

```
source ~/.bashrc
```

2.&nbsp;実行後、下記のようにプロンプトが``(base)``という状態になっていればAnacondaが使用可能です。

```
user@host:~$ source ~/.bashrc
(base) user@host:~$ 
```

3.&nbsp;念の為、以下のコマンドで``conda``を使えることを確認します。
```
conda --version
conda 23.7.2
```
バージョンが表示されていれば、condaが使えている状態です。後は、必要に応じて仮想環境などを作ります。


## 3. 仮想環境の作成と利用

1.&nbsp;condaで環境環境を作るには、``conda create -n [環境名]``を実行します。例えば、``myenv``の名前の仮想環境を作るには、下記のように書きます。

```
conda create -n myenv
```

2.&nbsp;仮想環境を作成したら、それをアクティベーション（有効化）して使用します。有効化は下記のコマンドのように書きます。

```
conda activate myenv
```
ここでは、先ほど作成した``myenv``にアクティベーションする例を示しています。プロンプトが下記のように``(myenv)``になるはずです。

```
(base) user@host:~$ conda activate myenv
(myenv) user@host:~$ 
```

3.&nbsp;現在のプロンプトが表示されているので、この状態で``conda install [パッケージ名]``とすると、``myenv``の環境の中にパッケージがインストールされます。

仮想環境の作り方は下記などが参考になります。

https://www.brh.co.jp/research/lab01/anadonda-command/

https://qiita.com/naz_/items/84634fbd134fbcd25296


# AnacondaでGPU対応のTensorFlowの利用方法
Anacondaを使ってGPU対応のTensorFlowを使うには以下のようなコマンドを使います。

```
$ conda create --name tf-gpu-env tensorflow=*=gpu_*
```

この例では、`tf-gpu-env`を作り、そこにGPU対応の`tensorflow`をインストールしています。他のライブラリを入れていない新しい環境にインストールすることで、バージョン依存などのエラーをできるだけ抑えることができます。
また、基本的には仮想環境内はプロジェクト毎に必要最低限のライブラリのインストールに留めておくことでライブラリ同士の依存関係を把握しやすくなります。

TensorFlowのインストール方法の詳細はこちらにまとめていますので、よろしければ合わせてご覧ください。

https://qiita.com/yusuke_s_yusuke/items/dbe530ff7687603a81f6

# テキストエディタEmacsの基本的な使い方

リモートサーバ上でのファイル編集は、主にCUIを介して行われ、そのためにテキストエディタを利用します。Linux環境では、代表的なテキストエディタとして「nano」、「vim」、「Emacs」などがあります。本記事では、Emacsを使用したターミナル内でのファイルの保存と編集について、基本的な手順を紹介します。Emacsは高度なカスタマイズが可能で、初めて使う方にも使いやすいテキストエディタの一つです。

## 1. ファイルを開く
以下のコマンドでファイルを開きます。
```
emacs ファイル名
```

例えば、ファイル名が``hoge.txt``の場合、次のように入力します。
```
emacs hoge.txt
```

ただし、sshセッションで``-Y``オプションを使用している場合、ターミナル上でファイルを開くには以下のコマンドを使用します。

```
emacs ファイル名 -nw
```

このように、`-nw`オプションを追加することで、Emacsをターミナル内で起動します。``-Y``オプションを使用する場合、グラフィカルなインターフェースを備えたEmacsを使用できますが、ターミナル上でのファイル編集が必要な場合は``-nw``オプションを使用します。

## 2. ファイルを編集
ファイルが開かれると、Emacsの編集モードに入ります。以下は、簡単なコマンドの例です。

* カーソルを上下左右に移動するには、矢印キーを使用できます。
    * 上に移動：``Ctrl-p``または``↑``キー
    * 下に移動：``Ctrl-n``または``↓``キー
    * 左に移動：``Ctrl-b``または``←``キー
    * 下に移動：``Ctrl-f``または``→``キー
* Undo操作（取り消し）：直前の操作を取り消すには、``Ctrl-_``キーまたは``Ctrl-x u``キーを入力します。
* Redo操作（やり直し）：直前のUndo（取り消し）を取り消して前の状態に戻るには、``Ctrl-g``キーを押してからUndoで使うキーを入力します。

Emacsでは多くのキーボードショートカットが使用されますが、これらの基本操作を覚えることで効果的にファイルを編集できるようになります。さらなるコマンドや機能に関する情報は、[Emacsコマンド一覧(PDF)](https://www.cc.kyushu-u.ac.jp/scp/users/lectures/linux1/emacs-cmd.pdf)を参照ください。

## 3. ファイルを保存
ファイルに変更を加えた場合、ファイルを保存して変更を確定させます。
``Ctrl-x Ctrl-s``キーを押してファイルを上書き保存します。（この操作をスキップしても後述の手順のEmacsを終了の際、ファイルに変更がある場合は、ファイルの変更を保存するかどうかを尋ねるプロンプトが表示されます。）

## 4. Emacsを終了

Emacsを終了するには``Ctrl-x Ctrl-c``キーを押します。
このコマンドを実行すると、Emacsが終了し、ファイルの変更があった場合、保存するかどうかを尋ねるプロンプトが表示されます。この終了時にファイルを保存しなかった場合、Emacsは変更を失うことになります。ファイルを保存するかどうかは、確認プロンプトで選択できます。

# バックグラウンドで処理を継続できるScreenコマンドの基本的な使い方

リモートサーバを使用する際、大規模な処理を行うことがあります。そのような場合、SSH接続が切断されても処理を続行できるように、タスクをバックグラウンドで実行します。

Screenコマンドは、リモートシェルセッションを保持し、ターミナルウィンドウを分割し、バックグラウンドでタスクを実行するための強力なツールです。これにより、SSH接続が切断されても、作業を中断することなく進めることができます。

以下では、この記事で解説するScreenコマンドの基本的な使い方に焦点を当てて紹介します。詳細な情報や具体的なコマンドの使い方については、次の記事を参照してください。

https://bacchi.me/linux/how-2-use-screen/

## 1つのScreenでの基本的な使い方
以下の手順で使います。

### 1. 新しいセッションの開始
新しいセッションを作るにはリモートサーバのターミナル内で``screen``を使います。

### 2. 何かバックグラウンドしたい処理を走らせる
何か時間がかかるコードを走らせます。

### 3. セッションからのデタッチ (セッションをバックグラウンドで実行)
コードを走らせた状態でセッションからデタッチするには、``Ctrl-a d``を使います。そうするとサーバからログアウトしたりしても、バッググラウンドで処理が継続されます。

### 4. 処理が継続されているか確認する
デタッチした状態で本当に処理が動作しているか確認します。
よく使うのが``top``コマンドで、このコマンドはさまざまなコマンドが動作をリアルタイムで確認できます。デタッチした後で、``top``と入力し``USER``と``COMMAND``をみて確かに動いていることを確認しましょう。

``top``コマンドを終了するには、``Ctrl-c``を入力します。

### 5. デタッチしたセッションへの再接続
デタッチしたセッションに戻るには``screen -r``を使います。

### 6. 不要になったセッションの削除
セッションに``screen -r``でアタッチし、``exit``を入力します。

### 7. セッションの表示
``screen -ls``コマンドを使用して、現在のscreenのセッションを表示できます。

しかし、複数のScreenセッションが起動している場合、単に``screen -r``だけではアタッチできず、どのセッションにアタッチするか指定する必要があります。以下にその一例を示します。

例えば、2つの異なるscreenセッションが存在する場合、``screen -r``コマンドを実行すると、次のように表示されます。

```
$ screen -r
(出力)
There are several suitable screens on:
	3817692.pts-0.hoge	(2023年09月22日 11時01分15秒)	(Detached)
	3817646.pts-0.hoge	(2023年09月22日 11時00分58秒)	(Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
```

これは現在2つの``screen``が立ち上がっている状態なので、例えば``screen -r 3817692``というようセッション名を指定してアタッチします。

## セッションに名前をつけて複数実行したい場合
Screenセッションに名前をつけて複数走らせたい場合は、``screen -S [プロセス名]``を使います。

以下は、名前のついた2つのセッションの例です。

1.&nbsp;最初のセッションを作成します。
```
$ screen -S session_a
```
この後、``Ctrl-a d``を押してセッションをデタッチします。

2.&nbsp;次のセッションを作成します。
```
$ screen -S session_b
```
同様に、``Ctrl-a d``でセッションをデタッチします。

3.&nbsp;作成したセッションを一覧表示します。

```
$ screen -ls
(出力)
There are screens on:
	3818262.session_b	(2023年09月22日 11時14分53秒)	(Detached)
	3818219.session_a	(2023年09月22日 11時14分42秒)	(Detached)
2 Sockets in /run/screen/S-name.
```

この例では、``session_a``と``session_b``という名前が付いた2つのセッションが作成され、それぞれ一意の識別子で一覧表示されています。例えば、``3818262.session_b``のセッションにアタッチするには、以下のコマンドを使用します。
```
$ screen -r session_b
```
名前でセッションを管理することで、より簡単に識別することができます。


## 知っておくと便利かも

### デタッチした状態で不要なセッションの削除
不要になったセッションを消すとき、[6. 不要になったセッションの削除](#6-不要になったセッションの削除)で紹介した方法では、セッションにアタッチした状態で消す必要があり少し手間がかかるので、Screenからデタッチした状態からでも以下のコマンドでセッションを削除することもできます。
```
screen -X -S セッション名 quit
```

### Screen内でターミナルログの閲覧方法
Screenにアタッチしていると、デフォルトでマウスの操作がコマンドの巻き戻りに割り当てられており、テキストの選択やスクロールが制限されます。ここでは、マウス操作でターミナルログを閲覧する方法について説明します。

表示されているログを巻き戻って見たい場合は、マウスの操作を切り替えるために、``Ctrl-a``キーを押しながら``esc``キーを押します。これにより、Screen内でスクロールモードに入ります。
スクロールモードでは、マウスのホイールまたはキーボードの矢印キーを使用して、ログを巻き戻って閲覧できます。
通常のモードに戻るために``esc``キーを再度押します。

# まとめ

本記事では、Linuxサーバでの基本的な操作について説明しました。リモートサーバへのアクセス方法やファイルのやり取り、Anacondaを使用した環境構築、Emacsエディタの基本的な使い方、そしてScreenコマンドの基本的な使い方を紹介しました。

本記事が、どなたかの役に立てば幸いです。