初心者必見 GPU環境構築〜SSH接続〜

SSH接続

LinuxのSSH接続を行います. 以下を参考にさせて頂きました.
参考:SSHなるものをよくわからずに使っている人のための手引書 - Qiita

そもそもSSH接続が分からんという方は以下を参照してください.
参照:はじめてのssh

SSH接続するために, 秘密鍵と公開鍵を設定します.
流れは以下のように, クライアントで鍵を作成して, サーバーに公開鍵を送信する手順で進めていきます.
https://cdn-ak.f.st-hatena.com/images/fotolife/m/munemakun/20190417/20190417141402.png

また, 以降では, 以下のように定義します.
【クライアント】: クライアント(機能を使う側)の操作
【サーバー】: サーバー(機能を提供する側)の操作


1.【クライアント】公開鍵と秘密鍵を作成

以下のコマンドで, ~/.sshディレクトリが作成され, その中に公開鍵(id_rsa.pub)と秘密鍵(id_rsa)が作成されます.

ssh-keygen

※パスフレーズの変更

ssh-keygen -p

2. 【クライアント】公開鍵のコピーをサーバー側に送信

scpコマンドを使いセキュアにファイルをコピーして, サーバーに送信します.
ユーザー名はlinuxの〇〇@××:~となっている〇〇のところです.
ipアドレス(xx.xx.xx.xx)はhostname -I | cut -d ' ' -f1で確認できます.

scp ~/.ssh/id_rsa.pub (サーバーのユーザー名)@(サーバーのipアドレス):~

3.【サーバー】公開鍵をauthorized_keysに追加

サーバーに対する操作は直接サーバーのシェルで操作するか, クライアントで以下のコマンドからパスワード認証することで可能になります.
1.公開鍵がコピーされていることを確認する

cd ~ && cat id_rsa.pub

2..sshディレクトリを作成

mkdir ~/.ssh

3..sshのパーミッション変更

chmod 700 ~/.ssh

4.~/.ssh/authorized_keysを作成

touch ~/.ssh/authorized_keys

5.~/.ssh/authorized_keysに追加

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

6.authorized_keysのパーミッション変更

chmod 600 authorized_keys

4.【クライアント】秘密鍵を用いることでサーバーにSSH接続できることを確認

以下でログイン可能です.
最初のログインはパスワード認証が必要ですが, 一度ログアウトexitして再度ログインする際にパスワード認証されずにログインできれば, 無事終了です!

ssh (サーバーのユーザ名)@(サーバーのipアドレス)

5.【サーバー】rootログイン・パスワードログインを禁止する

セキュリティ上の面からrootログインを禁止しましょう. また, 鍵認証の設定をしてのでパスワードログインも禁止してしまいましょう.

Emacsのインストール

その前に今回はEmacsを使って編集するのでEmacsをインストールしましょう. 以下を参照ください.
インストール
Ubuntu 18.04 にEmacsをインストール。設定まで - Qiita
使い方
突然だがEmacs を始めよう - Qiita
emacs コマンド一覧(置換・コピー・検索・終了)

もし, Emacsがまだよく分からないという方は, emacs ファイル名open ファイル名とすれば, txtファイルで編集できるのでそちらをご利用下さい.

では, 実際に設定を変更していきます.
rootログインして, sshd_configファイルを編集します. PermitRootLoginPasswordAuthenticationと書いてある行を探してnoと変更してください.

#rootログイン
su -
emacs /etc/ssh/sshd_config

===================================================================

# rootログイン禁止
PermitRootLogin no

# パスワードログイン禁止
PasswordAuthentication no

設定を変更したら sshサーバーを再起動します.

/etc/rc.d/init.d/sshd restart


6.【クライアント】SSHログインの簡略化

毎回ログインするたびにssh (サーバのユーザ名)@(ipアドレス)と入力するのはかなり面倒ですよね.
そこで~/.ssh/config.bash_profileで設定することで, 簡単にログインできるようにします!
初めに~/.ssh/configファイルで設定を加えます.

emacs ~/.ssh/config

===================================================================

Host *
   UseKeychain        yes
   AddKeysToAgent    yes
   IdentityFile    ~/.ssh/id_rsa

#Hostの後にサーバに対して固有な名称をつける(ここではhoge)
Host hoge
    HostName (ipアドレス)
    User (サーバのユーザ名)

これによりssh hogeのみでサーバにSSH接続できるようになります.

ssh hoge

さらに簡略化してみましょう!
.bash_profileで設定します. 以下のように設定することで, hogeを実行することで, ssh hogeが行われます.

emacs ~/.bash_profile

===================================================================

hoge() {
    ssh hoge
}

変更の反映

source .bash_profile

以下のようにhogeだけでSSH接続できるようになりました!

hoge


7. SSHファイル転送の簡略化

.bash_profileでファイル送信・ファイル受信の関数を定義することで
簡単にクライアントとサーバーでファイルを転送できるようにします.

emacs ~/.bash_profile

===================================================================

hoge() {
    ssh hoge
}

USER=(ユーザー名)

#idアドレス取得関数
function hostname_of() {
    host=$1
    result=command ssh -G $host | awk "/^hostname / { print $2 }" | cut -c 10-
    return $result
}

#ファイル送信 rsyncto hoge 送信場所のパス(クライアント) 受信場所のパス(サーバ) 
function rsyncto() {
    host=$(hostname_of $1)
    localpath=$2
    remotepath=$3
    echo $USER@$host:$remotepath
    command rsync -avz $localpath $USER@$host:$remotepath
}

#ファイル受信 rsyncfrom hoge 送信場所のパス(サーバ) 受信場所のパス(クライアント)
rsyncfrom() {
   host=$(hostname_of $1)
   remotepath=$2
   localpath=$3
   command rsync -avz $USER@$host:$remotepath $localpath
}

これによって, 例えば以下のように, クライアントの~/hogehogeをhogeサーバーの./に送信することができます!

rsyncto hoge ~/hogehoge ./