tag:crieit.net,2005:https://crieit.net/tags/SSH/feed 「SSH」の記事 - Crieit Crieitでタグ「SSH」に投稿された最近の記事 2024-02-27T00:48:40+09:00 https://crieit.net/tags/SSH/feed tag:crieit.net,2005:PublicArticle/18777 2024-02-27T00:46:48+09:00 2024-02-27T00:48:40+09:00 https://crieit.net/posts/Raspberry-Pi-5-Ubuntu-24-04-LTS-SSH Raspberry Pi 5 に Ubuntu 24.04 LTS を入れて SSH するまで <p>ついに日本でも、 Raspberry Pi 5 の技適対応モデルが発売された。</p> <p>Raspberry Pi にインストールする OS と言えば、まずは <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.com/software/">Raspberry Pi OS (旧 Raspbian)</a> だが、同じ Debian ベースの <a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/download/raspberry-pi">Ubuntu</a> も Raspberry Pi 向けの公式イメージを出している。</p> <p>但し、 Raspberry Pi 5 に対応しているのは、 Ubuntu 23.10 (コードネーム: mantic) 以降のみとなる。</p> <p>現在リリース済みの 23.10 は「非LTS」バージョンとなり、サポートが 9ヶ月 (2024年6月まで) と短い。<br /> 常用するなら、サポートが 5年 (ESM なら 10年) と長い LTS バージョンが望ましいが、残念ながら 22.04 LTS Raspberry Pi 5 に非対応だ。</p> <p>LTS バージョンの次回リリースは 24.04 LTS (コードネーム: noble / 2024年4月リリース予定) で、現在絶賛開発中だ。</p> <p>そんな開発中の 24.04 LTS も、デイリースナップショットが手に入る。<br /> そいつを使って<strong>ディスプレイやキーボードが無い状態</strong>で、インストールから SSH 接続までやってみよう。</p> <p>Raspberry Pi 5 をターゲットに書いているが、 Raspberry Pi 3, 4, Raspberry Pi Zero 2 W でも同じ手順でできるはずだ。</p> <p>なお、この記事は 24.04 LTS がリリースされたら、それに併せて内容に書き換えていくつもり。</p> <h2 id="TL;DR"><a href="#TL%3BDR">TL;DR</a></h2> <ul> <li>microSD カードに Ubuntu の OS イメージを焼いたあと、 RasPi に挿す<strong>前</strong>に初回起動時の設定を書き換える</li> <li>cloud-init の挙動を理解しよう</li> <li>ディスプレイなし & 無線LAN Only だと少し工夫がいる</li> <li>今回の記事の内容は、<a target="_blank" rel="nofollow noopener" href="https://aquasoftware.net/blog/?p=1404">Raspberry Pi に Ubuntu を入れて SSH でログインするまでの A to B | Aqua Ware つぶやきブログ</a> の二番煎じ <ul> <li>Ubuntu 24.04 LTS に合わせて内容はアップデートされている</li> </ul></li> </ul> <h2 id="準備するもの"><a href="#%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE">準備するもの</a></h2> <ul> <li>Raspberry Pi 5 <ul> <li>Raspberry Pi 3, 4 でも同じ手順でいけるはず</li> </ul></li> <li>4GB 以上の micorSD カード <ul> <li>IOPS が高い、「アプリケーションパフォーマンスクラス」が A2 のものが良いだろう。値段や速度を考えると、実用上は 64GB 以上になるだろうか。</li> <li>私は、<a target="_blank" rel="nofollow noopener" href="https://amzn.to/42J1AeI">ARCANITE 64GB microSDXCカード 【A2】、UHS-I U3、V30、4K、C10</a> 値段の割にパフォーマンスが良かったため、これを使った。</li> <li>後述するが、最終的には NVMe SSD にした方が断然良い</li> </ul></li> <li>microSD を書き込める PC (Win, Linux, mac)</li> <li>インターネットに繋がる Wi-Fi または イーサネットケーブル</li> </ul> <p>以下もあると便利だが、今回の手順では無くても問題ない。</p> <ul> <li>micro-HDMI で繋がるディスプレイ 又は 変換コネクタ</li> <li>RasPi に繋げる USB キーボード</li> </ul> <h2 id="イメージファイルの取得"><a href="#%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%8F%96%E5%BE%97">イメージファイルの取得</a></h2> <p>正式リリース前の Raspberry Pi 向けデイリースナップショットイメージは、以下のいずれかから手に入る。</p> <p>今回は、サーバーOS的に SSH して使う事が目的なので、<strong>後者のサーバー版</strong>を利用する。</p> <ul> <li>Raspberry Pi 向けデスクトップ版イメージ <ul> <li><a target="_blank" rel="nofollow noopener" href="https://cdimage.ubuntu.com/daily-preinstalled/current/">https://cdimage.ubuntu.com/daily-preinstalled/current/</a></li> </ul></li> <li>Raspberry Pi や、汎用 64-bit ARM, RISC-V 向けサーバー版イメージ <ul> <li><a target="_blank" rel="nofollow noopener" href="https://cdimage.ubuntu.com/ubuntu-server/daily-preinstalled/current/">https://cdimage.ubuntu.com/ubuntu-server/daily-preinstalled/current/</a></li> </ul></li> </ul> <p>リンク先から、 <code>noble-preinstalled-server-arm64+raspi.img.xz</code> を選択してダウンロードしよう。</p> <p>24.04 LTS が正式リリースされれば、 <a target="_blank" rel="nofollow noopener" href="https://ubuntu.com/download/raspberry-pi">Install Ubuntu on a Raspberry Pi | Ubuntu</a> のページからダウンロードできるようになるはずだ。</p> <h2 id="ブータブル SD の焼き込み"><a href="#%E3%83%96%E3%83%BC%E3%82%BF%E3%83%96%E3%83%AB+SD+%E3%81%AE%E7%84%BC%E3%81%8D%E8%BE%BC%E3%81%BF">ブータブル SD の焼き込み</a></h2> <p>ダウンロードしたイメージファイルを、ブート可能な状態で microSD に書き込む。<br /> ダウンロードしたファイルをただ SD カードに保存するのではなく、専用のツールで書き込む必要があるぞ。</p> <p>方法は色々あるのだが、今回は個人的にオススメな <a target="_blank" rel="nofollow noopener" href="https://www.balena.io/etcher/">balenaEtcher</a> を使った方法で紹介しよう。</p> <ol> <li>microSD を SDカードスロットに挿す</li> <li>balenaEtcher を DL & 起動する。 <ul> <li>DLする balenaEtcher は Portable 版で良い</li> </ul></li> <li>前項でダウンロードするした <code>***.img.xz</code> を選択して、書き込みを開始する <ul> <li><code>***.img.xz</code> は、 <code>***.img</code> ファイルを <code>.xz</code> 形式で圧縮したものなのだが、手動で解凍せず直接 balenaEtcher で選択してしまって問題ない。 balenaEtcher は書き込み時にオンザフライで解凍する。</li> </ul></li> </ol> <p>なお、リリース済みの Ubuntu (や Raspberry Pi OS など) であれば、一般的に <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.com/software/">Raspberry Pi Imager</a> というツールを使った方法がオススメされるのだが、DLが遅いからか、全体的に時間がかかるので私はあまりオススメしない。</p> <h2 id="system-boot パーティション内の cloud-init 等の設定を書き換える"><a href="#system-boot+%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E5%86%85%E3%81%AE+cloud-init+%E7%AD%89%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">system-boot パーティション内の cloud-init 等の設定を書き換える</a></h2> <p>作成した micorSD を早速 RasPi に挿す <strong>…前に</strong> 、 初回セットアップ設定を書き換える。</p> <p>一度書き込んだ microSD を再び PC に挿し直すと、 <code>"system-boot"</code> という 500MB 位の FAT32 パーティションが開けるはずだ。</p> <p>ここには、 cloud-init という仕組みで初回起動時の設定を定義するファイルがいくつか含まれている。<br /> これらを書き換えていく。</p> <p>書き換え後のファイルは <a target="_blank" rel="nofollow noopener" href="https://gist.github.com/advanceboy/c9b020fe09ababd390c0e95d74dfde7e">こちらの Gist</a> に置いてあるので、結果だけ欲しい人はここから DL をば。</p> <h3 id="cloud-init の network-config"><a href="#cloud-init+%E3%81%AE+network-config">cloud-init の network-config</a></h3> <p>以下のように書き換える。<br /> (元のファイルからの差分を <code>diff</code> のフォーマットで表示している。 以降同様。)</p> <pre><code class="diff">--- network-config.org +++ network-config @@ -22,23 +22,11 @@ ethernets: eth0: dhcp4: true optional: true -# wifis: -# wlan0: -# dhcp4: true -# optional: true -# access-points: -# myhomewifi: -# password: "S3kr1t" -# myworkwifi: -# password: "correct battery horse staple" -# workssid: -# auth: -# key-management: eap -# method: peap -# identity: "[email protected]" -# password: "passw0rd" -# ca-certificate: /etc/my_ca.pem - -# regulatory-domain: GB + wifis: + wlan0: + dhcp4: true + access-points: + "SSID-of-myhomewifi": + password: "password-of-myhomewifi" </code></pre> <p>Ubuntu では Netplan を使ってネットワークが管理されるため、 Netplan の形式で記述する。</p> <p>規定値では IPv4 の有線イーサネットのみ、 DHCP 自動取得で接続されるようになっている。<br /> 必要に応じて、上述のように Wi-Fi で接続する SSID 等の情報を追記したり、逆に有線LANを使わないなら <code>ethernet:</code> プロパティごと削除してしまってもよいだろう。</p> <p>SSID やパスワードは、各自の環境のものに置き換えて書き換えてほしい。</p> <p>コメントアウトされている wifi の記述例では、 <code>wifis.wlan0.optional</code> を <code>true</code> に設定しているが、もし Wi-Fi 単独でネットワークに接続するつもりならこの設定は行わないようにしよう。<br /> さもないと、OS起動の度に2分も余計に時間かかる羽目になる。<br /> これは、 <code>systemd-networkd-wait-online.service</code> デーモンが、(optional true を指定していない) 有効なネットワークの接続をタイムアウトするまで待機してしまうためだ。</p> <p>network-config 自体のリファレンスはこちら。<br /> <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/23.4.1/reference/network-config.html">https://cloudinit.readthedocs.io/en/23.4.1/reference/network-config.html</a></p> <h3 id="cloud-init の user-data"><a href="#cloud-init+%E3%81%AE+user-data">cloud-init の user-data</a></h3> <p>こちらは書き換え箇所が多いので、何箇所かに分けて説明していく。</p> <p>まず最初はユーザー名まわり。</p> <pre><code class="diff">--- user-data.org +++ user-data @@ -17,13 +17,17 @@ # Some additional examples are provided in comments below the default # configuration. +# Override the `default_user` configuration from `/etc/cloud/cloud.cfg`. The `user` dictionary keys supported for the default_user are the same as the `users` schema. +user: + name: newusername + # On first boot, set the (default) ubuntu user's password to "ubuntu" and # expire user passwords chpasswd: expire: true users: - - name: ubuntu - password: ubuntu + - name: newusername + password: newpassword type: text ## Set the system's hostname. Please note that, unless you have a local DNS </code></pre> <p>規定では、 cloud-init パッケージの <code>/etc/cloud/cloud.cfg</code> ファイルの定義によって、 "ubuntu" というユーザーが作成される。</p> <p>しかし、 既知のユーザー名をそのまま使うのはセキュリティ的にも若干不安があるし、 作成後のユーザー名を書き換えるのは若干面倒なので、作成されるデフォルトのユーザー名自体を、他の名前 (上記例だと "newusername") に書き換えてしまおう。</p> <p>また、 <code>chpasswd</code> による、初回アクセス時のパスワード変更対象とするユーザー名も、併せて変更しておく。</p> <p>--</p> <p>次にホスト名とキーボード周りの設定。</p> <pre><code class="diff">@@ -31,14 +35,14 @@ ## setting the hostname here will not make the machine reachable by this name. ## You may also wish to install avahi-daemon (see the "packages:" key below) ## to make your machine reachable by the .local domain -#hostname: ubuntu +hostname: ubuntu-raspi5 ## Set up the keyboard layout. See localectl(1), in particular the various ## list-x11-* sub-commands, to determine the available models, layouts, ## variants, and options -#keyboard: -# model: pc105 -# layout: gb +keyboard: + model: pc105 + layout: jp # variant: # options: ctrl:nocaps </code></pre> <p>ここはまぁ、見た通りなので追加での説明はいらないかな。</p> <p>--</p> <p>お次は SSH まわり。</p> <pre><code class="diff">@@ -53,6 +57,8 @@ #ssh_import_id: #- lp:my_launchpad_username #- gh:my_github_username +ssh_authorized_keys: +- ssh-rsa AAAA<中略>== rsa-key-of-user1 ## Add users and groups to the system, and import keys with the ssh-import-id ## utility </code></pre> <p><code>ssh_authorized_keys</code> に直接指定するか、<code>ssh_import_id:</code> のところで自分の GitHub のユーザー名を指定してインポートすることにより、 デフォルトのユーザー (上記例だと "newusername") に登録する公開鍵を指定する。</p> <p>SSH に登録するパスワードログインは規定で禁止されているので、この設定をしておかないと SSH による遠隔からのアクセスができない。</p> <p>--</p> <p>タイムゾーンや起動後の処理まわり。</p> <pre><code class="diff">@@ -82,8 +88,13 @@ #- python3-gpiozero #- [python3-serial, 3.5-1] +# locale and timezone +timezone: Asia/Tokyo + ## Write arbitrary files to the file-system (including binaries!) -#write_files: +write_files: +- path: /etc/cloud/cloud-init.disabled + defer: true #- path: /etc/default/console-setup # content: | # # Consult the console-setup(5) manual page. </code></pre> <p>とりあえずタイムゾーンは日本標準時にしておこう。</p> <p>次に、 <code>write_files:</code> のほうだが、これは次回以降のブート時に cloud-init が余計に起動しないようにするための設定だ。</p> <p>cloud-init の設定の大半は、 初回ブート時にただ一度だけ実行されるのだが、 cloud-init サービス自体は基本的に毎回常に起動して、サービスとして常駐しっぱなしになっている。<br /> <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/topics/modules.html">Modules</a> で、 <code>Module frequency: per always</code> となっているモジュールの実行などは、ブートする度に毎回実行される。<br /> そうすると、場合によっては cloud-init の実行ログがログイン画面を覆ってしまうことが毎回の起動ごとに発生して鬱陶しい。<br /> このため、 <code>/etc/cloud/cloud-init.disabled</code> という <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/howto/disable_cloud_init.html#method-1-text-file">空ファイルを作成しておく</a> ことで、 次回以降の起動時に cloud-init を無効にしている。</p> <p><code>defer: true</code> が指定されている部分についてだが、これは cloud-init の初期化処理が大きく分けて Network (<code>cloud_init_modules</code>), Config (<code>cloud_config_modules</code>), Final (<code>cloud_final_modules</code>) という <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/explanation/boot.html">3ステージ に分かれて</a> いることに関係する。<br /> <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/reference/modules.html#write-files"><code>write_files:</code> モジュール</a> は Ubuntu の既定だと Network ステージに実行されてしまい、このタイミングで <code>cloud-init.disabled</code> ファイルが作成されてしまうと、 Config や Final ステージの処理が実行されなくなってしまう。<br /> このため、 <code>defer</code> オプションを true にして Final ステージで <code>cloud-init.disabled</code> ファイルが作成されるよう調整しているのだ。</p> <p>なお、どのモジュールがどのステージで実行されるかは、 <a target="_blank" rel="nofollow noopener" href="https://cloudinit.readthedocs.io/en/latest/reference/base_config_reference.html#example"><code>/etc/cloud/cloud.cfg</code></a> で定義されている。<br /> (各ディストリビューション毎の <a target="_blank" rel="nofollow noopener" href="https://git.launchpad.net/ubuntu/+source/cloud-init/tree/config/cloud.cfg.tmpl?h=ubuntu/noble"><code>cloud.cfg</code> のテンプレートソースはこちら</a>)</p> <hr /> <p>最後に、コマンドの実行。<br /> 以下の <code>192.168.0.2</code> の部分は、 ssh で RasPi に接続するゲスト PC の IPアドレス に書き換えてくれ。</p> <pre><code class="diff">@@ -106,7 +117,9 @@ # permissions: '0644' ## Run arbitrary commands at rc.local like time -#runcmd: +runcmd: +# after wlan0 is connected, write the arp entry to target machine on background job +- [ sh, -c, 'sleep 2; ping -c 4 192.168.0.2' ] #- [ ls, -l, / ] #- [ sh, -xc, "echo $(date) ': hello world!'" ] #- [ wget, "http://ubuntu.com", -O, /run/mydir/index.html ] </code></pre> <p>このコマンドは、仮に ssh ゲストの IP アドレスが <code>192.168.0.2</code> であると仮定して、そこへ向かって Ping を打っている。<br /> なぜなら、 ゲストPC から RaspPi の IP アドレスを ARP コマンドで確実に調べられるようにするためだ。</p> <p>RasPi に繋げるディスプレイがないことを前提とすると、 SSH するために DHCP によって RasPi に割り当てられた IP アドレスをどうやって調べるのか、と言う問題に直面する。</p> <p>RasPi の MAC アドレスの先頭 24bit は、 Raspberry 財団の所持する OUI から割り当てられるはずなので、以下のいずれかになるはずだ。</p> <pre><code>28:CD:C1 2C:CF:67 B8:27:EB D8:3A:DD DC:A6:32 E4:5F:01 </code></pre> <p>通常、 RasPi がオンラインになったときに、 ARPリクエストがブロードキャストされるため、 同一ネットワーク内の PC の ARP テーブルに RasPi のレコードが追加され、 以下のような arp コマンドで対象の IP アドレスを調べることができるようになる。。。 <strong>多くの場合は。</strong></p> <pre><code class="powershell">while(1) { arp -a | ?{ $_ -match '\s(28-cd-c1|2c-cf-67|b8-27-eb|d8-3a-dd|dc-a6-32|e4-5f-01)' }; Start-Sleep -Seconds 1} </code></pre> <p>ところが、 RasPi が Wi-Fi で繋いでいる先が (単なるアクセスポイントではなく) ルーターだったりすると、 RasPi が 同じサブネット内に ARPリクエスト をブロードキャストしたのにも関わらず、 ルーターが無駄に気を利かせて ARPリクエスト を代替して投げてしまい、 同じサブネットの別の端末の ARP テーブルには、 RasPi の MAC アドレスのレコードが記録されないことがある。</p> <p>そこで、 RasPi 側から SSH のアクセス元となる PC を指定して ping を投げることで、 その PC の ARP テーブルに確実に RasPi が載るようにしている。</p> <p>--</p> <p>ここまで書き換えたら、 SD カードを取り外して RasPi に挿し、いよいよ起動する。</p> <h3 id="cloud-init 周りの補足"><a href="#cloud-init+%E5%91%A8%E3%82%8A%E3%81%AE%E8%A3%9C%E8%B6%B3">cloud-init 周りの補足</a></h3> <p>system-boot パーティション内の中身について、もう少し細かい仕組み周りを深堀りして補足したい。<br /> 興味が無ければ、読み飛ばしてしまって次の章に進んでもらって問題ない。</p> <p>system-boot パーティション直下にある <code>README</code> というファイルを開くと、このパーティションに存在するファイルの概要が簡単に書いてある。</p> <pre><code class="text:README">================== The Boot Partition ================== This file belongs to the boot partition of the Ubuntu Server for Raspberry Pi. ... </code></pre> <p>このパーティションには、Raspberry Pi に於ける BIOS の代替となる <a target="_blank" rel="nofollow noopener" href="https://www.raspberrypi.com/documentation/computers/config_txt.html">config.txt</a> といった H/W 設定用のファイルや、 cloud-init の構成ファイルなどが含まれていることがわかる。</p> <p>このうち、<strong>cloud-init</strong> は Infrastructure as Code (IaC) の一種だ。<br /> その名の通り、 AWS などのクラウド上の仮想マシンの初期設定を念頭においた仕組みだが、それに留まらず、一般的な Linux インスタンスの初期設定に活用される。<br /> 設定内容は、YAML形式の設定ファイルを使用して記述し、クラウドやディストリビューションの違いをある程度吸収して初期設定を行うことができる。<br /> Ubuntu の OS のイメージ内には、事前に cloud-init のサービス(デーモン)が組み込まれており、OS の起動時に何らかの方法で指定された設定ファイルを読み取って、初回設定処理が実行される仕組みとなっている。</p> <p>Raspberry Pi 用の Ubuntu Server イメージでは、この cloud-init 用の設定ファイルが上記の <code>system-boot</code> パーティションから取得される。<br /> イメージ内のデフォルト値の定義と、<code>system-boot</code> パーティション内のユーザー定義が組み合わされ、初期設定が進められるワケだ。</p> <p>たとえば、今回 microSD に書き込んだイメージをそのまま書き換えずに Ubuntu を起動すると、ユーザー認証が以下のように構成される。</p> <ol> <li><code>ubuntu</code> というユーザーID</li> <li><code>ubuntu</code> というパスワード</li> <li>初回起動時にパスワードの変更を求める</li> <li>SSH サーバーの起動</li> </ol> <p>このうち、 (1), (4) は、OSに組み込まれた <code>/etc/cloud/cloud.cfg</code> の定義によるもの。<br /> そして、 (2), (3) は <code>system-boot</code> パーティション内の <code>user-data</code> ファイル内の以下の部分の定義によるモノだ。</p> <pre><code class="yaml:user-data">#cloud-config chpasswd: expire: true users: - name: ubuntu password: ubuntu type: text </code></pre> <p>このデフォルトの構成だと流石にセキュリティ的にアレなので、書き換えを行っている… というのが、前項の設定の真相となる。</p> <h2 id="Raspberry Pi に割り当てられた IP アドレスを調べられるようにして起動"><a href="#Raspberry+Pi+%E3%81%AB%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%89%E3%82%8C%E3%81%9F+IP+%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%89%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%A6%E8%B5%B7%E5%8B%95">Raspberry Pi に割り当てられた IP アドレスを調べられるようにして起動</a></h2> <p>こんな感じでひととおりファイルを書き換えたら、いよいよ RasPi を起動する。</p> <p>…と、その前に、 ssh でつなぐ予定のゲスト端末で、管理者権限で以下のコマンドを実行し、端末内の「arp テーブル」をリセットする。</p> <pre><code class="powershell">arp -d * </code></pre> <p>その後、ようやくだが RasPi に microSD を挿して起動させよう。<br /> 初回ブート時の設定を適用しながら起動してくれる。</p> <p>ssh でつなぐ予定のゲスト端末の PowerShell で、以下のような arp コマンドのループを実行し、ゲストPC から RasPi の IPアドレスを調べよう。<br /> 初回起動され安定しただろうところ(SDカードの I/O 性能によるが 1~5分?)で、 RasPi の IP アドレスがヒットしてくるようになるはずだ。</p> <pre><code class="powershell">while(1) { arp -a | ?{ $_ -match '\s(28-cd-c1|2c-cf-67|b8-27-eb|d8-3a-dd|dc-a6-32|e4-5f-01)' }; Start-Sleep -Seconds 1} </code></pre> <p>公開鍵の登録が適切に行えれば、その IP アドレスに対し SSH できるはずだ。</p> <p>初回アクセス時は、以下のようなパスワード変更を求められる。</p> <pre><code>WARNING: Your password has expired. You must change your password now and login again! Changing password for newusername. </code></pre> <p>古いパスワード ("newpassword") と変更後のパスワードを改めて入れる。</p> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>一般的な1列端子の microSD で最速な UHS-I SDR104 のバスインターフェースに Raspberry Pi 5 が対応したことや、最近の安価な microSD の I/O 速度もだいぶ向上したのも相まって、 RasPi 4B が登場した頃と比べると、体感できる I/O 性能が大きく向上している。<br /> おかげで、起動やパッケージのインストール、更新などが快適になった。</p> <p>だいぶ高価になってしまった価格的な面からも、 Raspberry Pi の 非Zero/Pico シリーズは「Linuxが動くマイコン」から「小型のLinuxマシン」という面がより強くなったと感じる。<br /> (それはどうなんだという気もするけど。)</p> <p>更に RasPi 5 では PCI Express (PCIe) にも対応しているため、 NVMe で繋いだ SSD からブートさせると、更に桁違いの高速化が臨める。</p> <p>近いうちに、そちらも試してみようと思う。</p> <p>…ただ、どうせ PCIe に対応するなら、microSD Express に対応してくれれば、 NVMe 用 HAT とか買い足さんで済むから良かったのにな~…と、思わんでもない。<br /> しかし、2019年にSD7.1の規格として登場してから4年も経った2024年現在その製品が売られているとこを見たことないので、まぁ無理な相談か。</p> advanceboy tag:crieit.net,2005:PublicArticle/18265 2022-07-29T07:33:22+09:00 2022-07-29T07:33:22+09:00 https://crieit.net/posts/15538b281af3d9bb53ada98193886b4e 旅先でサーバ上のデータベースをメンテナンスする <p>以前に投稿した記事「旅先でクラウド上のWindowsサーバにRDP接続」は、Androidセルフォンのアプリケーションで、SSHのポートフォワードを介して<br /> WindowsサーバにRDP接続するというものでした。</p> <p><a href="https://crieit.net/posts/Windows-RDP">旅先でクラウド上のWindowsサーバにRDP接続</a></p> <p>この記事で紹介した、僕を助けてくれるアプリケーションのうちの1つがこれなんです。</p> <p><a href="https://crieit.now.sh/upload_images/0f1620b003abae44c6e2dc0b9a1cb92a62e30b62d0a6f.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0f1620b003abae44c6e2dc0b9a1cb92a62e30b62d0a6f.png?mw=700" alt="image" /></a></p> <p>これのポートフォワード設定を追加してあげると、セルフォンのアプリケーションから、サーバのデータベースのデータを参照したり更新したりすることができます。<br /> 皆さんもご存知のとおり、あたりまえのことなんですけどね。<br /> <a href="https://crieit.now.sh/upload_images/029983100bf745182d0640da3a29124262e304560a1a0.jpeg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/029983100bf745182d0640da3a29124262e304560a1a0.jpeg?mw=700" alt="image" /></a></p> <h2 id="ポートフォワード"><a href="#%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%89">ポートフォワード</a></h2> <p>ConnectBotのSSHに下図にようなポートフォワードを追加してあげます。この例は、SSHサーバのローカルで稼働するMySQLに接続する設定です。<br /> <a href="https://crieit.now.sh/upload_images/47822d9b8e2a2f058338bdd5f7b2763562e30bf7b571b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/47822d9b8e2a2f058338bdd5f7b2763562e30bf7b571b.png?mw=700" alt="image" /></a><br /> RDPは以前に設定したものです。</p> <h2 id="データベースのデータを操作するアプリケーション"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">データベースのデータを操作するアプリケーション</a></h2> <p>データベースのデータを操作するのに便利なアプリケーションがあります。僕の好みです。皆さんの評価など受け付けません。<br /> <a href="https://crieit.now.sh/upload_images/f6942cff736d92fe0736b22d959d417062e30d0b1153c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f6942cff736d92fe0736b22d959d417062e30d0b1153c.png?mw=700" alt="image" /></a><br /> MySQLへの接続はこんなふうにしてあげます。<br /> <a href="https://crieit.now.sh/upload_images/8822652800e925e419f3ed4441f1dff062e30d7d6ad50.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8822652800e925e419f3ed4441f1dff062e30d7d6ad50.png?mw=700" alt="image" /></a><br /> デフォルトでSQLiteへの接続が見えますが、ここにSQLiteがいれば、おそらくつながるのでしょう。<br /> <a href="https://crieit.now.sh/upload_images/b02515b7e752989101e54ece9e6f6e0462e30dc24b9c7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b02515b7e752989101e54ece9e6f6e0462e30dc24b9c7.png?mw=700" alt="image" /></a><br /> MySQLをクリックすると、こんなふうにオブジェクトが見えるようになります。<br /> <a href="https://crieit.now.sh/upload_images/740d71e54addfcf9377a6b27426a139a62e30e1268e41.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/740d71e54addfcf9377a6b27426a139a62e30e1268e41.png?mw=700" alt="image" /></a></p> COOL MAGIC PRODUCTS tag:crieit.net,2005:PublicArticle/18260 2022-07-25T21:47:47+09:00 2022-07-25T23:01:21+09:00 https://crieit.net/posts/Windows-RDP 旅先でクラウド上のWindowsサーバにRDP接続 <p>この記事には、目新しい技術は書かれていません。既成のアプリケーションの使い方のひとつが紹介されているだけです。</p> <p>旅先でクラウド上のWindowsサーバにRDP接続したいな、という機会は、僕にはたくさんあります。PCを使える状況であればPCを使えば良いのですが、例えば電車の中などでPCを使えない、あるいはPCは使えるけどそれも面倒という場面も僕にはたくさんあります。<br /> こんなときのために、僕にはセルフォンがあるのです。</p> <h2 id="外部からの接続"><a href="#%E5%A4%96%E9%83%A8%E3%81%8B%E3%82%89%E3%81%AE%E6%8E%A5%E7%B6%9A">外部からの接続</a></h2> <p>外部から目的のWindowsサーバにRDPで接続するには、間にSSHが配置され、このSSHがポートフォワードしてくれる、というのが前提です。当然ながら、SSH接続には鍵が必要というのも前提です。<br /> つまり、何の変哲もない一般的な構成です。</p> <h2 id="僕を助けてくれるAndroidアプリ"><a href="#%E5%83%95%E3%82%92%E5%8A%A9%E3%81%91%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8BAndroid%E3%82%A2%E3%83%97%E3%83%AA">僕を助けてくれるAndroidアプリ</a></h2> <p>こういった場面で僕を助けてくれるAndroidアプリは以下の2つです。どちらか1つというわけではなく、2つがタックで助けてくれます。</p> <ul> <li>ConnectBot</li> <li>Remote Desktop</li> </ul> <p>これらはよく配慮された機能をもち、かつ余分な機能を持たないという、セルフォンのアプリケーションとして優れた特徴を持ったアプリケーションです。<br /> <a href="https://crieit.now.sh/upload_images/d56076624b7e1efe9cc376dfadad312b62de9ea0cb881.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d56076624b7e1efe9cc376dfadad312b62de9ea0cb881.png?mw=700" alt="image" /></a><br /> <a href="https://crieit.now.sh/upload_images/a15fd3a22e58e5d358e77d9e1f0b9d9862de9ec12704a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a15fd3a22e58e5d358e77d9e1f0b9d9862de9ec12704a.png?mw=700" alt="image" /></a></p> <h2 id="使い方"><a href="#%E4%BD%BF%E3%81%84%E6%96%B9">使い方</a></h2> <p>ConnectBotの設定を事前に行っておくべきです。</p> <h3 id="ConnectBot"><a href="#ConnectBot">ConnectBot</a></h3> <p>以下はConnectBotの設定です。</p> <p>"Manage Pubkeys"を使って、サーバへのSSH接続を行うための鍵を登録します。<br /> <a href="https://crieit.now.sh/upload_images/bd584093bd0999427a3c12f2f66be6e462de95445d595.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bd584093bd0999427a3c12f2f66be6e462de95445d595.png?mw=700" alt="image" /></a><br /> 鍵を登録した状態です。<br /> <a href="https://crieit.now.sh/upload_images/7f2e4dfbf1cef4fe59851276b2816fed62de9ee62bb97.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7f2e4dfbf1cef4fe59851276b2816fed62de9ee62bb97.png?mw=700" alt="image" /></a><br /> "Hosts"にSSHサーバを登録し接続します。鍵はここで使用します。SSHサーバへの登録と接続については、この記事では解説しません。難しくはないでしょう。</p> <p>SSHでSSHサーバに接続したら、メニューから[Port Forward]を選択します。<br /> <a href="https://crieit.now.sh/upload_images/372c4d79e6285840903eb025c3048e7562de94b11ae96.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/372c4d79e6285840903eb025c3048e7562de94b11ae96.png?mw=700" alt="image" /></a><br /> WindowsサーバのRDPへのポート・フォワードを設定します。<br /> <a href="https://crieit.now.sh/upload_images/be66b92cc798d4d94f8bf1b1f82c933262de9f17184cb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/be66b92cc798d4d94f8bf1b1f82c933262de9f17184cb.png?mw=700" alt="image" /></a></p> <h3 id="Remote Desktop"><a href="#Remote+Desktop">Remote Desktop</a></h3> <p>僕は、マイクロソフト社純正のアプリケーションを使用しています。<br /> ConnectBotによるSSH(= ポートフォワード)セッションを活かした状態で、RDPに接続します。<br /> <a href="https://crieit.now.sh/upload_images/698517cdfeff566370d6a2f2c9016cb562de9f2ebd751.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/698517cdfeff566370d6a2f2c9016cb562de9f2ebd751.png?mw=700" alt="image" /></a></p> COOL MAGIC PRODUCTS tag:crieit.net,2005:PublicArticle/17843 2021-12-10T23:34:08+09:00 2021-12-10T23:34:08+09:00 https://crieit.net/posts/ssh-login-by-password-in-docker-container-20211210 Dockerコンテナ に SSHログイン できるようにする(パスワード方式) <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>Dockerコンテナ でファイル永続化をすると便利ではあるのですが、 Windows-Linux間 だと異なるファイルシステム間で整合性を保つ処理でもたつき、大量のファイルがある場合は体感的には加速度的に遅延がひどくなってしまいます。</p> <p>一時的な試験であれば、ファイル永続化を捨てるという選択肢を取ることができると思います。</p> <p>そこで課題となるのは、ファイルをどうやってコンテナの中に持ち込むか。</p> <p>そのための一つの方法として、 SFTP を採ることにしました。通常のサーバと同様に、 SFTP で接続してファイルをアップロードする、と。</p> <p>であれば、 SSHログイン できなければ話が成立しないので、 SSHログイン できるようにしてみたいと思います。</p> <h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2> <ul> <li>ベース: <a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/docker_compose_ambergrease">arm-band/docker_compose_ambergrease</a></li> </ul> <p>例によって Ambergrease をベースに使います。</p> <h3 id=".env"><a href="#.env">.env</a></h3> <pre><code class="env"># 略 WEB_HOST_PORTSSH=2222 WEB_CONTAINER_PORTSSH=22 WEB_SSH_USER=root WEB_SSH_PASSWORD=Password-1234 # 略 </code></pre> <p>今回はWebサーバのコンテナに SSHログイン したいので、必要なパラメータを追加します。</p> <p>管理者権限ユーザもハードコーディングはしたくないので一緒に変数にしておきます。ただ、 Docker で一時的な試験環境なので SSH はパスワード認証方式で良いかな、と。</p> <h3 id="docker-compose.yml"><a href="#docker-compose.yml">docker-compose.yml</a></h3> <pre><code class="yml"> web: build: context: ./apache/docker dockerfile: Dockerfile args: # 略 WEB_HOST_PORTSSH: $WEB_HOST_PORTSSH WEB_CONTAINER_PORTSSH: $WEB_CONTAINER_PORTSSH WEB_SSH_USER: $WEB_SSH_USER WEB_SSH_PASSWORD: $WEB_SSH_PASSWORD # 略 volumes: # 略 # apache virtual host # - ./apache/www:/var/www/$WEB_ROOT_DIRECTORY/web # 略 ports: # 略 - "$WEB_HOST_PORTSSH:$WEB_CONTAINER_PORTSSH" entrypoint: bash -c "bash /workspace/entrypoint_web.sh $WEB_ROOT_DIRECTORY $WEB_DOMAIN $WEB_HOST_PORTNUM $WEB_CONTAINER_PORTNUM $WEB_HOST_PORTSSL $WEB_CONTAINER_PORTSSL $WP_CLI $WEB_SSH_USER $WEB_SSH_PASSWORD && /bin/bash" # 略 </code></pre> <p>主に変更した部分のみ掲載。</p> <ul> <li><code>args</code>: <code>.env</code> で追加したホスト・コンテナ双方のポート番号を引数に追加</li> <li><code>volumes</code>: 今回の本題。ファイル数が多いと激重になってしまうので仮想ホストのファイル永続化を切っています</li> <li><code>ports</code>: <code>.env</code> で追加したホスト・コンテナ双方のポート番号を紐付け</li> <li><code>entrypoint</code>: エントリポイントとして実行するシェルスクリプトに渡す引数に <code>.env</code> で追加した <code>$WEB_SSH_USER</code>, <code>$WEB_SSH_PASSWORD</code> (SSHログインユーザ名・パスワード)を追加</li> </ul> <h3 id="Dockerfile"><a href="#Dockerfile">Dockerfile</a></h3> <pre><code class="dockerfile"># 略 # yum install RUN yum -y update && yum -y install \ # 略 # network ss (instaed of netstat) iproute \ # SSH openssh-server # 略 # SSH RUN mkdir /var/run/sshd </code></pre> <p>追加した項目は <code>openssh-server</code> のインストールと、ディレクトリ <code>/var/run/sshd</code> の作成のみ。それ以外の処理はエントリポイント側に投げました。</p> <h3 id="entrypoint_web.sh"><a href="#entrypoint_web.sh">entrypoint_web.sh</a></h3> <pre><code class="sh"># 略 # SSH sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config echo "${8}:${9}" | chpasswd ssh-keygen -t rsa -N "" -f /etc/ssh/ssh_host_rsa_key /usr/sbin/sshd -D & </code></pre> <p>先程述べた通り、 SSHサーバ についての主な処理はこちらに追加しました。</p> <ol> <li>管理者権限のログインを有効化し</li> <li>パスワードを上述の Docker Compose から引数で渡された <code>.env</code> の値に書き換え</li> <li>使用しないものの存在しないとエラーになるので秘密鍵を生成</li> <li>最後にフォアグラウンドで SSHサーバ を起動</li> </ol> <p><a href="https://crieit.now.sh/upload_images/cd8f856540941fe0320d9bb4443a1b6561b0d2f9345c0.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cd8f856540941fe0320d9bb4443a1b6561b0d2f9345c0.jpg?mw=700" alt="TeraTerm で SSH ログイン" /></a></p> <p><a href="https://crieit.now.sh/upload_images/9cd07317d7e8c28ade7e61b9c5fa91ed61b0d308ce42f.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9cd07317d7e8c28ade7e61b9c5fa91ed61b0d308ce42f.jpg?mw=700" alt="TeraTerm で SSH ログイン" /></a></p> <p><a href="https://crieit.now.sh/upload_images/fe8fed10666c348a7e780afb22263ab161b0d324ef9d5.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fe8fed10666c348a7e780afb22263ab161b0d324ef9d5.jpg?mw=700" alt="TeraTerm で SSH ログイン" /></a></p> <p>これで SSHサーバ が起動し、 <code>.env</code> でアクセスできるようになりました。</p> <p>なお、ポート番号は <code>.env</code> のホスト用のポートなので接続する際は注意。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://nxmnpg.lemoda.net/ja/8/sshd">sshd(8) manページ</a>: <code>-D</code> について</li> <li><a target="_blank" rel="nofollow noopener" href="https://pocketcode.net/docker-centos7-ssh-connect">Dockerで構築したCentOS7にSSH接続する | ポケットコード</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://genchan.net/it/virtualization/docker/8547/">【Docker】CentOS7,8をコンテナ上で動作とSSHアクセスまで | インフラエンジニアの技術LOG</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17717 2021-10-20T03:32:37+09:00 2022-08-15T02:03:36+09:00 https://crieit.net/posts/OCI-AWS OCIやAWS上のサーバの環境構築 <h1 id="1.公開鍵認証方式でssh接続"><a href="#1%EF%BC%8E%E5%85%AC%E9%96%8B%E9%8D%B5%E8%AA%8D%E8%A8%BC%E6%96%B9%E5%BC%8F%E3%81%A7ssh%E6%8E%A5%E7%B6%9A">1.公開鍵認証方式でssh接続</a></h1> <h2 id="1-1.キーの作成(おまけ)"><a href="#1-1%EF%BC%8E%E3%82%AD%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90%28%E3%81%8A%E3%81%BE%E3%81%91%29">1-1.キーの作成(おまけ)</a></h2> <p>Windowsのコマンドプロンプトで,</p> <pre><code>>ssh-keygen -b 4096 </code></pre> <p>(4096は任意鍵長)と打つと,<code>~/.ssh</code>に公開鍵と秘密鍵が作成される.例えばユーザー名がTanakaさんなら.<code>C:\Users\Tanaka\.ssh</code>に作成される.<br /> 秘密鍵のファイル名が<code>id_rsa</code>で,公開鍵が<code>id_rsa.pub</code>となる.</p> <p>以降の話ではこの節はあまり関係ない.</p> <h2 id="1-2.OCIでインスタンス作成"><a href="#1-2%EF%BC%8EOCI%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E4%BD%9C%E6%88%90">1-2.OCIでインスタンス作成</a></h2> <p>sshキーにスポットをあてて話を進める.<br /> <a href="https://crieit.now.sh/upload_images/01951106d2320a385b15633467219304616f061fd5cf3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01951106d2320a385b15633467219304616f061fd5cf3.png?mw=700" alt="image.png" /></a></p> <h3 id="1-2-1.キーペアを持っていない場合"><a href="#1-2-1%EF%BC%8E%E3%82%AD%E3%83%BC%E3%83%9A%E3%82%A2%E3%82%92%E6%8C%81%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88">1-2-1.キーペアを持っていない場合</a></h3> <p>[ SSHキーの追加 ]欄で,[キー・ペアを自動で生成 ]を選択し,<br /> [公開キーの保存]→[秘密キーの保存]をクリックすることでキーペア取得できる.<br /> この2つのファイルは大切に保管しましょう.(今後も使いまわせるので)</p> <p>保存された2つのファイルは,<br /> 公開鍵が<code>~.key.pub</code><br /> 秘密鍵が<code>~.key</code><br /> となっている.</p> <p>この2つのファイルはどこか好きなディレクトリに格納しとこう.<br /> 例:<code>C:\Users\Tanaka\Documents\Oracle</code></p> <p>インスタンスを作成.</p> <h3 id="1-2-2.キーペアを持っている場合"><a href="#1-2-2%EF%BC%8E%E3%82%AD%E3%83%BC%E3%83%9A%E3%82%A2%E3%82%92%E6%8C%81%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88">1-2-2.キーペアを持っている場合</a></h3> <p>OCIでインスタンスを作成する際,[sshキーの追加]欄がある.<br /> ここで,[公開キー・ファイル(.pub)のアップロード]を選択し,<br /> 自身の公開鍵のファイル(~.key.pub)をドラッグ&ドロップでアップロード.<br /> インスタンスを作成.</p> <h2 id="1-3.ssh接続"><a href="#1-3%EF%BC%8Essh%E6%8E%A5%E7%B6%9A">1-3.ssh接続</a></h2> <p>sshクライアントを起動してssh接続を試みる.</p> <h3 id="1-3-1.TeraTermの場合"><a href="#1-3-1%EF%BC%8ETeraTerm%E3%81%AE%E5%A0%B4%E5%90%88">1-3-1.TeraTermの場合</a></h3> <p>TeraTermを起動させたら[ ホスト(T) ]にIPアドレスを書いて,<br /> その下の[ TCPポート ]欄に「22」と書く※1.<br /> [ ok ]ボタンを押す.</p> <p>[ ユーザ名 ]に指定されたユーザ名を記入.<br /> OCIのCentOSの初期ユーザ名は「opc」※2.</p> <p>[ 認証方式 ]で,[ RSA/DSA/ECDSA/ED25119鍵を使う]を選択し,<br /> 1-1節で作成した秘密鍵のパスを指定.<br /> 例:</p> <pre><code>C:\Users\Tanaka\Documents\Oracle\~.key </code></pre> <p>これで接続できる.</p> <p>※1:sshのデフォルトのport番号が22.これは後で利用できるport番号内で任意番号に変更可能<br /> ※2:AWSのRHEL8の場合は「ec2-user」</p> <h3 id="1-3-2.PowerShellの場合"><a href="#1-3-2%EF%BC%8EPowerShell%E3%81%AE%E5%A0%B4%E5%90%88">1-3-2.PowerShellの場合</a></h3> <p>これだけ.</p> <pre><code>> ssh -i [秘密鍵のパス] [ユーザ名]@[IPアドレス] </code></pre> <p>以上。</p> <h1 id="2. 環境設定"><a href="#%EF%BC%92.+%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A">2. 環境設定</a></h1> <h2 id="2-1.パスワード設定"><a href="#2-1%EF%BC%8E%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A">2-1.パスワード設定</a></h2> <p>ログインできたら,rootユーザとログインユーザ(今回であればopc)のPassを任意に設定しとく.<br /> まずはroot</p> <pre><code>$sudo passwd root (パスワード聞かれるので適当に打つ) (切り替わるか確かめる) $ su - </code></pre> <p>次は別のユーザ</p> <pre><code>#passwd opc </code></pre> <h2 id="2-2.ssh接続のconfファイル書き換え"><a href="#2-2%EF%BC%8Essh%E6%8E%A5%E7%B6%9A%E3%81%AEconf%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88">2-2.ssh接続のconfファイル書き換え</a></h2> <p>セキュリティの観点から,ssh接続のconfigファイルを書き換える.</p> <pre><code>$ sudo vi /etc/ssh/sshd_config </code></pre> <p>とやるといろいろ書き換えられる.<br /> 英語読めば何の設定なのか想像つくと思うのでてきとーにやっとく.</p> <pre><code>Port 11326 (←port番号を22から変更) PermitRootLogin no (←Rootユーザでログインできないようにする) PubkeyAuthentication yes (←公開鍵認証方式) PasswordAuthentication no (←パスワード認証を無効化) などなど </code></pre> <p>これではまだ反映されないので,reloadしてメモリの設定を読み込ませる.<br /> (restartじゃないよ)</p> <pre><code>$ sudo systemctl reload sshd.service </code></pre> <h2 id="2-3.タイムゾーンを変更"><a href="#2-3%EF%BC%8E%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3%E3%82%92%E5%A4%89%E6%9B%B4">2-3.タイムゾーンを変更</a></h2> <p>タイムゾーンを東京に変更しとく.</p> <pre><code>$ sudo timedatectl set-timezone Asia/Tokyo </code></pre> <h2 id="2-4.変更確かめ"><a href="#2-4%EF%BC%8E%E5%A4%89%E6%9B%B4%E7%A2%BA%E3%81%8B%E3%82%81">2-4.変更確かめ</a></h2> <p>Windows端末のPowerShellでPortして疎通確認.</p> <pre><code>> Test-NetConnection [ IPアドレス ] -Port [ Port番号 ] </code></pre> <h1 id="3.yum"><a href="#3%EF%BC%8Eyum">3.yum</a></h1> <p>参考:https://access.redhat.com/ja/articles/3221791</p> <p>/etc/yum.confと/etc/yum.repos.dの二つの領域に分かれる。<br /> ※rhel8からはyumは廃止されdnfに置き換わっている。使い方はほぼ同じ。<br /> 実際、/etc/をみてみると、</p> <pre><code>[root@publicpc1 etc]# ll|grep yum drwxr-xr-x. 2 root root 57 Mar 24 12:32 yum lrwxrwxrwx. 1 root root 12 Nov 12 00:18 yum.conf -> dnf/dnf.conf drwxr-xr-x. 2 root root 217 Mar 24 12:39 yum.repos.d [root@publicpc1 yum]# pwd /etc/yum [root@publicpc1 yum]# ll total 0 lrwxrwxrwx. 1 root root 14 Nov 12 00:18 pluginconf.d -> ../dnf/plugins lrwxrwxrwx. 1 root root 18 Nov 12 00:18 protected.d -> ../dnf/protected.d lrwxrwxrwx. 1 root root 11 Nov 12 00:18 vars -> ../dnf/vars </code></pre> <p>となっている。</p> <h2 id="3-1. yum.conf(dnf.conf)"><a href="#3-1.+yum.conf%28dnf.conf%29">3-1. yum.conf(dnf.conf)</a></h2> <pre><code>[root@publicpc1 etc]# cat yum.conf [main] gpgcheck=1 installonly_limit=3 clean_requirements_on_remove=True best=True skip_if_unavailable=False </code></pre> <p>[main]はセクション名で、ここに記載されているのはyumのグローバルな設定。</p> <pre><code>gpgcheck </code></pre> <p>は署名チェック。1が有効で、0が無効。</p> <h2 id="3-2. yum.repos.d"><a href="#3-2.+yum.repos.d">3-2. yum.repos.d</a></h2> <pre><code>[root@publicpc1 yum.repos.d]# ll total 32 -rw-r--r--. 1 root root 495 May 5 2021 ksplice-ol8.repo -rw-r--r--. 1 root root 759 Apr 13 2021 mysql-ol8.repo -rw-r--r--. 1 root root 253 Mar 20 2021 oci-included-ol8.repo -rw-r--r--. 1 root root 252 Mar 24 12:39 oracle-epel-ol8.repo -rw-r--r--. 1 root root 694 Mar 24 12:39 oraclelinux-developer-ol8.repo -rw-r--r--. 1 root root 2740 Mar 24 12:39 oracle-linux-ol8.repo -rw-r--r--. 1 root root 470 Mar 11 01:09 uek-ol8.repo -rw-r--r--. 1 root root 243 Mar 11 01:09 virt-ol8.repo </code></pre> <p>oracle-linux-ol8.repoの中身を見てみると、ダウンロードする際に参照するURLが記載されている。<br /> ここが間違っていると適切にインストールできなくなる。<br /> ただ、ここを編集することはなさそう。</p> <p>もし社内にあるレポジトリサーバを利用したい場合、対応は2つある。<br /> 1つは、 yum.repos.d配下に~.repoファイルを追加する。<br /> 2つ目は、<code>yum -y install ~</code>で追加する方法。</p> <p>1つ目の場合</p> <pre><code># vim /etc/ yum.repos.d/test.repo [test] name=test baseurl=http://xxx.xxx/xxx.xxx/xxx gpgcheck=0 </code></pre> <p>など。</p> <h1 id="4.踏み台サーバの準備"><a href="#4%EF%BC%8E%E8%B8%8F%E3%81%BF%E5%8F%B0%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E6%BA%96%E5%82%99">4.踏み台サーバの準備</a></h1> <h2 id="4-1.キーペアの準備"><a href="#4-1%EF%BC%8E%E3%82%AD%E3%83%BC%E3%83%9A%E3%82%A2%E3%81%AE%E6%BA%96%E5%82%99">4-1.キーペアの準備</a></h2> <h2 id="4-2.scpでファイル転送"><a href="#4-2%EF%BC%8Escp%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%BB%A2%E9%80%81">4-2.scpでファイル転送</a></h2> <h2 id="4-3.公開鍵認証の読み込みパス指定"><a href="#4-3%EF%BC%8E%E5%85%AC%E9%96%8B%E9%8D%B5%E8%AA%8D%E8%A8%BC%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%83%91%E3%82%B9%E6%8C%87%E5%AE%9A">4-3.公開鍵認証の読み込みパス指定</a></h2> <p><a href="https://crieit.net/posts/OCI-CentOS">https://crieit.net/posts/OCI-CentOS</a></p> <h1 id="5. Port ForwardingでRDP接続"><a href="#5.+Port+Forwarding%E3%81%A7RDP%E6%8E%A5%E7%B6%9A">5. Port ForwardingでRDP接続</a></h1> <h2 id="5.1 sshトンネリング"><a href="#5.1+ssh%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AA%E3%83%B3%E3%82%B0">5.1 sshトンネリング</a></h2> <h1 id="6.Pythonインストール"><a href="#6%EF%BC%8EPython%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">6.Pythonインストール</a></h1> <h1 id="7.OCI CLIの利用方法"><a href="#7%EF%BC%8EOCI+CLI%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95">7.OCI CLIの利用方法</a></h1> <p>公式ドキュメントを参考に進めていくとインストールできる。</p> <h2 id="7.1 Oracle Linux8でオンラインインストール"><a href="#7.1+Oracle+Linux8%E3%81%A7%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">7.1 Oracle Linux8でオンラインインストール</a></h2> <p>参考<br /> OCIのクイックインストール:https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/cliinstall.htm#InstallingCLI__linux_and_unix</p> <h3 id="7.1.1 dnfでインストール"><a href="#7.1.1+dnf%E3%81%A7%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">7.1.1 dnfでインストール</a></h3> <p>dnfを使用してCLIをインストール</p> <pre><code>$ sudo dnf -y install oraclelinux-developer-release-el8 We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for opc: Ksplice for Oracle Linux 8 (x86_64) 16 MB/s | 1.2 MB 00:00 MySQL 8.0 for Oracle Linux 8 (x86_64) 9.1 MB/s | 2.4 MB 00:00 MySQL 8.0 Tools Community for Oracle Linux 8 (x86_64) 5.2 MB/s | 308 kB 00:00 MySQL 8.0 Connectors Community for Oracle Linux 8 (x86_64) 214 kB/s | 23 kB 00:00 Oracle Software for OCI users on Oracle Linux 8 (x86_64) 38 MB/s | 46 MB 00:01 Oracle Linux 8 BaseOS Latest (x86_64) 62 MB/s | 49 MB 00:00 Oracle Linux 8 Application Stream (x86_64) 48 MB/s | 37 MB 00:00 Oracle Linux 8 Addons (x86_64) 21 MB/s | 4.9 MB 00:00 Latest Unbreakable Enterprise Kernel Release 6 for Oracle Linu 63 MB/s | 53 MB 00:00 Package oraclelinux-developer-release-el8-1.0-7.el8.x86_64 is already installed. Dependencies resolved. Nothing to do. Complete! </code></pre> <p>続いて、cliをインストール</p> <pre><code>$ sudo dnf install python36-oci-cli Last metadata expiration check: 0:00:34 ago on Sat 13 Aug 2022 03:23:12 PM GMT. Dependencies resolved. =============================================================================================== Package Arch Version Repository Size =============================================================================================== Installing: python36-oci-cli noarch 3.14.0-1.el8 ol8_oci_included 14 M Upgrading: python36-oci-sdk x86_64 2.78.0-1.el8 ol8_oci_included 23 M Installing dependencies: python3-arrow noarch 1.1.1-1.el8 ol8_oci_included 119 k python3-jmespath noarch 0.10.0-1.el8 ol8_oci_included 48 k python3-prompt-toolkit noarch 3.0.29-1.0.2.el8 ol8_oci_included 669 k python3-terminaltables noarch 3.1.0-1.0.1.el8 ol8_oci_included 31 k python3-typing-extensions noarch 3.7.4.2-1.el8 ol8_oci_included 47 k python3-wcwidth noarch 0.2.5-3.el8 ol8_oci_included 48 k Transaction Summary =============================================================================================== Install 7 Packages Upgrade 1 Package Total download size: 38 M Is this ok [y/N]: y Downloading Packages: (1/8): python3-jmespath-0.10.0-1.el8.noarch.rpm 520 kB/s | 48 kB 00:00 (2/8): python3-prompt-toolkit-3.0.29-1.0.2.el8.noarch.rpm 4.2 MB/s | 669 kB 00:00 (3/8): python3-arrow-1.1.1-1.el8.noarch.rpm 740 kB/s | 119 kB 00:00 (4/8): python3-terminaltables-3.1.0-1.0.1.el8.noarch.rpm 298 kB/s | 31 kB 00:00 (5/8): python3-typing-extensions-3.7.4.2-1.el8.noarch.rpm 739 kB/s | 47 kB 00:00 (6/8): python3-wcwidth-0.2.5-3.el8.noarch.rpm 711 kB/s | 48 kB 00:00 (7/8): python36-oci-cli-3.14.0-1.el8.noarch.rpm 46 MB/s | 14 MB 00:00 (8/8): python36-oci-sdk-2.78.0-1.el8.x86_64.rpm 37 MB/s | 23 MB 00:00 ----------------------------------------------------------------------------------------------- Total 45 MB/s | 38 MB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Upgrading : python36-oci-sdk-2.78.0-1.el8.x86_64 1/9 Installing : python3-wcwidth-0.2.5-3.el8.noarch 2/9 Installing : python3-prompt-toolkit-3.0.29-1.0.2.el8.noarch 3/9 Installing : python3-typing-extensions-3.7.4.2-1.el8.noarch 4/9 Installing : python3-arrow-1.1.1-1.el8.noarch 5/9 Installing : python3-terminaltables-3.1.0-1.0.1.el8.noarch 6/9 Installing : python3-jmespath-0.10.0-1.el8.noarch 7/9 Installing : python36-oci-cli-3.14.0-1.el8.noarch 8/9 Cleanup : python36-oci-sdk-2.75.1-1.el8.x86_64 9/9 Running scriptlet: python36-oci-sdk-2.75.1-1.el8.x86_64 9/9 Verifying : python3-arrow-1.1.1-1.el8.noarch 1/9 Verifying : python3-jmespath-0.10.0-1.el8.noarch 2/9 Verifying : python3-prompt-toolkit-3.0.29-1.0.2.el8.noarch 3/9 Verifying : python3-terminaltables-3.1.0-1.0.1.el8.noarch 4/9 Verifying : python3-typing-extensions-3.7.4.2-1.el8.noarch 5/9 Verifying : python3-wcwidth-0.2.5-3.el8.noarch 6/9 Verifying : python36-oci-cli-3.14.0-1.el8.noarch 7/9 Verifying : python36-oci-sdk-2.78.0-1.el8.x86_64 8/9 Verifying : python36-oci-sdk-2.75.1-1.el8.x86_64 9/9 Upgraded: python36-oci-sdk-2.78.0-1.el8.x86_64 Installed: python3-arrow-1.1.1-1.el8.noarch python3-jmespath-0.10.0-1.el8.noarch python3-prompt-toolkit-3.0.29-1.0.2.el8.noarch python3-terminaltables-3.1.0-1.0.1.el8.noarch python3-typing-extensions-3.7.4.2-1.el8.noarch python3-wcwidth-0.2.5-3.el8.noarch python36-oci-cli-3.14.0-1.el8.noarch Complete! </code></pre> <p>インストール完了したらバージョン確認。</p> <pre><code>$ oci --version 3.14.0 </code></pre> <h3 id="7.1.2 構成ファイルの設定"><a href="#7.1.2+%E6%A7%8B%E6%88%90%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A">7.1.2 構成ファイルの設定</a></h3> <pre><code>$ oci setup config This command provides a walkthrough of creating a valid CLI config file. The following links explain where to find the information required by this script: User API Signing Key, OCID and Tenancy OCID: https://docs.cloud.oracle.com/Content/API/Concepts/apisigningkey.htm#Other Region: https://docs.cloud.oracle.com/Content/General/Concepts/regions.htm General config documentation: https://docs.cloud.oracle.com/Content/API/Concepts/sdkconfig.htm Enter a location for your config [/home/opc/.oci/config]:特に指定しなくてok Enter a user OCID: OCIコンソールよりユーザのOCIDをコピペ Enter a tenancy OCID: OCIコンソールよりコピペ Enter a region by index or name(e.g. 1: af-johannesburg-1, 2: ap-chiyoda-1, 3: ap-chuncheon-1, 4: ap-dcc-canberra-1, 5: ap-hyderabad-1, 6: ap-ibaraki-1, 7: ap-melbourne-1, 8: ap-mumbai-1, 9: ap-osaka-1, 10: ap-seoul-1, 11: ap-singapore-1, 12: ap-sydney-1, 13: ap-tokyo-1, 14: ca-montreal-1, 15: ca-toronto-1, 16: eu-amsterdam-1, 17: eu-frankfurt-1, 18: eu-marseille-1, 19: eu-milan-1, 20: eu-paris-1, 21: eu-stockholm-1, 22: eu-zurich-1, 23: il-jerusalem-1, 24: me-abudhabi-1, 25: me-dcc-muscat-1, 26: me-dubai-1, 27: me-jeddah-1, 28: mx-queretaro-1, 29: sa-santiago-1, 30: sa-saopaulo-1, 31: sa-vinhedo-1, 32: uk-cardiff-1, 33: uk-gov-cardiff-1, 34: uk-gov-london-1, 35: uk-london-1, 36: us-ashburn-1, 37: us-gov-ashburn-1, 38: us-gov-chicago-1, 39: us-gov-phoenix-1, 40: us-langley-1, 41: us-luke-1, 42: us-phoenix-1, 43: us-sanjose-1): 13(OCIコンソールをブラウザで開いてURLを見るとわかる Do you want to generate a new API Signing RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n]: Y Enter a directory for your keys to be created [/home/opc/.oci]: Enter a name for your key [oci_api_key]: Public key written to: /home/opc/.oci/oci_api_key_public.pem Enter a passphrase for your private key (empty for no passphrase): Private key written to: /home/opc/.oci/oci_api_key.pem Fingerprint: ~なんか記載されている~ Config written to /home/opc/.oci/config </code></pre> <p>完了すると、~/.oci配下にoci_api_key_public.pemが作成されているはず。このキーをOCIコンソールで<br /> アイデンティティ>ユーザー>ユーザーの詳細<br /> に行くと、画面サブに「APIキー」があるのでクリックし、oci_api_key_public.pemの中身を張り付ける。</p> <p>試しに実行してみる。</p> <pre><code>$ oci compute instance list --all Usage: oci compute instance list [OPTIONS] Error: Missing option(s) --compartment-id. </code></pre> <p>コンパートメントIDをオプションで追記しろとのこと。</p> <pre><code>$ oci compute instance list --compartment-id <OCID貼り付け> いっぱい表示された </code></pre> <p>ただ、毎回コンパートメントIDを打ち込むのは面倒なので、oci_cli_rcファイルに書き込むことでコマンド入力時にオプション付ける必要がないようにする。</p> <pre><code>$ vi ~/.oci/oci_cli_rc [DEFAULT] compartment-id=<コンパートメントID> </code></pre> <h3 id="7.1.3 プライベートサブネットからOCI CLIを実行する方法"><a href="#7.1.3+%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E3%81%8B%E3%82%89OCI+CLI%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95">7.1.3 プライベートサブネットからOCI CLIを実行する方法</a></h3> <p>OCI CLIでコマンドを実行するとAPIエンドポイントと通信を行う。そのため、プライベートサブネットからAPIを発行してエンドポイントへ到達させるにはいくつかの設定が必要になる。方法は以下3つ。<br /> ①NATゲートウェイを利用してインターネットに出ていく。②サービスゲートウェイを使用して、OCI環境内に閉じた通信を行う。③プロキシを使用してインターネットへ出ていくルートを作る。</p> <p>なずは何も設定しない状態でプライベートサブネットからコマンドを実行してみる。その際、APIの実行履歴を出力させるためにデバックオプション--debug(または-d)をつけて実行する。</p> <pre><code>$ oci compute instance list --all -d ~省略~ DEBUG:oci.base_client.140243454499864:Endpoint: https://iaas.ap-tokyo-1.oraclecloud.com/20160918 INFO:oci.base_client.140243454499864: 2022-08-14 15:05:12.072064: Request: GET https://iaas.ap-tokyo-1.oraclecloud.com/20160918/instances INFO:oci.base_client.140243454499864: 2022-08-14 15:05:23.487363: Request: GET https://iaas.ap-tokyo-1.oraclecloud.com/20160918/instances ~つづく~ </code></pre> <p>となり、エンドポイントへの接続を所定の回数試行して失敗すると、以下のようなエラーが返ってくる。</p> <pre><code>oci.exceptions.ConnectTimeout: (MaxRetryError("OCIConnectionPool(host='iaas.ap-tokyo-1.oraclecloud.com', port=443): Max retries exceeded with url: /20160918/instances?compartmentId=ocid1.compartment.oc1..aaaaaaaantybfae5pn7h77jmgcwgzg2hm27gv6whsiwhmo54ycefc3sxyiwa (Caused by ConnectTimeoutError(<oci.base_client.OCIConnection object at 0x7f8cf8e2f2b0>, 'Connection to iaas.ap-tokyo-1.oraclecloud.com timed out. (connect timeout=10.0)'))",), 'Request Endpoint: GET https://iaas.ap-tokyo-1.oraclecloud.com/20160918/instances See https://docs.oracle.com/en-us/iaas/Content/API/Concepts/sdk_troubleshooting.htm for help troubleshooting this error, or contact support and provide this full error message.') </code></pre> <p>実際、エンドポイント(iaas.ap-tokyo-1.oraclecloud.com)にpingを打っても返ってこない。</p> <h4 id="7.1.3.1 NATゲートウェイの利用"><a href="#7.1.3.1+NAT%E3%82%B2%E3%83%BC%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A4%E3%81%AE%E5%88%A9%E7%94%A8">7.1.3.1 NATゲートウェイの利用</a></h4> <p>NATゲートウェイを作成して、プライベートサブネットのルート表に追加させる。</p> <p>まずは、<br /> ネットワーキング>仮想クラウド・ネットワーク>仮想クラウド・ネットワークの詳細>NATゲートウェイ<br /> から「NATゲートウェイの作成」を行う。作成したNATゲートウェイをルート表のルート・ルールに追加する。<br /> <a href="https://crieit.now.sh/upload_images/01951106d2320a385b1563346721930462f9118f303fa.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01951106d2320a385b1563346721930462f9118f303fa.png?mw=700" alt="image.png" /></a></p> <p>追加できたら、まずはエンドポイント(iaas.ap-tokyo-1.oraclecloud.com)にpingを打つ。きっと返ってくるはずだ。<br /> エンドポイントへの疎通が確認できたら、OCIコマンドを実行してみよう。</p> <pre><code>$ oci compute instance list --all -d </code></pre> <p>インスタンス情報が出力されたと思う。</p> <h4 id="7.1.3.2 サービスゲートウェイの利用"><a href="#7.1.3.2+%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%B2%E3%83%BC%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A4%E3%81%AE%E5%88%A9%E7%94%A8">7.1.3.2 サービスゲートウェイの利用</a></h4> <p>社内ルールで、むやみにインターネットに出ていける設定をしてはいけない場合もあるはず。そういった場合には、OCIのVCN内に閉じた環境でエンドポイントへの通信できるサービスゲートウェイを利用するといい。<br /> ネットワーキング>仮想クラウド・ネットワーク>仮想クラウド・ネットワークの詳細>サービス・ゲートウェイ<br /> からサービスゲートウェイを作成する。<br /> <a href="https://crieit.now.sh/upload_images/01951106d2320a385b1563346721930462f914cd84d54.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01951106d2320a385b1563346721930462f914cd84d54.png?mw=700" alt="image.png" /></a></p> <p>作成したら、さきほどと同じようにプライベートサブネットのルート表のルート・ルールに追加する。<br /> <a href="https://crieit.now.sh/upload_images/01951106d2320a385b1563346721930462f9151e5f6a7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/01951106d2320a385b1563346721930462f9151e5f6a7.png?mw=700" alt="image.png" /></a></p> <p>追加できたら、まずはエンドポイント(iaas.ap-tokyo-1.oraclecloud.com)にpingを打つ。きっと返ってくるはずだ。<br /> エンドポイントへの疎通が確認できたら、OCIコマンドを実行してみよう。</p> <pre><code>$ oci compute instance list --all -d </code></pre> <p>インスタンス情報が出力されたと思う。</p> <h4 id="7.1.3.3 プロキシを使用してインターネット経由のルーティング"><a href="#7.1.3.3+%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E7%B5%8C%E7%94%B1%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">7.1.3.3 プロキシを使用してインターネット経由のルーティング</a></h4> <p>https通信を行う際にプロキシ経由するように設定をするだけでよい。</p> <pre><code>$ export HTTPS_PROXY=http://10.1.1.45:3128 </code></pre> <p>設定した後はOCI CLIコマンドを実行すると成功するはずだ。</p> <h3 id="7.1.4 インスタンスプリンシパルの設定"><a href="#7.1.4+%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%91%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A">7.1.4 インスタンスプリンシパルの設定</a></h3> <h2 id="7.2 インスタンスプリンシパルの設定"><a href="#7.2+%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B7%E3%83%91%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A">7.2 インスタンスプリンシパルの設定</a></h2> <p>さきほどまではAPIを用いてユーザ認証を実行してきた。それとは別に、インスタンスに対して実行権限を付与させる方法がある。それがインスタンスプリンシパル。プリンシパルは操作の実行主体を指す。</p> <h3 id="7.2.1 別ユーザで実行する"><a href="#7.2.1+%E5%88%A5%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">7.2.1 別ユーザで実行する</a></h3> <h2 id="7.3 仮想環境の作成"><a href="#7.3+%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%81%AE%E4%BD%9C%E6%88%90">7.3 仮想環境の作成</a></h2> <p>システム全体にCLIをインストールするのは非推奨。</p> <h3 id="7.3.1 仮想環境を構成するディレクトリ作成"><a href="#7.3.1+%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E6%88%90%E3%81%99%E3%82%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E4%BD%9C%E6%88%90">7.3.1 仮想環境を構成するディレクトリ作成</a></h3> <p>仮想環境を構成するディレクトリを作成する。<br /> このディレクトリは、仮想環境をアクティブ化する際に打つパスになるので<br /> よく考えてディレクトリ名はつけるように。</p> <pre><code>[root@publicpc oci]# pwd /opt/oci </code></pre> <h3 id="7.3.2 仮想環境作成"><a href="#7.3.2+%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E4%BD%9C%E6%88%90">7.3.2 仮想環境作成</a></h3> <p>まずはPythonのバージョンを確認する。</p> <pre><code>[opc@publicpc ~]$ python --version Python 3.6.8 </code></pre> <p>バージョンに応じた仮想環境作成のコマンドを打つ。</p> <pre><code>python<Pythonのバージョン> -m venv <仮想環境名> [root@publicpc oci]# python3.6 -m venv venv1 </code></pre> <p>/opt/oci配下にvenv1という仮想環境が作成される。</p> <h3 id="7.3.3 仮想環境をアクティブ化"><a href="#7.3.3+%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%82%92%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E5%8C%96">7.3.3 仮想環境をアクティブ化</a></h3> <p>OCI CLIのコマンドを打つときは、仮想環境をアクティブ化したうえで実行させる。<br /> アクティブ化させるコマンドは以下の通り。</p> <pre><code>[root@publicpc oci]# source /opt/oci/venv1/bin/activate (venv1) [root@publicpc oci]# </code></pre> <p>ちなみに、非アクティブ化は以下でできる。</p> <pre><code>(venv1) [root@publicpc oci]# deactivate [root@publicpc oci]# </code></pre> <h2 id="7.4 OCI-CLIのオフラインインストール"><a href="#7.4+OCI-CLI%E3%81%AE%E3%82%AA%E3%83%95%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">7.4 OCI-CLIのオフラインインストール</a></h2> <p>会社の社内規則などによってLinuxサーバがインターネット接続できない場合、自分がWindows端末にインストールファイルをダウンロードし、<br /> そのファイルをLinuxサーバに配置して読み込ませることでCLIの実行環境を準備することができる。</p> <p>Github(https://github.com/oracle/oci-cli/releases)から、oci-cli.zipをローカルにダウンロード。<br /> oci-cli.zipを作Linuxサーバに配置し解凍する。</p> <h1 id="8.Ansibleのインストール"><a href="#8%EF%BC%8EAnsible%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">8.Ansibleのインストール</a></h1> <h1 id="9.BlockVolumeのパーティション切りとマウント"><a href="#9%EF%BC%8EBlockVolume%E3%81%AE%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%87%E3%82%8A%E3%81%A8%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88">9.BlockVolumeのパーティション切りとマウント</a></h1> <h1 id="10.コンテナ"><a href="#10%EF%BC%8E%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A">10.コンテナ</a></h1> kawai_mizugorou tag:crieit.net,2005:PublicArticle/17367 2021-06-07T20:47:39+09:00 2021-06-07T20:47:39+09:00 https://crieit.net/posts/Cisco リモートでルータなどのネットワーク機器を使用したい時に見るざっくりメモ(Cisco) <h1 id="初めに"><a href="#%E5%88%9D%E3%82%81%E3%81%AB">初めに</a></h1> <p>リモートでネットワーク機器に接続する場合以下の2種類の方法がある。<br /> 1.コンソール接続<br /> 2.ネットワークを介してアクセス</p> <p>1のコンソール接続とはCiscoデバイスにコンソールポートというポートがあり、そのポートからコンソールケーブルでPCと直接接続する方式</p> <p>2のネットワークを介してアクセスとは遠隔操作用のプロトコル<strong>telnet、ssh</strong>を利用してネットワークを通じて接続する方式<br /> ここでは後者である2のほうを解説していく</p> <h1 id="telnetとssh"><a href="#telnet%E3%81%A8ssh">telnetとssh</a></h1> <p>どちらもリモートアクセスでの遠隔操作用のプロトコル<br /> 大きな違いとしてtelnetは暗号化されていない、sshは暗号化通信であること</p> <h2 id="telnetをもうちょい詳しく"><a href="#telnet%E3%82%92%E3%82%82%E3%81%86%E3%81%A1%E3%82%87%E3%81%84%E8%A9%B3%E3%81%97%E3%81%8F">telnetをもうちょい詳しく</a></h2> <p>TCPポート番号23<br /> リモート接続にはVTY(Virtual Teletype)回線を使用<br /> VTY回線は仮想的な回線で、利用するためには認証の設定が必要。<br /> (機器によって5~16回線用意されている)さらに前提として、enableパスワード設定が必要。</p> <h2 id="sshをもうちょい詳しく"><a href="#ssh%E3%82%92%E3%82%82%E3%81%86%E3%81%A1%E3%82%87%E3%81%84%E8%A9%B3%E3%81%97%E3%81%8F">sshをもうちょい詳しく</a></h2> <p>TCPポート番号22<br /> sshを利用した通信は、telnet同様VTY回線を使用するが、暗号化されてるので、telnetを利用するよりセキュア。今回のメモで認証にはパスワード認証を利用し、その際には機器に設定したユーザーアカウントで認証を行う。</p> <h1 id="初期設定"><a href="#%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A">初期設定</a></h1> <h3 id="enable(特権モード)のパスワード設定"><a href="#enable%EF%BC%88%E7%89%B9%E6%A8%A9%E3%83%A2%E3%83%BC%E3%83%89%EF%BC%89%E3%81%AE%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A">enable(特権モード)のパスワード設定</a></h3> <h6 id="セキュリティ的にまずこれはやらないとダメ"><a href="#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E7%9A%84%E3%81%AB%E3%81%BE%E3%81%9A%E3%81%93%E3%82%8C%E3%81%AF%E3%82%84%E3%82%89%E3%81%AA%E3%81%84%E3%81%A8%E3%83%80%E3%83%A1">セキュリティ的にまずこれはやらないとダメ</a></h6> <p>暗号化無し版</p> <pre><code>Router(config)#enable password パスワード </code></pre> <p>暗号化有り版</p> <pre><code>Router(config)#enable secret パスワード </code></pre> <h1 id="telnetの設定(コマンド集)"><a href="#telnet%E3%81%AE%E8%A8%AD%E5%AE%9A%EF%BC%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E9%9B%86%EF%BC%89">telnetの設定(コマンド集)</a></h1> <p>①ラインコンフィギュレーションモードへ移動</p> <pre><code>Router(config)#line vty 開始ライン番号 終了ライン番号 </code></pre> <p>②ログインパスワードの設定</p> <pre><code>Router(config-line)#password パスワード Router(config-line)#login </code></pre> <p>※ホスト名も設定しておかないと、どの機器にリモート接続しているのかわからなくなってしまうのでできればhostnameコマンドで名前も付けたほうがいい</p> <p>③リモート接続する(ルータから他のネットワーク機器にリモートアクセスする場合)</p> <pre><code>Router#telnet 対象機器のIPアドレス/ホスト名 </code></pre> <p>④現在のTelnetログイン状況の確認<br /> (操作しているデバイスに「*」がついて表示)</p> <pre><code>Router#show users </code></pre> <h1 id="sshの設定(コマンド集)"><a href="#ssh%E3%81%AE%E8%A8%AD%E5%AE%9A%EF%BC%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E9%9B%86%EF%BC%89">sshの設定(コマンド集)</a></h1> <h2 id="前提として必要な設定"><a href="#%E5%89%8D%E6%8F%90%E3%81%A8%E3%81%97%E3%81%A6%E5%BF%85%E8%A6%81%E3%81%AA%E8%A8%AD%E5%AE%9A">前提として必要な設定</a></h2> <p>①ユーザアカウントの設定(enableパスワードとは違う)</p> <pre><code>Router(config)#username ユーザ名 password パスワード </code></pre> <p>②ホスト名の設定</p> <pre><code>Router(config)#hostname ホスト名 </code></pre> <p>③ドメイン名の設定</p> <pre><code>Router(config)#ip domain-name ドメイン名 </code></pre> <h2 id="sshに関する設定"><a href="#ssh%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A">sshに関する設定</a></h2> <p>①RSA暗号鍵の設定</p> <pre><code>RT1(config)#crypto key generate rsa ↓ 暗号鍵のbit数を問われるのでbit数を打ち込む(デフォルトで512だが2048以上が普通) </code></pre> <p>②ローカル認証設定(設定したユーザアカウントで認証)</p> <pre><code>RT1(config)#line vty 開始ライン番号 終了ライン番号 RT1(config-line)#login local </code></pre> <p>③VTY回線での接続許可設定</p> <pre><code>RT1(config-line)#transport input all/telnet/ssh/none ※デフォルトでは「all」になっている ⇒ telnet、ssh、両方が許可されている </code></pre> <p>④リモート接続する(ルータから他のネットワーク機器にリモートアクセスする場合)</p> <pre><code>Router#ssh –l ユーザ名 対象機器のIPアドレス/ホスト名 </code></pre> <p>⑤sshのログイン状況確認コマンド</p> <pre><code>RT1#show ssh </code></pre> <h1 id="おまけ"><a href="#%E3%81%8A%E3%81%BE%E3%81%91">おまけ</a></h1> <h2 id="コンソール接続にもパスワード設定できる(コマンド集)"><a href="#%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E6%8E%A5%E7%B6%9A%E3%81%AB%E3%82%82%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%8D%E3%82%8B%EF%BC%88%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E9%9B%86%EF%BC%89">コンソール接続にもパスワード設定できる(コマンド集)</a></h2> <p>①ラインコンフィギュレーションモードへ移動</p> <pre><code>Router(config)#line console 0 </code></pre> <p>②ログインパスワードの設定</p> <pre><code>Router(config-line)#password パスワード Router(config-line)#login </code></pre> <h2 id="パスワードの暗号化設定"><a href="#%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E8%A8%AD%E5%AE%9A">パスワードの暗号化設定</a></h2> <p>enableパスワード以外のパスワードを暗号化する場合、専用のコマンドがないので、まとめてパスワードを暗号化するコマンドを利用(Type7を使用して暗号化)</p> <pre><code>RT1(config)#service password-encryption </code></pre> tobara tag:crieit.net,2005:PublicArticle/17055 2021-05-04T11:10:50+09:00 2021-05-04T11:10:50+09:00 https://crieit.net/posts/ssh-publickey-authentication-require-password-2-20210503 公開鍵認証でSSH接続しようとしたのにパスワードを求められた 2 <p><a target="_blank" rel="nofollow noopener" href="https://labor.ewigleere.net/2020/10/23/ssh_publickey_authentication_require_password/">以前も似たような現象に遭遇</a>しましたが、原因が少し異なっていたので書き留めておきます。</p> <h2 id="経緯・状況"><a href="#%E7%B5%8C%E7%B7%AF%E3%83%BB%E7%8A%B6%E6%B3%81">経緯・状況</a></h2> <p>前回の状況と同じ状況です。 Ansible でリモートサーバを操作しようとしましたが、公開鍵認証のはずなのにパスワードを求められてしまいました。</p> <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <pre><code class="bash"># ansible-playbook -i /workspace/ansible/targets/hosts /workspace/ansible/main.yml -u REMOTE_USER --private-key=&quot;/root/.ssh/PRIVATE_KEY&quot; -K BECOME password: PLAY [Settings vsftpd and httpd] ********************************************************************************** TASK [Gathering Facts] ********************************************************************************************The authenticity of host 'ssh.example.com (ssh.example.com)' can't be established. ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes fatal: [ssh.example.com]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Warning: Permanently added 'ssh.example.com' (ECDSA) to the list of known hosts.\r\[email protected]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true} PLAY RECAP ********************************************************************************************************ssh.example.com : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0 </code></pre> <p>プレイブックを実行しようとすると <code>Permission denied</code> で怒られました。</p> <pre><code class="bash"># ssh -i ~/.ssh/PRIVATE_KEY [email protected] [email protected]'s password: Permission denied, please try again. [email protected]'s password: Activate the web console with: systemctl enable --now cockpit.socket Last login: DDD MMM dd hh:ii:ss yyyy from LOCAL_HOST [REMOTE_USER@ssh ~]$ </code></pre> <p>SSH接続 では公開鍵認証のはずなのにパスワードを求められます。</p> <h2 id="対処"><a href="#%E5%AF%BE%E5%87%A6">対処</a></h2> <p><code>/var/log/secure</code> を確認すると、 <code>Authentication refused: bad ownership or modes for directory /home/REMOTE_USER/.ssh</code> のエラーメッセージが記録されていました。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://shoyan.hatenablog.com/entry/20111117/1321546001">sshの公開鍵認証でServer refused our keyが出る問題について - Simple, Slowly</a></li> </ul> <p>調べてみると、 <code>.ssh</code>ディレクトリ の権限が誤った設定になっているとこのエラーが起きるとのこと。</p> <p><code>.ssh/authorized_keys</code> は <code>600</code> にしていましたが、ディレクトリの方は見落としていました。確認したところ、 <code>775</code> でした。</p> <p>これを <code>chmod 755 /home/REMOTE_USER/.ssh</code> で修正。</p> <p>結果、公開鍵認証が成功するようになり、 Ansible のプレイブックも正常に動作するようになりました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="http://shoyan.hatenablog.com/entry/20111117/1321546001">sshの公開鍵認証でServer refused our keyが出る問題について - Simple, Slowly</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16604 2021-01-15T17:04:20+09:00 2021-01-15T17:04:20+09:00 https://crieit.net/posts/c97f776c64717b044e6d63cfbd64235c コマンド操作 基本! <h2 id="最低限覚えておくべきコマンド9こ!"><a href="#%E6%9C%80%E4%BD%8E%E9%99%90%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8F%E3%81%B9%E3%81%8D%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%EF%BC%99%E3%81%93%EF%BC%81">最低限覚えておくべきコマンド9こ!</a></h2> <p><strong>1. pwd<br /> 2. ls<br /> 3. mkdir<br /> 4. cd<br /> 5. touch<br /> 6. cp<br /> 7. mv<br /> 8. rm<br /> 9. less</strong></p> <hr /> <p>*Linuxのコマンドプロンプトは⼀般ユーザだと「$」で<br /> 管理権限を持つ root だと「#」という表⽰</p> <h3 id="① pwdコマンド"><a href="#%E2%91%A0+pwd%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">① pwdコマンド</a></h3> <p>CLIでコマンドを実⾏するときは、どこかのディレクトリを起点とする。<br /> これを「<strong>カレントディレクトリ</strong>」と呼び、pwdコマンドで確認できる。<br /> pwd … print work directoryの略</p> <h4 id="$pwd"><a href="#%24pwd">$pwd</a></h4> <p>CentOS7の場合ログイン直後は、ログインユーザのホームディレクトリ<br /> <strong>(/home/ユーザ名)</strong> がカレントディレクトリになる</p> <hr /> <h3 id="② lsコマンド(1)"><a href="#%E2%91%A1+ls%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%281%29">② lsコマンド(1)</a></h3> <p>カレントディレクトリにどんなディレクトリやファイルが存在するかを確認する  ls…list segmentsの略</p> <h4 id="$ ls (オプション) ※オプションの前に半⾓スペースが必要︕"><a href="#%24+ls+%28%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%29+%E2%80%BB%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%89%8D%E3%81%AB%E5%8D%8A%E2%BE%93%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E5%BF%85%E8%A6%81%EF%B8%95">$ ls (オプション) ※オプションの前に半⾓スペースが必要︕</a></h4> <p>オプションを⼊れると、隠しファイルや詳細情報を表⽰できる。<br /> 使⽤例は以下の通り。</p> <h4 id="$ ls -l (エルエス ハイフン エル。CentOSの場合ll(エル エル)でも同じ結果になります)"><a href="#%24+ls+-l+%28%E3%82%A8%E3%83%AB%E3%82%A8%E3%82%B9+%E3%83%8F%E3%82%A4%E3%83%95%E3%83%B3+%E3%82%A8%E3%83%AB%E3%80%82CentOS%E3%81%AE%E5%A0%B4%E5%90%88ll%28%E3%82%A8%E3%83%AB+%E3%82%A8%E3%83%AB%29%E3%81%A7%E3%82%82%E5%90%8C%E3%81%98%E7%B5%90%E6%9E%9C%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%29">$ ls -l (エルエス ハイフン エル。CentOSの場合ll(エル エル)でも同じ結果になります)</a></h4> <h4 id="$ ls -la (エルエス ハイフン エル エー)"><a href="#%24+ls+-la+%28%E3%82%A8%E3%83%AB%E3%82%A8%E3%82%B9+%E3%83%8F%E3%82%A4%E3%83%95%E3%83%B3+%E3%82%A8%E3%83%AB+%E3%82%A8%E3%83%BC%29">$ ls -la (エルエス ハイフン エル エー)</a></h4> <hr /> <h3 id="② lsコマンド(2)"><a href="#%E2%91%A1+ls%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%282%29">② lsコマンド(2)</a></h3> <p>ls の後ろにディレクトリを指定すると、指定したディレクトリ内のディレクトリやファイルを確認することもできる</p> <h4 id="$ ls [ディレクトリ名] ※lsの後ろに半⾓スペースが必要︕"><a href="#%24+ls+%5B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%90%8D%5D+%E2%80%BBls%E3%81%AE%E5%BE%8C%E3%82%8D%E3%81%AB%E5%8D%8A%E2%BE%93%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E5%BF%85%E8%A6%81%EF%B8%95">$ ls [ディレクトリ名] ※lsの後ろに半⾓スペースが必要︕</a></h4> <p>ls /(エルエス スラッシュ)を実⾏するとルートディレクトリの中のディレクトリ<br /> (第2階層)を⾒ることができる。</p> <hr /> <h3 id="③ mkdirコマンド"><a href="#%E2%91%A2+mkdir%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">③ mkdirコマンド</a></h3> <p>ディレクトリを作成する mkdir…make directoryの略</p> <h4 id="$ mkdir [作成したいディレクトリ名] ※mkdirの後ろに半⾓スペースが必要︕"><a href="#%24+mkdir+%5B%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%81%84%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%90%8D%5D+%E2%80%BBmkdir%E3%81%AE%E5%BE%8C%E3%82%8D%E3%81%AB%E5%8D%8A%E2%BE%93%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E5%BF%85%E8%A6%81%EF%B8%95">$ mkdir [作成したいディレクトリ名] ※mkdirの後ろに半⾓スペースが必要︕</a></h4> <p>コマンドを実⾏してもエラーでは無い限り、何もメッセージは出ない。<br /> 実⾏後、lsやllコマンドでディレクトリが作られたかどうかを確認しよ!</p> <hr /> <h3 id="④ cdコマンド(1)"><a href="#%E2%91%A3+cd%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%281%29">④ cdコマンド(1)</a></h3> <p>カレントディレクトリを移動する<br /> cd…change directoryの略</p> <h4 id="$ cd [移動先ディレクトリ名] ※cdの後ろに半⾓スペースが必要︕"><a href="#%24+cd+%5B%E7%A7%BB%E5%8B%95%E5%85%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%90%8D%5D+%E2%80%BBcd%E3%81%AE%E5%BE%8C%E3%82%8D%E3%81%AB%E5%8D%8A%E2%BE%93%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E5%BF%85%E8%A6%81%EF%B8%95">$ cd [移動先ディレクトリ名] ※cdの後ろに半⾓スペースが必要︕</a></h4> <p>コマンドを実⾏してもエラーでは無い限り、何もメッセージは出ない。<br /> 実⾏後、pwdコマンドでカレントディレクトリを確認しよ!</p> <hr /> <h3 id="④ cdコマンド(2)"><a href="#%E2%91%A3+cd%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%282%29">④ cdコマンド(2)</a></h3> <p><strong>「 .. (ドットドット)」</strong> を移動先ディレクトリへ指定すると、⼀階層上のディレクトリに移動することが可能。<br /> また、cd ../.. のように複数回使⽤すると、2つ上のディレクトリに移動できる</p> <hr /> <h3 id="⑤ touchコマンド"><a href="#%E2%91%A4+touch%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">⑤ touchコマンド</a></h3> <p>新規に<strong>空のファイル</strong>を作成する<br /> ほかにも、指定したファイルやディレクトリのタイムスタンプを変更することも可能</p> <h4 id="$ touch [作成したいファイル名] ※touchの後ろに半⾓スペースが必要!"><a href="#%24+touch+%5B%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%5D+%E2%80%BBtouch%E3%81%AE%E5%BE%8C%E3%82%8D%E3%81%AB%E5%8D%8A%E2%BE%93%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E5%BF%85%E8%A6%81%EF%BC%81">$ touch [作成したいファイル名] ※touchの後ろに半⾓スペースが必要!</a></h4> <hr /> <h3 id="⑥ cpコマンド(1)"><a href="#%E2%91%A5+cp%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%281%29">⑥ cpコマンド(1)</a></h3> <p>ファイルをコピーする cp…copyの略</p> <h4 id="$ cp [コピー元ファイル名] [コピー先ファイル名 or ディレクトリ]"><a href="#%24+cp+%5B%E3%82%B3%E3%83%94%E3%83%BC%E5%85%83%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%5D+%5B%E3%82%B3%E3%83%94%E3%83%BC%E5%85%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D+or+%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%5D">$ cp [コピー元ファイル名] [コピー先ファイル名 or ディレクトリ]</a></h4> <p>※上記コマンドのコピー元ディレクトリとコピー先ディレクトリの間には半⾓スペースが必要︕<br /> コマンドを実⾏してもエラーでは無い限り、何もメッセージは出ない。<br /> lsかllコマンドでコピーしたファイルが存在することを確認しよ!</p> <hr /> <h3 id="⑥ cpコマンド(2)"><a href="#%E2%91%A5+cp%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%282%29">⑥ cpコマンド(2)</a></h3> <p>cpコマンドは、<strong>r</strong> オプションを使うと<strong>ディレクトリもコピーできる。</strong></p> <h4 id="$ cp -r [コピー元ディレクトリ名] [コピー先ディレクトリ名]"><a href="#%24+cp+-r+%5B%E3%82%B3%E3%83%94%E3%83%BC%E5%85%83%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%90%8D%5D+%5B%E3%82%B3%E3%83%94%E3%83%BC%E5%85%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%90%8D%5D">$ cp -r [コピー元ディレクトリ名] [コピー先ディレクトリ名]</a></h4> <hr /> <h3 id="⑦ mvコマンド(1)"><a href="#%E2%91%A6+mv%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%281%29">⑦ mvコマンド(1)</a></h3> <p>ファイルやディレクトリを移動する。<br /> mv…moveの略</p> <h4 id="$ mv [対象ファイル or ディレクトリ名] [移動先のディレクトリ]"><a href="#%24+mv+%5B%E5%AF%BE%E8%B1%A1%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB+or+%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%90%8D%5D+%5B%E7%A7%BB%E5%8B%95%E5%85%88%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%5D">$ mv [対象ファイル or ディレクトリ名] [移動先のディレクトリ]</a></h4> <p>コマンドを実⾏してもエラーでは無い限り、何もメッセージは出ない。<br /> mv実施後に、lsかllコマンドで移動したことを確認しよ!</p> <hr /> <h3 id="⑦ mvコマンド(2)"><a href="#%E2%91%A6+mv%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%282%29">⑦ mvコマンド(2)</a></h3> <p><strong>mvコマンドはファイルやディレクトリ名の変更もできる。</strong></p> <h4 id="$ mv [対象ファイル名] [変更後の名前]"><a href="#%24+mv+%5B%E5%AF%BE%E8%B1%A1%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%5D+%5B%E5%A4%89%E6%9B%B4%E5%BE%8C%E3%81%AE%E5%90%8D%E5%89%8D%5D">$ mv [対象ファイル名] [変更後の名前]</a></h4> <hr /> <h3 id="⑧ rmコマンド(1)"><a href="#%E2%91%A7+rm%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%281%29">⑧ rmコマンド(1)</a></h3> <p>ファイルを削除する。<br /> rm…removeの略</p> <h4 id="$ rm [削除したいファイル名]"><a href="#%24+rm+%5B%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%5D">$ rm [削除したいファイル名]</a></h4> <p>コマンドを実⾏してもエラーでは無い限り、何もメッセージは出ない。<br /> Windowsのようなごみ箱の概念がないので⼀発で削除となります。<br /> 慎重にコマンドを実⾏しよう。</p> <hr /> <h3 id="⑧ rmコマンド(2)"><a href="#%E2%91%A7+rm%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%282%29">⑧ rmコマンド(2)</a></h3> <p>rmコマンドは <strong>r</strong> オプションを使うと<strong>ディレクトリも削除できる。</strong></p> <h4 id="$ rm -r [削除したいディレクトリ名]"><a href="#%24+rm+-r+%5B%E5%89%8A%E9%99%A4%E3%81%97%E3%81%9F%E3%81%84%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%90%8D%5D">$ rm -r [削除したいディレクトリ名]</a></h4> <p>ディレクトリ削除は対象を間違えると影響がとても⼤きい。<br /> 慎重にコマンドを実⾏しよう。</p> <hr /> <h3 id="⑨ lessコマンド"><a href="#%E2%91%A8+less%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">⑨ lessコマンド</a></h3> <p>テキストファイルの中⾝を閲覧する。<br /> catやmoreコマンドと異なりqを⼊⼒するまで終了しないのが特徴。</p> <h4 id="$ less [閲覧したいファイル名]"><a href="#%24+less+%5B%E9%96%B2%E8%A6%A7%E3%81%97%E3%81%9F%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%5D">$ less [閲覧したいファイル名]</a></h4> <p>less上の操作はカーソルキーで1⾏、スペースキーでページスクロール。<br /> 終了するときは「<strong>q</strong>」を⼊⼒する。</p> <hr /> <p>*ここに随時追加予定</p> Ususuke tag:crieit.net,2005:PublicArticle/16167 2020-10-22T17:07:15+09:00 2020-11-04T11:37:46+09:00 https://crieit.net/posts/SSH-REMOTE-HOST-IDENTIFICATION-HAS-CHANGED-SSH 【SSH】「REMOTE HOST IDENTIFICATION HAS CHANGED!」が出てSSH接続できない場合の対処法 <p>機器のリプレイス等により、クライアントPCのknown_hostsに格納されているフィンガープリント<br /> と接続先が一致しなくなると、以下の警告が出てSSHで接続できなくなる例のアレです。<br /> ここ数年遭遇しなかったので、すっかりコマンド忘れてました。というわけで備忘メモメモ</p> <h3 id="動作確認した環境"><a href="#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%9F%E7%92%B0%E5%A2%83">動作確認した環境</a></h3> <ul> <li>OpenSSH_7.9p1, LibreSSL 2.7.3</li> </ul> <h3 id="事象例"><a href="#%E4%BA%8B%E8%B1%A1%E4%BE%8B">事象例</a></h3> <p>以下の例では「192.168.1.2」がリプレイスした機器です、これにSSHしようとすると...</p> <pre><code class="bash">$ ssh [email protected] </code></pre> <p>こんな警告が出てしまいます</p> <pre><code>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:7pM8vhBE+NlnvD5tdDNU1OY9IWb16tHOtx20ILtIZ94. Please contact your system administrator. Add correct host key in /Users/arohajiro/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /Users/arohajiro/.ssh/known_hosts:4 ECDSA host key for 192.168.1.2 has changed and you have requested strict checking. Host key verification failed. </code></pre> <h3 id="対処方法"><a href="#%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95">対処方法</a></h3> <p>該当する機器「192.168.1.2」のフィンガープリントをssh-keygenコマンドで削除したら、対処完了です!</p> <h4 id="コマンド"><a href="#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89">コマンド</a></h4> <pre><code class="bash">$ ssh-keygen -R 192.168.1.2 </code></pre> <h4 id="出力例"><a href="#%E5%87%BA%E5%8A%9B%E4%BE%8B">出力例</a></h4> <pre><code># Host 192.168.1.2 found: line 4 /Users/arohajiro/.ssh/known_hosts updated. Original contents retained as /Users/arohajiro/.ssh/known_hosts.old </code></pre> arohajiro