ssh接続と便利なターミナル設定の話

# この記事について
この記事はNITech-Katolab Advent Calendar 2024への参加記事となっています．
一般的な環境で動くかと思われますが，一部Katolab向けの仕様となっている可能性もあります．ご了承ください．
感覚と手触りによって成り立っているので正しさは保証できません．詳細は各自で調べてください

# ssh接続とは（ド簡単に）
ssh接続はリモートでコンピュータに繋ぐことができる技術のこと．
WindowsやMacからUbuntuコンピュータにアクセスすることができ，ターミナル上からほとんどの操作をすることができる．
向こうで開いたターミナルの画面だけを自分のモニターに表示するイメージ．

# ssh接続してみよう
ターミナル上で
```
ssh [ホスト名]
```
と打つだけで簡単に接続することができる．
この場合は現在PCにログインしている名前でログインを試行する．
ユーザ名を指定したい場合は
```
ssh [ユーザ名]@[ホスト名]
```
と入力することでユーザ名を指定できる．
初回接続時には接続先が信頼できるかどうかの確認のため
```
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```
と聞かれるが，これはyesでOK
あとは接続先でパスワードを聞かれるのでそれを入力するだけ．

おめでとう．これで君もssh接続ができるようになったね！

# VSCodeを使ってsshしよう
なんとvscodeでもsshできます！
1. 左下の青い部分をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930299/fe6209fb-9576-c930-b8d5-4fdc6a645cfc.png)
2.ホストに接続するをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930299/6c6556f4-7768-ed2a-2c2f-45412b02d6fe.png)
3.ホスト名・パスワードを入力
4.エクスプローラーからフォルダを開くを選択して開くとより便利に
（もう一度パスワードを要求される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930299/9d5012c8-1c86-3942-4f3f-fa3a1e8fc14c.png)

# パスワード無しでssh接続したい！！！
sshするたびにパスワードをいちいち入力するのは非常に面倒．
暗号鍵認証することでパスワードを入れずにssh接続することができるようになる．

## とりあえず手順貼り付け
```
# ホームディレクトリで作業することを想定

# 手元の端末で鍵を作る
# 入力を求められるので，何も入力せずにEnterを連打
# windowsの場合デフォルトではC:\Users\[ユーザ名]\.ssh に入る
ssh-keygen -t ed25519

# ssh先に鍵を送る
# 直接id_ed25519の中身をコピペしてvimなどで貼り付けしてもよい．
cat .\.ssh\id_ed25519.pub | ssh [ユーザ名]@[ホスト名] sh -c "cat - >> ~/.ssh/authorized_keys"
```


```
# .ssh\configファイルに以下の設定を追加で書き込む
Host *
  User ユーザ名
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
  IdentityFile C:\Users\ユーザ名\.ssh\id_ed25519
```
これにより簡単にパスワード無しでssh接続できるようになります．やったね！
## ここまでの参考
暗号鍵認証の方法
[Windows Terminalの新規ターミナルに項目追加して1操作で指定サーバーにssh接続できるようにする](https://zaki-hmkc.hatenablog.com/entry/2020/09/03/083634)
sshconfigの書き方
[OpenSSHの警告メッセージを出さないようにする方法](https://qiita.com/shotaTsuge/items/48bdaccdafa5475d9016)
[ssh を config ファイルで管理して快適にする](https://s10i.me/whitenote/post/42)

# そして快適へ
ここまでを読んだ皆さんは思ったことでしょう．
「あれ？こんなんいくらでもネットに転がってるじゃん！」
**ここからがこの記事の神髄なんです！**
ssh接続とは直接関係無いものの，知っているとターミナル操作が格段に楽になるお役立ち小技を紹介！
## .tcshrcと.bashrc
tcshとbashはシェルの種類である．
一口にターミナルを開くといってもどのシェルを使っているかによって少しずつ記法が違ったりする．
tcshを起動すると.tcshrcに書かれたことが自動で読み込まれ，bashでも同様に.bashrcが読み込まれる.
.tcshrcや.bashrcはホームディレクトリに置きます．（一番最初に開かれるディレクトリ（単にcdとだけ入力したあとに移動したディレクトリ））
つまり？
**sshでログインしたときに好きな動作を指定して実行することができる**
（正確にはターミナル起動時だけど）
これは革命ですよ．ええ．
「他の人が同じ端末にログインしてないか確認するの面倒だなぁ～」
「普段bash使ってるけど共有マシンではtcshだからいちいちbashにするの面倒なんですよね～」
みたいな人間たちはtcshファイルにこれを書き込むだけで**即**bashで操作が可能に
```
who
bash
```
「いちいちbash_profile読み込むの面倒～～～」
お任せあれ．今度は.bashrcに
```
source bash_profile
who
```
「いちいち作業フォルダにcdするの面倒！！！」
```
alias= work='/home/kyoyu/myfolder/workspace/GekiTsuyoKokusaiGakkai'
```
```
user@MyPC:~$work
user@myPC:/home/kyoyu/myfolder/workspace/GekiTsuyoKokusaiGakkai$
```
嗚呼......なんて楽なんでしょう．
ただしこの設定，ちょっと欠点がありまして
.tcshrcに色々書き込まれているとscpコマンドがうまく動かないときがあります．
そのため，.tcshrcの最初に以下のおまじないを書くことをおすすめします．
```
if (! $?prompt) then
    exit
endif
```
これはprompt定義されているときだけ今後のコードを読み取る設定になっており，scpなどでログインしたときにはこのコード以下が読まれないようになっています．
これで君も.tcshrc .bashrcマスターだ！！！

．
．．
．．．
**甘えんな！！！**
**こんなもんでマスターできるわけないだろ！！！！**

## ログイン時に指定のメッセージを表示する
ログイン時に指定のメッセージを表示したいですよね
ToDoリストとか，コマンドチートシートとか見られたらめちゃ素晴らしい✨
あらかじめサーバの中に動的にテキストファイルを更新するシステムがあればそのファイルを表示だってできちゃう．
Katolabでは共有コンピュータへのログイン表示についてwebアプリで管理しているので，今回はそれを拾ってターミナル上に表示するような例を考えよう
### 使用例
A男君は自動更新される以下のファイルから情報を切り取ってターミナルに表示したいと考えている．
```
--hostname1--
LOGIN: 
    USING: 
CPU STATE: 0 %
GPU STATE: Exit 1

--hostname2--
LOGIN: 
    USING: 
CPU STATE: 0 %
GPU STATE: Exit 1

--hostname3--
.
.
.

```


A男「これはtcshrcに書き込めば実装できそうだな！」
A男「まずは今ログインしている端末名を調べよう」
```
set start_string = --`hostname`
```
A男「端末ごとの表示行の最後にはGPUの文字が含まれるから」
```
set end_string = "GPU"
```
A男「pathの指定も忘れずに」
```
set file_path = "/home/kyoyu/system/computer.txt"
```
A男「あとはsedコマンドで実行するだけ！」
A男「万が一ファイルが見つからなくてもエラーをはかないように工夫も忘れずに～♪」
```
if (-e $file_path) then
    sed -n "/$start_string/,/$end_string/p" $file_path
else
    echo "File not found: $file_path"
endif
```
A男「これで僕も.tcshrcマスターだ！！！」
以下全文
```
set start_string = --`hostname`
set end_string = "GPU"
set file_path ="/home/kyoyu/system/computer.txt"
if (-e $file_path) then
    sed -n "/$start_string/,/$end_string/p" $file_path
else
    echo "File not found: $file_path"
endif
```


# まとめ
sshはコマンド操作技術と直結していることもあり，便利な反面使ってみるまでのハードルが高いです．
でも使いこなせるとかなり楽に色々できるようになるし，なによりカッコいい！
どんどんターミナル操作を使いこなせるようになってどんどんssh接続していこう！！