[{"data":1,"prerenderedAt":1879},["ShallowReactive",2],{"tag-network":3},{"count":4,"content":5},6,[6,610,943,1175,1602,1768],{"id":7,"title":8,"body":9,"category":596,"createdAt":598,"description":8,"extension":599,"index":600,"meta":601,"navigation":602,"path":603,"publish":602,"seo":604,"series":600,"seriesTitle":600,"stem":605,"tag":606,"thumbnail":600,"updatedAt":598,"__hash__":609},"articles\u002Farticles\u002Fconnect-with-scp-ssh.md","FTPクライアントでなくターミナルでsshやscpによる通信を行う方法",{"type":10,"value":11,"toc":556},"minimark",[12,16,19,22,25,29,32,38,48,53,64,67,70,75,85,94,98,101,104,107,110,113,116,120,123,126,134,137,140,143,146,148,151,154,157,160,163,166,169,174,177,180,183,186,197,203,206,212,219,222,225,231,234,237,243,246,249,255,258,261,264,276,279,282,285,288,294,297,303,306,312,315,319,322,325,328,331,337,340,343,349,356,362,365,369,372,378,381,384,387,390,396,399,403,406,409,415,418,424,427,433,436,439,442,445,448,454,457,463,466,470,476,480,486,490,493,499,505,508,511,517,520,523,529,535,538,541,547,550,553],[13,14,15],"p",{},"こんにちはjunです。あなたはサーバー上にファイルをアップロードする際にどうやっていますか？大体がFTPクライアント（windowsだとwinscp、MacだとFileZillaなど）を使用していると思います。",[13,17,18],{},"GUIで操作できるソフトは扱いやすく、簡単にアップロード・ダウンロードを行ったり、複数ファイルを移動する際などは便利です。しかしある程度エンジニアレベルが上がると、サーバー構築やサーバー上での操作、例えば権限のいるファイルの編集とか機械的なファイル操作が必要になってくるので、FTPクライアントでの操作では限界が生じます。",[13,20,21],{},"特に大量のファイルを扱う際にはGUIクライアントソフトを用いると時間がかかったりすることも多かったり、権限によってファイルの操作ができない場合はsudoを打てる環境を用意しないといけません。",[13,23,24],{},"今回の記事ではSSHでサーバーとのやりとりをするための設定、そしてローカルとリモート間のscpを用いたファイル転送などGUIからCLI操作へのステップアップできるように解説していきたいと思います",[26,27,28],"h2",{"id":28},"前提条件",[13,30,31],{},"細かい説明に入る前に以下の条件での説明とします。",[13,33,34],{},[35,36,37],"strong",{},"クライアント",[39,40,41,45],"ul",{},[42,43,44],"li",{},"macOS Catalina 10.15.5",[42,46,47],{},"ターミナルを使用",[13,49,50],{},[35,51,52],{},"サーバー（GMO VPSとします）",[39,54,55,58,61],{},[42,56,57],{},"centOS7",[42,59,60],{},"22番ポート開放済み",[42,62,63],{},"sshdインストール済み",[26,65,66],{"id":66},"用語や基礎知識の確認",[13,68,69],{},"まず以降の説明を行う前に基礎的な用語と知識の解説を行います。知っている人はフンフンと頷きながら飛ばしてください。",[71,72,74],"h3",{"id":73},"ssh","SSH",[13,76,77,80,81,84],{},[35,78,79],{},"S","ecure ",[35,82,83],{},"Sh","ellのこと。直訳すると「安全なシェル」。シェルというのはターミナルとかコマンドプロンプトのことだと思ってください。そのシェルとネットワークを用いて遠隔にあるサーバーを操作します。昔はTelnetというものを用いてシェルで遠隔操作していましたが、Telnetで送受信するデータが平文という脆弱性がありました。",[13,86,87,88,90,91,93],{},"それに対する形で通信内容が暗号化される様になっているのがSSH。だから",[35,89,79],{},"ecure な ",[35,92,83],{},"ellと言われる。HttpにHttpsがついた様なニュアンス。",[71,95,97],{"id":96},"ipアドレス","IPアドレス",[13,99,100],{},"ネットワーク通信を行うえで必要な、各ネットワーク機器を一意に区別する数字のこと。マイナンバーとか車のナンバーみたいなものです。IPを用いることで接続するサーバーを指定することができます。SSHでは接続先のIPを知る必要があります。",[71,102,103],{"id":103},"ユーザー",[13,105,106],{},"サーバー上で操作するための名前というか、操作者の名前です。ユーザーを複数作り権限を割り振ることでサーバー上の操作を制限することができます。個々の名前にしておけば、誰が何を実行したのかも分かります。SSHでは「どのユーザー（権限を持った人）で実行するか？」が大切になります。",[13,108,109],{},"linuxでは「root」という名前のユーザーが最初にいます。このrootは他人のパスワードも変えられるし、サーバー上全てのファイルを消すことなんて可能な、なんでもできる「スーパーユーザー」です。",[71,111,112],{"id":112},"グループ",[13,114,115],{},"ユーザーをくくる為の「組」のこと。そのままの意味です。同じグループ内であれば所有者が異なるファイルであっても操作ができます。（そのような権限が付与されている場合）",[71,117,119],{"id":118},"ssh認証方式","SSH認証方式",[13,121,122],{},"SSHはリモートでサーバーに接続しますが、サーバーからしてみれば「どこのよく分からないIP（あなたのPC）から自分をいじってもいいか？」と聞かれているので必ず認証をします。つまりこのサーバーをいじっても良い正規の人間かをチェックします。",[13,124,125],{},"その認証方式としてSSHでは主に",[39,127,128,131],{},[42,129,130],{},"パスワード認証方式",[42,132,133],{},"鍵交換方式",[13,135,136],{},"の２つがあります。",[138,139,130],"h4",{"id":130},[13,141,142],{},"接続する際のユーザー名と、そのユーザーに紐づいたパスワードで接続することができます。Webサービスでログインがあるものと同じですね。分かりやすいですが、接続の度にパスワードを求められてちょっと面倒です。",[13,144,145],{},"また総当たり攻撃で突破される可能性もあるので、運用とセキュリティ面では次の鍵交換がおすすめです。",[138,147,133],{"id":133},[13,149,150],{},"秘密鍵と公開鍵というものを用いて認証を行います。鍵交換による認証原理の説明は今回は省きます。秘密鍵をクライアント（ローカル）において、公開鍵をサーバーにおいておきます。",[13,152,153],{},"ユーザーに紐づいた秘密鍵・公開鍵で認証を行います。秘密鍵は後述する通りにコマンドのオプションで指定できるので自動化やSSHの簡略化の際に便利になります。また秘密鍵のファイルが外部に漏れなければパスワード方式より安全です。",[13,155,156],{},"今回の解説では鍵交換方式でのSSH実行方法の設定も行います。",[26,158,159],{"id":159},"接続準備",[13,161,162],{},"今回は自分でVPSを借りて接続をするという状況として操作をします。ConohaやGMOではブラウザから最初にサーバーの設定を行います。",[13,164,165],{},"OSやrootユーザーのパスワードを設定してまず、サーバーが作られます。IPアドレスなども管理画面などに表示されていると思いますので控えておきます。",[13,167,168],{},"IPアドレスは「123.456.789.012」の様なピリオド４つで分けられた数字列のことです。",[170,171],"image-render",{":src":172,":width":173},"'_mix\u002Fconoha-768x714.png'","'100%'",[170,175],{":src":176,":width":173},"'_mix\u002Fxserver-768x432.png'",[71,178,179],{"id":179},"接続自体は簡単",[13,181,182],{},"IPアドレスとSSHユーザー名とパスワードがわかればあとは簡単です。とりあえず今回はVPSを借りているという想定なので、そのVPSのIPとrootユーザーパスワードがわかっているとします。",[13,184,185],{},"macならばターミナルを開きます。macにはsshを行うsshdが入っているので以下のコマンドを唱えます。",[187,188,193],"pre",{"className":189,"code":191,"language":192},[190],"language-text","~ % ssh root@IP_ADRESS\n","text",[194,195,191],"code",{"__ignoreMap":196},"",[13,198,199,202],{},[194,200,201],{},"ssh ユーザー名＠IPアドレス","を入力します。これは「指定したIPアドレスにrootというユーザー名でssh接続します！」という意味です。特にオプションを指定せず、パスワード認証方式が許可されている場合はパスワードを聞いてくるので入力します。",[13,204,205],{},"正しくパスワードを入力すると次の様な文章が出てきます。",[187,207,210],{"className":208,"code":209,"language":192},[190],"The authenticity of host '*****************' can't be established.\nRSA key fingerprint is *****************.\nAre you sure you want to continue connecting (yes\u002Fno)? \n>yes #問題なければ\n",[194,211,209],{"__ignoreMap":196},[13,213,214,215,218],{},"これはSSHキーフィンガースプリントと言われ日本語では「鍵指紋」と言われています。簡単に説明すると指定したIPで接続しても「本当に自分が繋ごうとしてるサーバーであっていますか？」と尋ねてくる。基本的にVPSなどは信頼できるので",[194,216,217],{},"yes","を選択。",[13,220,221],{},"この時yesを押すとクライアント側にサーバーから送られた公開鍵のハッシュ が保存されます。次回以降の接続ではこの公開鍵のハッシュが一緒に認証に使用されます。なぜ一緒に使われるのかというと、サーバーのなりすまし防止です。",[13,223,224],{},"IPなどの情報に加えてさらにsshdサーバーを区別するためにこの情報を保存して、接続先を担保します。もし次回に保存した公開鍵とサーバーから提示された公開鍵ハッシュ が異なると以下の様な警告が出ます。",[187,226,229],{"className":227,"code":228,"language":192},[190],"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nIT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!\n",[194,230,228],{"__ignoreMap":196},[26,232,233],{"id":233},"接続の確認",[13,235,236],{},"認証が終えるとこれでssh完了です。意外と簡単ですよね。変わったかどうかを確かめるには、とりあえずターミナルの表示を確認してみてください。",[187,238,241],{"className":239,"code":240,"language":192},[190],"Last login: Wed Jul 15 18:11:06 2020 from xxxxxxxxxxxxx\n[root@HOST_NAME ~]$\n",[194,242,240],{"__ignoreMap":196},[13,244,245],{},"この様にログイン時間、そして左側の表記が「ユーザー名＠IPなどのホスト名　カレントディレクトリ名」になっています。この状態であればログインできています。",[13,247,248],{},"sshを止める場合には",[187,250,253],{"className":251,"code":252,"language":192},[190],"[root@HOST_NAME ~]$ exit\n",[194,254,252],{"__ignoreMap":196},[13,256,257],{},"と入力するとsshを終了(ログアウト)できます。",[26,259,260],{"id":260},"鍵交換の実装",[13,262,263],{},"前述した通りパスワード認証はわかりやすいですが、逐一パスワードを入力したりするのは面倒ですし、自動化ができません。流出や総当たりの危険性があるので出来たら鍵交換方式に変えた方がスムーズです。",[265,266,267,270,273],"ol",{},[42,268,269],{},"ここではrootでパスワード認証して初めてssh接続をした。",[42,271,272],{},"このサーバーにはsshの公開鍵も秘密鍵もねえ！",[42,274,275],{},"root用の鍵交換認証を実装",[13,277,278],{},"という状況で鍵交換を実装したいと思います。",[71,280,281],{"id":281},"秘密鍵と公開鍵を作成する",[13,283,284],{},"サーバーにログインした状態で秘密鍵と公開鍵を作成します。ユーザーのホーム ディレクトリには「.ssh」という隠しフォルダがあり、その中にssh用の鍵を格納します。",[13,286,287],{},"もしホームディレクトリに.sshディレクトリがない場合は作成します。今回は無かったとしましょう。",[187,289,292],{"className":290,"code":291,"language":192},[190],"[root@HOST_NAME ~]$ mkdir .ssh\n[root@HOST_NAME ~]$ chmod 700 ~\u002F.ssh \n",[194,293,291],{"__ignoreMap":196},[13,295,296],{},".sshディレクトリは権限を700にします。でないと鍵による接続ができません。その.sshに移動して以下のコマンドを唱えて両鍵を作成します。今回はパスフレーズ（追加のパスワード）はなしとします。パスフレーズを入れるとパスワード認証の様に逐一入力を求められてしまいます。",[187,298,301],{"className":299,"code":300,"language":192},[190],"[root@HOST_NAME .ssh]$ ssh-keygen -t rsa -f id_rsa #-fはファイル名を指定できる。\nEnter passphrase (empty for no passphrase): #←パスフレーズを入力。基本なしでもOK、その際はEnterをおす\nEnter same passphrase again: #←パスフレーズを再入力。基本なしの時はEnterをおす\nYour identification has been saved in \u002Froot\u002F.ssh\u002Fid_rsa.\nYour public key has been saved in \u002Froot\u002F.ssh\u002Fid_rsa.pub.\nThe key fingerprint is:\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx root@xxxxx\nThe key's randomart image is:\n+--[ RSA 2048]----+\n|                 |\n|       .         |\n|        o        |\n|oo     . .       |\n|*.. .   S .      |\n|+E o       .     |\n|=.o . .   .      |\n|.+ . o ...       |\n|*+.   ..+o       |\n+-----------------+\n[root@HOST_NAME .ssh]$ ls\n[root@HOST_NAME .ssh]$ id_rsa id_rsa.pub\n",[194,302,300],{"__ignoreMap":196},[13,304,305],{},"鍵を作成してディレクトリ内をみると２つのファイルが見つかります。pubがついている方が公開鍵で、もう片方が秘密鍵です。次に公開鍵をサーバーに登録し、600権限を割り振ります。以下のコマンドを唱えます。",[187,307,310],{"className":308,"code":309,"language":192},[190],"[root@HOST_NAME .ssh]$ cat id_rsa.pub >> authorized_keys\n[root@HOST_NAME .ssh]$ chmod 600 authorized_keys\n[root@HOST_NAME .ssh]$ rm -fv id_rsa.pub #id_rsa.pubは捨てる\n",[194,311,309],{"__ignoreMap":196},[13,313,314],{},"権限の設定を忘れて接続ができないミスが多いので注意。",[26,316,318],{"id":317},"秘密鍵をクライアント自分のpcへ送信","秘密鍵をクライアント（自分のPC）へ送信",[13,320,321],{},"では次に接続元となる自分のPCへサーバーで作成した秘密鍵id_rsaを送信します。.sshフォルダ以外の場所に移動して、クラアントツールでひっぱてもいいですが、せっかくなのでscpコマンドを用いてやってみましょう。",[138,323,324],{"id":324},"scpコマンドでリモートからコピーする",[13,326,327],{},"scpはGUIのソフトでの送受信の正体です。リモートからローカルへのファイルのコピーをします。ファイルをコピーするコマンドにcpがありますが、あれがネットワークを通じている物だと思ってください。",[13,329,330],{},"リモートからローカルへコピーする時はローカル側で以下のような入力をします。",[187,332,335],{"className":333,"code":334,"language":192},[190],"jun@MacBook-Pro% scp \u003Cユーザー名>@\u003CIPアドレス>:\u003Cファイルまでのパス> \u003Cファイルを置くローカルのパス>\n",[194,336,334],{"__ignoreMap":196},[13,338,339],{},"scpの後に１つ目に「コピー元のファイルまでのパス」、２つ目に「コピーしたファイルの置き場所」を入力します。注意して欲しいのはscpコマンドはサーバーにログインして唱えるのではないということです。",[13,341,342],{},"よくわからないと思うので、同じようにリモートからあるファイルを取得する操作をFileZillaで行うと以下のようにメッセージが表示されます。やっていることはscpと変わりません。",[187,344,347],{"className":345,"code":346,"language":192},[190],"状態:     \"\u002Fvar\u002Fwww\u002Fhtml\" のディレクトリ リストの表示成功\n状態:     xxx.xx.xxx.xxx に接続中...\n状態:     Using username \"sample\". \n状態:     Connected to    xxx.xx.xxx.xxx\n状態:     \u002Fvar\u002Fwww\u002Fhtml\u002Findex.php のダウンロードを開始しています\n状態:     42 バイト (1 秒) のファイル転送に成功しました\n",[194,348,346],{"__ignoreMap":196},[13,350,351,352,355],{},"ローカルからリモートへ接続してファイルを取得しているのがわかります。scpによるファイルの送受信は ",[35,353,354],{},"サーバーにログインして行うのではなくて"," 、ローカル側から接続先を指定してファイルの送受信を行います。今回の秘密鍵を持ってくる場合は以下のように打ちます。",[187,357,360],{"className":358,"code":359,"language":192},[190],"jun@MacBook-Pro% scp root@IP_ADRESS:~\u002F.ssh\u002Fid_rsa ~\u002F\n",[194,361,359],{"__ignoreMap":196},[13,363,364],{},"「~\u002F」というのは「ホームディレクトリ」配下という意味です。「rootの ~\u002F.ssh\u002Fid_rsaにあるファイル」を「ローカルのホームディレクトリ 」にコピーしろ！という命令です。",[71,366,368],{"id":367},"秘密鍵を適当な箇所に置いて権限を付与","秘密鍵を適当な箇所に置いて、権限を付与",[13,370,371],{},"秘密鍵は接続の際にパスで参照できればどこに置いてもいいのですが、わかりやすいようにローカルの.sshディレクトリ配下に入れることにします。Macにはホームディレクトリに.sshというssh用の隠しフォルダがあります。以下はローカルでの作業です。",[187,373,376],{"className":374,"code":375,"language":192},[190],"jun@MacBook-Pro % cd ~ #ホームディレクトリに移動\njun@MacBook-Pro ~ % mv id_rsa .ssh\u002F && cd .ssh\njun@MacBook-Pro .ssh % ls -a\nconfig  id_rsa  known_hosts\n\njun@MacBook-Pro .ssh % chmod 600 id_rsa\n",[194,377,375],{"__ignoreMap":196},[13,379,380],{},"ここでも秘密鍵は600権限を付与しておきます。ここも忘れてハマりやすいので注意。ssh接続先が多くなり、鍵が増えたら「keys」などの適当な鍵収納用のフォルダを作るといいです。",[26,382,383],{"id":383},"鍵交換で接続する",[13,385,386],{},"以上で鍵交換の実装は完了です。実務的な運用の場合はサーバーでパスワードログインを禁止するなどが必要ですが今回は省略します。ではローカルから鍵を使ってログインしましょう。",[13,388,389],{},".ssh配下に鍵があるので、鍵のパスを指定しする様に以下の様に唱えます。",[187,391,394],{"className":392,"code":393,"language":192},[190],"jun@MacBook-Pro ~ % ssh -i ~\u002F.ssh\u002Fid_rsa root@IP_ADRESS\n",[194,395,393],{"__ignoreMap":196},[13,397,398],{},"パスワード式の接続に「-i」オプションを指定すると、「鍵交換で接続」という意味になります。-iの後にはローカルに保存した秘密鍵までのパスを指定します。あとはユーザー名とIPアドレスを入力すれば完了です。",[26,400,402],{"id":401},"パス指定が面倒","パス指定が面倒〜〜",[13,404,405],{},"鍵交換で実装を行うとパスワードを入力しなくていいので、メモをみたり自動化の際には便利です。しかしパスの指定が面倒という欠点がありますが、簡単に解決できます。エイリアスを設定してとても簡単に接続できる様になります。",[13,407,408],{},"早速設定してみましょう。.sshディレクトリに移動して「config」というファイルを編集します。なければ作成してください。",[187,410,413],{"className":411,"code":412,"language":192},[190],"jun@MacBook-Pro ~ % cd ~\u002F.ssh\njun@MacBook-Pro .ssh % vi config\n",[194,414,412],{"__ignoreMap":196},[13,416,417],{},"このconfigファイルに以下の情報を登録します。",[187,419,422],{"className":420,"code":421,"language":192},[190],"Host sshconnect #好きな名前\n HostName IP_ADRESS\n User root\n Port 22\n IdentityFile ~\u002F.ssh\u002Fid_rsa\n",[194,423,421],{"__ignoreMap":196},[13,425,426],{},"configファイルに上記の様に記述すると以下のコマンドを唱えるだけで、HostNameで指定したサーバーへsshができます。",[187,428,431],{"className":429,"code":430,"language":192},[190],"jun@MacBook-Pro ~ % ssh sshconnect\n",[194,432,430],{"__ignoreMap":196},[13,434,435],{},"とっても短くになりました。「sshconnect」と入力しただけです。さらに鍵交換式なのでパスワードの入力も入りません。ちなみにユーザー名だけだと、パスワードが求められ入力しないといけません。セキュリティの関係上configファイルにはパスワードを記録できません。（FileZillaなどのソフトはソフト自身が記憶している）",[13,437,438],{},"完全にストレスフリーにHostのエイリアスを打つだけで接続するには鍵交換式しかできません。",[26,440,441],{"id":441},"scpでファイルを送ってみよう",[13,443,444],{},"scpファイルの送受信をまとめておきます。",[71,446,447],{"id":447},"エイリアスを用いた送受信",[187,449,452],{"className":450,"code":451,"language":192},[190],"jun@MacBook-Pro ~ %　scp ~\u002Ftest.txt sshconnect:~\u002F\n",[194,453,451],{"__ignoreMap":196},[13,455,456],{},"sshの接続先は上記の様にエイリアス化するとリモート先をこんなに簡単に接続できます。エイリアスを使わない場合は以下の様に唱えます。",[187,458,461],{"className":459,"code":460,"language":192},[190],"jun@MacBook-Pro ~ %　scp -i ~\u002F.ssh\u002Fid_rsa ~\u002Ftest.txt root@IP_ADRESS:~\u002F\n",[194,462,460],{"__ignoreMap":196},[13,464,465],{},"以下はエイリアスを用いた鍵交換となっています。",[26,467,469],{"id":468},"ローカルリモート","ローカル→リモート",[187,471,474],{"className":472,"code":473,"language":192},[190],"jun@MacBook-Pro ~ %　scp ~\u002Ftest.txt sshconnect:~\u002F\n\n# scp \u003Cローカルのファイルまでのパス>　\u003Cエイリアス>:\u003Cリモートのコピー先のパス>\n",[194,475,473],{"__ignoreMap":196},[26,477,479],{"id":478},"リモートローカル","リモート→ローカル",[187,481,484],{"className":482,"code":483,"language":192},[190],"jun@MacBook-Pro ~ %　scp sshconnect:~\u002Ftest.txt　~\u002F \n\n# scp \u003Cエイリアス>:\u003Cリモートのファイルまでのパス>　\u003Cローカルのコピー先のパス>\n",[194,485,483],{"__ignoreMap":196},[26,487,489],{"id":488},"ディレクトリ-ごと移動ローカルから","ディレクトリ ごと移動（ローカルから）",[13,491,492],{},"膨大なファイルを輸送する時に早くて便利です。",[187,494,497],{"className":495,"code":496,"language":192},[190],"jun@MacBook-Pro ~ %　scp -r ~\u002Fheavy\u002F sshconnect:~\u002F\n",[194,498,496],{"__ignoreMap":196},[13,500,501,504],{},[194,502,503],{},"-r","を指定しないと「送信するものが普通のファイルじゃないよ！（not a regular file）」と怒られます。再起的にコピーされるので、ディレクトリ配下全てがコピーされます。",[26,506,507],{"id":507},"リモートからリモート",[13,509,510],{},"リモートサーバーその１をsshconnect01、その２をsshconnect02として01から02へ移動する場合です。ローカルを経由する方法と01で02に対するscpを行う方法があります。図示すると以下の様な感じです。",[187,512,515],{"className":513,"code":514,"language":192},[190],"ローカル経由\n\n  |-------sshconnect01\n  |↓   ←\nlocal\n  |↓　　→\n  |------sshconnect02\n\nリモートから直接\n  |-------sshconnect01\n  |↑   →       |↓\nlocal          |↓\n               |↓\n          sshconnect02\n",[194,516,514],{"__ignoreMap":196},[138,518,519],{"id":519},"リモートで直接",[13,521,522],{},"リモート01から02に直接送る場合はローカルで以下の様に打ちます",[187,524,527],{"className":525,"code":526,"language":192},[190],"リモート01から02に直接送る場合はローカルで以下の様に打ちます\n",[194,528,526],{"__ignoreMap":196},[13,530,531,532,534],{},"ディレクトリを写す場合は ",[194,533,503],{}," オプションを付けます。ただし、この方法は01は02への接続情報を持っていなければなりません。エリアスの場合も01の.ssh\u002Fconfigに sshconnect02についての記述を書く必要があります。02が鍵認証を行っている場合は01に02の鍵をおいておく必要があります。",[138,536,537],{"id":537},"ローカル経由",[13,539,540],{},"01から02に接続できない場合はローカルを経由する様にします。以下の様に打ちます。",[187,542,545],{"className":543,"code":544,"language":192},[190],"jun@MacBook-Pro ~ %　scp -3 sshconnect01:~\u002Ftest.txt　sshconnect02:~\u002F \n",[194,546,544],{"__ignoreMap":196},[13,548,549],{},"-3 オプションを使用します。ディレクトリコピーならばさらに -r を付けましょう。01からローカルに引っ張ってきてから、02へ送信します。自身の転送量は多くなりますが手軽にできます。",[26,551,552],{"id":552},"あとがき",[13,554,555],{},"以上がsshによるリモートログインとscpによるファイル送受信方法です。いつもはGUIソフトで操作しつつ、大量のファイル移動や権限が伴う移動などはコマンドを用いた方が便利です。まずはtest.txtなど影響のないファイルを作って、練習するといいでしょう。",{"title":196,"searchDepth":557,"depth":557,"links":558},3,[559,561,572,575,576,579,583,584,585,588,589,590,591,595],{"id":28,"depth":560,"text":28},2,{"id":66,"depth":560,"text":66,"children":562},[563,564,565,566,567],{"id":73,"depth":557,"text":74},{"id":96,"depth":557,"text":97},{"id":103,"depth":557,"text":103},{"id":112,"depth":557,"text":112},{"id":118,"depth":557,"text":119,"children":568},[569,571],{"id":130,"depth":570,"text":130},4,{"id":133,"depth":570,"text":133},{"id":159,"depth":560,"text":159,"children":573},[574],{"id":179,"depth":557,"text":179},{"id":233,"depth":560,"text":233},{"id":260,"depth":560,"text":260,"children":577},[578],{"id":281,"depth":557,"text":281},{"id":317,"depth":560,"text":318,"children":580},[581,582],{"id":324,"depth":570,"text":324},{"id":367,"depth":557,"text":368},{"id":383,"depth":560,"text":383},{"id":401,"depth":560,"text":402},{"id":441,"depth":560,"text":441,"children":586},[587],{"id":447,"depth":557,"text":447},{"id":468,"depth":560,"text":469},{"id":478,"depth":560,"text":479},{"id":488,"depth":560,"text":489},{"id":507,"depth":560,"text":507,"children":592},[593,594],{"id":519,"depth":570,"text":519},{"id":537,"depth":570,"text":537},{"id":552,"depth":560,"text":552},[597],"devstack","2026-03-25","md",null,{},true,"\u002Farticles\u002Fconnect-with-scp-ssh",{"title":8,"description":8},"articles\u002Fconnect-with-scp-ssh",[607,608],"infrastructure","network","vb0ciWoDxv7wsXMgPxZsPl_2qDz-iNYzIyU8cFy07oc",{"id":611,"title":612,"body":613,"category":932,"createdAt":934,"description":935,"extension":599,"index":600,"meta":936,"navigation":602,"path":937,"publish":602,"seo":938,"series":600,"seriesTitle":600,"stem":939,"tag":940,"thumbnail":600,"updatedAt":600,"__hash__":942},"articles\u002Farticles\u002Flaravel-plain-text-with-html.md","LaravelのMailableでHTMLメールとプレーンテキストメール両方を送信する方法",{"type":10,"value":614,"toc":922},[615,618,622,625,632,636,639,648,652,659,669,675,678,682,685,773,783,793,796,799,805,820,841,860,863,870,918],[13,616,617],{},"こんにちはjunです。Laravelでメール機能が伴う内容を実装していたときに、HTMLメールだけでなくプレーンテキストメールでも送付してほしいとの用件がありました。Laravelではメールを送信する時は大抵、Mailableを使用しますがその時に両方送る方法が意外と日本語でなかったので忘備録として記事を作りました。プレーンテキストとはなんぞや？というとこから解説するので、対策法をさっさと知りたい方は「Mailabeでのプレーンテキストの設定」を見てください。",[26,619,621],{"id":620},"プレーンテキストメールとhtmlメールの違い","プレーンテキストメールとHTMLメールの違い",[13,623,624],{},"HTMLメールは名の通り、HTMLの記法で作成されたメールです。生のデータにはHTMLが書かれており、メールクライアント側でHTMLをレンダリングしてメール内容を表示します。リッチなメールを送付できるというメリットがあります。デメリットとして環境やデバイスによってはメールが全く見れなくなることです。",[13,626,627,628,631],{},"HTMLメールが見れない環境や昔はプレーンテキストメールといった、メモ帳で書いた様な本当に純粋な文字だけのメールを利用します。メリットはどの端末でも必ず表示はできるので、確実に届けたいメールなどにはプレーンテキストがおすすめです。例えばGithubの二段階認証メールは",[194,629,630],{},"Content-Type: text\u002Fplain; charset=UTF-8","とプレーンテキストで必ず送られ、毎週のお知らせメールはその両方が送られています。",[71,633,635],{"id":634},"どうやって確認できるの","どうやって確認できるの？",[13,637,638],{},"気になる方は届いたメールのソースを見てみましょう。Gmailであれば「画面右側の点々」をクリックして「メッセージのソースを表示」をクリックしますと、メールのヘッダやボディを確認できます。そのとき",[13,640,641,643,644,647],{},[194,642,630],{},"があれば、プレーンテキストメール形式で送付され、",[194,645,646],{},"Content-Type: text\u002Fhtml; charset=UTF-8","があればHTMLメールです。きちんとHTMLの記述があるのを確認してみてください。",[71,649,651],{"id":650},"なぜ両方ともつけることができるの","なぜ両方ともつけることができるの？",[13,653,654,655,658],{},"ちなみにメールにはHTMLとプレーン両方ともつけることは可能です。その場合環境に合わせてHTML・プレーンのものが表示されます。その仕組みはソースの中に ",[194,656,657],{},"Content-Type: multipart\u002Falternative; boundary=","のような記述をしようすることです。これはメールの内容を複数の形式で送りますよというヘッダ要素です。HTMLの内容とプレーンテキストの内容がソースでどこで分けているかを示しています。",[13,660,661,664,665,668],{},[194,662,663],{}," boundary=\"...\""," のboundaryの中身にある文字を境界として使用します。Laravelの場合はSwiftを使用しているので ",[194,666,667],{},"_=_swift_1646631221_d7511bd8d439c84878b3339aaec563e1_=_","という文字（一部分はランダムです）が境界として使用され、",[187,670,673],{"className":671,"code":672,"language":192},[190],"Content-Type: multipart\u002Falternative; boundary=\"_=_swift_1646631221_d7511bd8d439c84878b3339aaec563e1_=_\"\n\n--_=_swift_1646631221_d7511bd8d439c84878b3339aaec563e1_=_\nContent-Type: text\u002Fplain; charset=utf-8\nContent-Transfer-Encoding: quoted-printable\n\n（１）HTMLの記述’\n\n--_=_swift_1646631221_d7511bd8d439c84878b3339aaec563e1_=_\nContent-Type: text\u002Fhtml; charset=utf-8\nContent-Transfer-Encoding: quoted-printable\n\n（２）プレーンテキストの記述\n\n--_=_swift_1646631221_d7511bd8d439c84878b3339aaec563e1_=_\n",[194,674,672],{"__ignoreMap":196},[13,676,677],{},"上記の様な記述があると思います。ここで境界の文字を用いて２つの形式の内容を記述し、メールを送付してクライアントは適宜そのソースを汲み取って表示しています。",[26,679,681],{"id":680},"mailabeでのプレーンテキストの設定","Mailabeでのプレーンテキストの設定",[13,683,684],{},"前置きがながくなりましたが、LaravelのMailableでは以下の様に指定します。",[187,686,690],{"className":687,"code":688,"language":689,"meta":196,"style":196},"language-php shiki shiki-themes material-theme-ocean","\u002F**\n    * Build the message.\n    *\n    * @return $this\n*\u002F\npublic function build()\n{\n    return $this->view('mail.registration',[\n        'applay_user_name'=>$name,\n    ])->text('mail.registration_text',[ \u002F\u002F これ！\n        'applay_user_name'=>$name,\n    ])\n    ->subject('登録を受け付けました。');\n}\n","php",[194,691,692,700,705,710,715,721,726,732,738,744,750,755,761,767],{"__ignoreMap":196},[693,694,697],"span",{"class":695,"line":696},"line",1,[693,698,699],{},"\u002F**\n",[693,701,702],{"class":695,"line":560},[693,703,704],{},"    * Build the message.\n",[693,706,707],{"class":695,"line":557},[693,708,709],{},"    *\n",[693,711,712],{"class":695,"line":570},[693,713,714],{},"    * @return $this\n",[693,716,718],{"class":695,"line":717},5,[693,719,720],{},"*\u002F\n",[693,722,723],{"class":695,"line":4},[693,724,725],{},"public function build()\n",[693,727,729],{"class":695,"line":728},7,[693,730,731],{},"{\n",[693,733,735],{"class":695,"line":734},8,[693,736,737],{},"    return $this->view('mail.registration',[\n",[693,739,741],{"class":695,"line":740},9,[693,742,743],{},"        'applay_user_name'=>$name,\n",[693,745,747],{"class":695,"line":746},10,[693,748,749],{},"    ])->text('mail.registration_text',[ \u002F\u002F これ！\n",[693,751,753],{"class":695,"line":752},11,[693,754,743],{},[693,756,758],{"class":695,"line":757},12,[693,759,760],{},"    ])\n",[693,762,764],{"class":695,"line":763},13,[693,765,766],{},"    ->subject('登録を受け付けました。');\n",[693,768,770],{"class":695,"line":769},14,[693,771,772],{},"}\n",[13,774,775,778,779,782],{},[194,776,777],{},"text()","メソッドを使用することで前述の解説の様にプレーンテキスト用のmultipartを入れ込んでくれます。なお、引数は",[194,780,781],{},"view()","メソッドと同じでテンプレートファイルとデータを渡すことができます。この記法はLaravel5.3から利用できます。",[13,784,785,786],{},"参考\n",[787,788,792],"a",{"href":789,"rel":790},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Fmail#plain-text-emails",[791],"nofollow","Laravel9 Mail",[71,794,795],{"id":795},"テンプレートの記述とファイル構成のすすめ",[13,797,798],{},"私の場合は以下の様な構成とファイル名でメールテンプレートを管理しています。",[187,800,803],{"className":801,"code":802,"language":192},[190],"views\n│\n├── mail\n    ├── master.blade.php\n    ├── master_text.blade.php\n    ├── register.blade.php\n    └── register_text.blade.php\n",[194,804,802],{"__ignoreMap":196},[13,806,807,808,811,812,815,816,819],{},"まずviewsでmail用のテンプレートを格納するディレクトリ を作成し、そしてHプレーンテキスト用のテンプレートはTML用のものに",[194,809,810],{},"_text","をつけておきます。そして",[194,813,814],{},"master.blade.php","はレイアウトやHTMLのスタイルを定義しています。同じようにプレーン用のレイアウトファイルの",[194,817,818],{},"master_text.blade.php","を用意しておくといいです。",[187,821,824],{"className":687,"code":822,"filename":823,"language":689,"meta":196,"style":196},"{{$name}}様\n\u003Cp>いつもご利用いただきありがとうございます。\u003C\u002Fp>\n...\n","register.blade.php",[194,825,826,831,836],{"__ignoreMap":196},[693,827,828],{"class":695,"line":696},[693,829,830],{},"{{$name}}様\n",[693,832,833],{"class":695,"line":560},[693,834,835],{},"\u003Cp>いつもご利用いただきありがとうございます。\u003C\u002Fp>\n",[693,837,838],{"class":695,"line":557},[693,839,840],{},"...\n",[187,842,845],{"className":687,"code":843,"filename":844,"language":689,"meta":196,"style":196},"{{$name}}様\nいつもご利用いただきありがとうございます。\n...\n","register_text.blade.php",[194,846,847,851,856],{"__ignoreMap":196},[693,848,849],{"class":695,"line":696},[693,850,830],{},[693,852,853],{"class":695,"line":560},[693,854,855],{},"いつもご利用いただきありがとうございます。\n",[693,857,858],{"class":695,"line":557},[693,859,840],{},[26,861,862],{"id":862},"notifiableの場合",[13,864,865,866,869],{},"これはLaravel8しか確認していませんが、Notifiableで使用されるMailMessageの場合はプレーンテキストが自動的に作成されていました。以下の様に",[194,867,868],{},"toMail()","を作成しておけばHTMLもプレーンも送付されていました。",[187,871,873],{"className":687,"code":872,"language":689,"meta":196,"style":196},"public function toMail($notifiable)\n{\n    return (new MailMessage)\n                ->subject('メールアドレスが変更されました')\n                ->line(\"いつもご利用いただきありがとうございます。\")\n                ->line('連絡用メールアドレスの変更を受け付けました。')\n                ->line('※本メールは送信専用です。ご返信いただいても対応できませんのでご了承ください。')\n                ->line('※本メールにお心当たりがない場合は、恐れ入りますが破棄していただきますようお願いいたします。');\n}\n",[194,874,875,880,884,889,894,899,904,909,914],{"__ignoreMap":196},[693,876,877],{"class":695,"line":696},[693,878,879],{},"public function toMail($notifiable)\n",[693,881,882],{"class":695,"line":560},[693,883,731],{},[693,885,886],{"class":695,"line":557},[693,887,888],{},"    return (new MailMessage)\n",[693,890,891],{"class":695,"line":570},[693,892,893],{},"                ->subject('メールアドレスが変更されました')\n",[693,895,896],{"class":695,"line":717},[693,897,898],{},"                ->line(\"いつもご利用いただきありがとうございます。\")\n",[693,900,901],{"class":695,"line":4},[693,902,903],{},"                ->line('連絡用メールアドレスの変更を受け付けました。')\n",[693,905,906],{"class":695,"line":728},[693,907,908],{},"                ->line('※本メールは送信専用です。ご返信いただいても対応できませんのでご了承ください。')\n",[693,910,911],{"class":695,"line":734},[693,912,913],{},"                ->line('※本メールにお心当たりがない場合は、恐れ入りますが破棄していただきますようお願いいたします。');\n",[693,915,916],{"class":695,"line":740},[693,917,772],{},[919,920,921],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":196,"searchDepth":557,"depth":557,"links":923},[924,928,931],{"id":620,"depth":560,"text":621,"children":925},[926,927],{"id":634,"depth":557,"text":635},{"id":650,"depth":557,"text":651},{"id":680,"depth":560,"text":681,"children":929},[930],{"id":795,"depth":557,"text":795},{"id":862,"depth":560,"text":862},[933],"ministack","2022-03-07","LaravelのMilableでHTMLメールとプレーンテキストメール両方を送信する方法",{},"\u002Farticles\u002Flaravel-plain-text-with-html",{"title":612,"description":935},"articles\u002Flaravel-plain-text-with-html",[941,689,608],"laravel","Ru_0w8TnRhwaXPjcr0gSRvxAArbPnEm7l-VCgPS-v6w",{"id":944,"title":945,"body":946,"category":1167,"createdAt":1168,"description":945,"extension":599,"index":600,"meta":1169,"navigation":602,"path":1170,"publish":602,"seo":1171,"series":600,"seriesTitle":600,"stem":1172,"tag":1173,"thumbnail":600,"updatedAt":600,"__hash__":1174},"articles\u002Farticles\u002Fpreflight-redirect-cors-error.md","URL正規化によって Redirect is not allowed for a preflight request でCORSエラーが起きた",{"type":10,"value":947,"toc":1165},[948,951,957,964,990,1004,1007,1142,1156,1162],[13,949,950],{},"こんにちはjunです。LaravelとNuxt SPAでアプリを作っていたのですがCORS設定をしているのに偶に以下のようなエラーが発生していました。",[187,952,955],{"className":953,"code":954,"language":192},[190],"Access to XMLHttpRequest at 'http:\u002F\u002Flocalhost\u002Fapi\u002Fv1\u002Ftest\u002F' from origin 'http:\u002F\u002Flocalhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request.\n",[194,956,954],{"__ignoreMap":196},[13,958,959,960,963],{},"エラー内容の通り原因はpreflightリクエストがリダイレクトされてしまっていることが原因です。開発者ツールでnetworkを見ると確かにpreflightリクエストが301となっていることが原因です。しかしなぜリダイレクト？Laravelでredirectを返すメソッドがあるのかと思いましたが、原因は",[194,961,962],{},".htaccess","の以下の記述でした。",[187,965,968],{"className":966,"code":967,"language":962,"meta":196,"style":196},"language-.htaccess shiki shiki-themes material-theme-ocean","#Redirect Trailing Slashes If Not A Folder...\nRewriteCond %{REQUEST_FILENAME} !-d\nRewriteCond %{REQUEST_URI} (.+)\u002F$\nRewriteRule ^ %1 [L,R=301]\n",[194,969,970,975,980,985],{"__ignoreMap":196},[693,971,972],{"class":695,"line":696},[693,973,974],{},"#Redirect Trailing Slashes If Not A Folder...\n",[693,976,977],{"class":695,"line":560},[693,978,979],{},"RewriteCond %{REQUEST_FILENAME} !-d\n",[693,981,982],{"class":695,"line":557},[693,983,984],{},"RewriteCond %{REQUEST_URI} (.+)\u002F$\n",[693,986,987],{"class":695,"line":570},[693,988,989],{},"RewriteRule ^ %1 [L,R=301]\n",[13,991,992,993,995,996,999,1000,1003],{},"上記はLaravelが使用するURLの正規化を行う",[194,994,962],{},"の記述です。URLの末尾にスラッシュがある場合、ないように正規化してくれます。",[194,997,998],{},"http:\u002F\u002Flocalhost\u002Ftest\u002F","→",[194,1001,1002],{},"http:\u002F\u002Flocalhost\u002Ftest"," のようにリダイレクトがおきます。これはAPIルートでも発生します。",[13,1005,1006],{},"私のAPIリクエストを見てみると",[187,1008,1012],{"className":1009,"code":1010,"language":1011,"meta":196,"style":196},"language-javascript shiki shiki-themes material-theme-ocean","async test(){\n    this.$axios.post('\u002Fv1\u002Ftest\b\u002F')\n    .then(res=>[\n        console.log(res)\n    ])\n    .catch(err=>{\n        console.log(err)\n    })\n}\n","javascript",[194,1013,1014,1030,1060,1081,1097,1101,1117,1131,1138],{"__ignoreMap":196},[693,1015,1016,1020,1024,1027],{"class":695,"line":696},[693,1017,1019],{"class":1018},"s0W1g","async ",[693,1021,1023],{"class":1022},"sdLwU","test",[693,1025,1026],{"class":1018},"()",[693,1028,731],{"class":1029},"sAklC",[693,1031,1032,1035,1038,1041,1044,1048,1051,1055,1057],{"class":695,"line":560},[693,1033,1034],{"class":1029},"    this.",[693,1036,1037],{"class":1018},"$axios",[693,1039,1040],{"class":1029},".",[693,1042,1043],{"class":1022},"post",[693,1045,1047],{"class":1046},"s-wAU","(",[693,1049,1050],{"class":1029},"'",[693,1052,1054],{"class":1053},"sfyAc","\u002Fv1\u002Ftest\b\u002F",[693,1056,1050],{"class":1029},[693,1058,1059],{"class":1046},")\n",[693,1061,1062,1065,1068,1070,1074,1078],{"class":695,"line":557},[693,1063,1064],{"class":1029},"    .",[693,1066,1067],{"class":1022},"then",[693,1069,1047],{"class":1046},[693,1071,1073],{"class":1072},"s7ZW3","res",[693,1075,1077],{"class":1076},"sJ14y","=>",[693,1079,1080],{"class":1046},"[\n",[693,1082,1083,1086,1088,1091,1093,1095],{"class":695,"line":570},[693,1084,1085],{"class":1018},"        console",[693,1087,1040],{"class":1029},[693,1089,1090],{"class":1022},"log",[693,1092,1047],{"class":1046},[693,1094,1073],{"class":1018},[693,1096,1059],{"class":1046},[693,1098,1099],{"class":695,"line":717},[693,1100,760],{"class":1046},[693,1102,1103,1105,1108,1110,1113,1115],{"class":695,"line":4},[693,1104,1064],{"class":1029},[693,1106,1107],{"class":1022},"catch",[693,1109,1047],{"class":1046},[693,1111,1112],{"class":1072},"err",[693,1114,1077],{"class":1076},[693,1116,731],{"class":1029},[693,1118,1119,1121,1123,1125,1127,1129],{"class":695,"line":728},[693,1120,1085],{"class":1018},[693,1122,1040],{"class":1029},[693,1124,1090],{"class":1022},[693,1126,1047],{"class":1046},[693,1128,1112],{"class":1018},[693,1130,1059],{"class":1046},[693,1132,1133,1136],{"class":695,"line":734},[693,1134,1135],{"class":1029},"    }",[693,1137,1059],{"class":1046},[693,1139,1140],{"class":695,"line":740},[693,1141,772],{"class":1029},[13,1143,1144,1145,1147,1148,1151,1152,1155],{},"URLをみてみると",[194,1146,1054],{},"と末尾にスケジュール があります。そしてXHRは ",[194,1149,1150],{},"POST + contetnt-type:application\u002Fjson"," のようなリクエストではpreflightリクエストが飛びますが、そのリクエストはリダイレクトをしてはいけません。そのためURLを",[194,1153,1154],{},"\u002Fv1\u002Ftest\b","と末尾をなくしてあげたらリダイレクトが起きず、問題なくCORSが起きなくなりました。",[13,1157,1158,1159,1161],{},"CORSの設定やLaravelのメソッドを調べていましたが、結構簡単な",[194,1160,962],{},"が原因でした。",[919,1163,1164],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s0W1g, html code.shiki .s0W1g{--shiki-default:#BABED8}html pre.shiki code .sdLwU, html code.shiki .sdLwU{--shiki-default:#82AAFF}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .s-wAU, html code.shiki .s-wAU{--shiki-default:#F07178}html pre.shiki code .sfyAc, html code.shiki .sfyAc{--shiki-default:#C3E88D}html pre.shiki code .s7ZW3, html code.shiki .s7ZW3{--shiki-default:#BABED8;--shiki-default-font-style:italic}html pre.shiki code .sJ14y, html code.shiki .sJ14y{--shiki-default:#C792EA}",{"title":196,"searchDepth":557,"depth":557,"links":1166},[],[933],"2021-09-19",{},"\u002Farticles\u002Fpreflight-redirect-cors-error",{"title":945,"description":945},"articles\u002Fpreflight-redirect-cors-error",[607,608],"ia4jjF7K85Ze8kJeV-fqRUKhfJsuBqIgYCJYkocy2u0",{"id":1176,"title":1177,"body":1178,"category":1592,"createdAt":1593,"description":1177,"extension":599,"index":600,"meta":1594,"navigation":602,"path":1595,"publish":602,"seo":1596,"series":600,"seriesTitle":600,"stem":1597,"tag":1598,"thumbnail":1600,"updatedAt":600,"__hash__":1601},"articles\u002Farticles\u002Fvps-ssh-first.md","VPSでやっておきたいSSHの最低限のセキュティ設定。",{"type":10,"value":1179,"toc":1580},[1180,1183,1186,1189,1203,1218,1221,1225,1228,1234,1237,1240,1249,1252,1255,1266,1269,1272,1275,1281,1284,1290,1297,1303,1333,1336,1348,1355,1361,1364,1367,1370,1373,1379,1382,1388,1395,1401,1410,1416,1424,1430,1437,1455,1458,1461,1468,1474,1492,1495,1501,1504,1510,1513,1518,1521,1524,1527,1533,1536,1539,1545,1555,1561,1564,1570,1573,1577],[13,1181,1182],{},"こんにちはjunです。webエンジニアとして働いていますが会社の人数が少なく、インフラの構築をすることがあります。と言ってもLAMP環境を作成するぐらいですけど。",[13,1184,1185],{},"構築は慣れてきましたがその中で、私が一番考えるのはセキュリティーです。構築するアプリケーションによってはセキュリティー設定はことなりますが、今回は自分でサーバを構築する時に最低限やった方がいいSSHの設定をメモがてら記事にしようと思います。",[13,1187,1188],{},"今回行う設定は以下の通りです。",[39,1190,1191,1194,1197,1200],{},[42,1192,1193],{},"rootユーザーのリモートログイン禁止化",[42,1195,1196],{},"パスワード認証禁止と鍵認証化",[42,1198,1199],{},"鍵認証の実装方法",[42,1201,1202],{},"ポート変更とfirewallの設定",[1204,1205,1209,1210],"div",{"className":1206},[1207,1208],"alert","alert-success","\nなお今回説明する環境\n",[39,1211,1212,1215],{},[42,1213,1214],{},"サービス：GMO conoha VPS",[42,1216,1217],{},"OS：centos8",[13,1219,1220],{},"この設定をすべき理由や背景などから話すため、さっさと方法を知りたい場合は「root以外のユーザーを作成していく」から見てください。",[26,1222,1224],{"id":1223},"sshはめちゃくちゃ狙われている","SSHはめちゃくちゃ狙われている",[13,1226,1227],{},"SSHはリモートでサーバーを操作できる口のため、一番厳重にしなければなりません。あまり運用していないサーバー、購入したばかりでドメインと紐づけられていなくても世界中からBOTによる不正アクセス試行が発生します。私がVPSで購入してイメージが立った時も早速ログを見たところ以下の様になっていました。",[187,1229,1232],{"className":1230,"code":1231,"language":192},[190],"April  8 12:10:04 xxx-xxx-xx-xxx sshd[6887]: Failed password for root from 209.141.36.197 port 54506 ssh2\nApril  8 12:10:04 xxx-xxx-xx-xxx sshd[6891]: Failed password for invalid user oracle from 209.141.36.197 port 54518 ssh2\nApril  8 12:10:04 xxx-xxx-xx-xxx sshd[6892]: Failed password for invalid user test from 209.141.36.197 port 54512 ssh2\nApril  8 12:10:04 xxx-xxx-xx-xxx sshd[6889]: Failed password for root from 209.141.36.197 port 54520 ssh2\nApril  8 12:10:06 xxx-xxx-xx-xxx sshd[6904]: Failed password for root from 222.187.238.136 port 58496 ssh2\nApril  8 12:10:10 xxx-xxx-xx-xxx sshd[6904]: Failed password for root from 222.187.238.136 port 58496 ssh2\nApril  8 12:16:26 xxx-xxx-xx-xxx sshd[6909]: Failed password for root from 221.181.185.220 port 28787 ssh2\nApril  8 12:16:30 xxx-xxx-xx-xxx sshd[6909]: Failed password for root from 221.181.185.220 port 28787 ssh2\nApril  8 12:16:33 xxx-xxx-xx-xxx sshd[6909]: Failed password for root from 221.181.185.220 port 28787 ssh2\nApril  8 12:16:37 xxx-xxx-xx-xxx sshd[6911]: Failed password for root from 221.181.185.220 port 55152 ssh2\nApril  8 12:16:41 xxx-xxx-xx-xxx sshd[6911]: Failed password for root from 221.181.185.220 port 55152 ssh2\nApril  8 12:16:45 xxx-xxx-xx-xxx sshd[6911]: Failed password for root from 221.181.185.220 port 55152 ssh2\nApril  8 12:16:49 xxx-xxx-xx-xxx sshd[6913]: Failed password for root from 221.181.185.220 port 39938 ssh2\nApril  8 12:16:53 xxx-xxx-xx-xxx sshd[6913]: Failed password for root from 221.181.185.220 port 39938 ssh2\nApril  8 12:16:56 xxx-xxx-xx-xxx sshd[6913]: Failed password for root from 221.181.185.220 port 39938 ssh2\nApril  8 12:27:50 xxx-xxx-xx-xxx sshd[6918]: Failed password for root from 222.187.239.109 port 32720 ssh2\nApril  8 12:27:54 xxx-xxx-xx-xxx sshd[6918]: Failed password for root from 222.187.239.109 port 32720 ssh2\nApril  8 12:27:57 xxx-xxx-xx-xxx sshd[6918]: Failed password for root from 222.187.239.109 port 32720 ssh2\n",[194,1233,1231],{"__ignoreMap":196},[13,1235,1236],{},"これはSSHの接続失敗の履歴です、同じIPで定間隔でrootユーザーによるパスワード接続を試みています。これはパスワードリスト攻撃・総当たり攻撃というものです。確率は低いですがrootのパスワードが万が一にあった場合、サーバの最上権限であるrootが第三者に掌握されます。",[13,1238,1239],{},"ドメインに紐づけられておらずIPだけでもこの様にBOTがインターネットを徘徊して、脆弱なサーバを狙っています。VPSを購入したらすぐにデフォルトの設定を変えて、比較的安全なものに変更しましょう。",[1204,1241,1244,1245,1248],{"className":1242},[1207,1243],"alert-info","\nターミナルで",[194,1246,1247],{},"whois","コマンドを使用してIPのwois情報を調べられます。登録された国などもわかります。ちなみに上記のIPのほとんどが中国でした。\n",[26,1250,1251],{"id":1251},"安全にするために変更する設定",[13,1253,1254],{},"デフォルトの設定から以下の変更を行います。",[39,1256,1257,1260,1263],{},[42,1258,1259],{},"rootによるリモートログインを禁止にする。",[42,1261,1262],{},"SSHをパスワード認証でなく、鍵認証にする",[42,1264,1265],{},"ポートを変更する",[13,1267,1268],{},"これらの設定は最低限行うべきものです。より強固にする場合は、色々と他に設定しますがまずはこれでいきましょう。",[71,1270,1271],{"id":1271},"root以外のユーザーを作成していく",[13,1273,1274],{},"最終的にはrootのリモートログインを禁止するため別の操作ユーザーを作成していきます。まずはrootでログインしましましょう。",[187,1276,1279],{"className":1277,"code":1278,"language":192},[190],"ssh root@123.456.78.901\n（IPなどは自分のものに置き換えてください）\n",[194,1280,1278],{"__ignoreMap":196},[13,1282,1283],{},"開発用・SSH接続用ユーザーを作成します。",[187,1285,1288],{"className":1286,"code":1287,"language":192},[190],"# useradd develop\n# passwd develop\n",[194,1289,1287],{"__ignoreMap":196},[13,1291,1292,1293,1296],{},"これでユーザーとそのパスワードが設定されました。次にそのユーザーを",[194,1294,1295],{},"wheel","グループに所属させます。",[187,1298,1301],{"className":1299,"code":1300,"language":192},[190],"# usermod -G wheel develop\n",[194,1302,1300],{"__ignoreMap":196},[13,1304,1305,1307,1308,1311,1312,1315,1316,1319,1320,1323,1324,1326,1327,1329,1330,1332],{},[194,1306,1295],{},"グループに所属することで",[194,1309,1310],{},"develop","が",[194,1313,1314],{},"sudo","を使用できる様になり、また",[194,1317,1318],{},"su","にてrootになることができます。",[194,1321,1322],{},"\u002Fetc\u002Fsudoers","では",[194,1325,1295],{},"グループで行える操作などを定義してあり、基本的にはrootを使用せずdevelopでsshログインをして操作します。yumで何かインストールしたい時とかは",[194,1328,1314],{},"したり",[194,1331,1318],{},"でrootになります。",[138,1334,1335],{"id":1335},"wheelのみがsuできる様にする",[13,1337,1338,1339,1341,1342,1344,1345,1347],{},"デフォルトではsuでどのユーザーもrootになれます。",[194,1340,1310],{},"意外にもユーザは存在し、そのユーザーが狙われることもあります。そのため",[194,1343,1295],{},"グループに属しているユーザーだけが",[194,1346,1318],{},"を用いてrootになれる様にしましょう。",[13,1349,1350,1351,1354],{},"suの設定は",[194,1352,1353],{},"\u002Fetc\u002Fpam.d\u002Fsu","に記述されています。",[187,1356,1359],{"className":1357,"code":1358,"language":192},[190],"# vi \u002Fetc\u002Fpam.d\u002Fsu\n\n--------\n# コメントアウトしているこの箇所を外す\n# auth            required        pam_wheel.so use_uid\n↓\nauth            required        pam_wheel.so use_uid\n--------\n",[194,1360,1358],{"__ignoreMap":196},[13,1362,1363],{},"コメントアウトされている箇所を外します。これでsuでrootになるためにwheelグループに属したユーザーから行うという制限ができました。",[71,1365,1366],{"id":1366},"develop用のssh鍵を作成",[13,1368,1369],{},"現在sshはパスワードでログインできますが、最終的にはパスワード認証を禁止にします。そしてよりセキュアな鍵認証式に変更します。基本的にログインの手間やセキュリティ的に鍵認証にした方がいいです。鍵認証の原理は今回は省きます。それではdevelop用の鍵を作成します。",[13,1371,1372],{},"クライアント側で秘密鍵と公開書きを作成します。",[187,1374,1377],{"className":1375,"code":1376,"language":192},[190],"% ssh-keygen\nGenerating public\u002Fprivate rsa key pair.\nEnter file in which to save the key (\u002FUsers\u002Fyou\u002F.ssh\u002Fid_rsa): #id_rsaというファイル名でよければそのままEnter\nEnter passphrase (empty for no passphrase): 　#パースフレーズを設定する場合は入力。なければEnter\nEnter same passphrase again:\n",[194,1378,1376],{"__ignoreMap":196},[13,1380,1381],{},"これで秘密鍵と公開鍵が生成されます。秘密鍵をクライアントに置いておき、公開鍵をサーバに転送します。",[187,1383,1386],{"className":1384,"code":1385,"language":192},[190],"scp .\u002Fid_rsa.pub develop@123.456.78.902:~\u002F\n",[194,1387,1385],{"__ignoreMap":196},[13,1389,1390,1391,1394],{},"サーバー側に戻ります。developのホームディレクトリに",[194,1392,1393],{},".ssh","というディレクトリがあるかを確認します。",[187,1396,1399],{"className":1397,"code":1398,"language":192},[190],"$ ls -a ~\u002F\n",[194,1400,1398],{"__ignoreMap":196},[13,1402,1403,1405,1406,1409],{},[194,1404,1393],{},"は隠しフォルダなので",[194,1407,1408],{},"ls -a","を使用します。無い場合はディレクトリを作成します。今回は無かったとしましょう。",[187,1411,1414],{"className":1412,"code":1413,"language":192},[190],"$ mkdir ~\u002F.ssh\n$ chmod 700 ~\u002F.ssh \n",[194,1415,1413],{"__ignoreMap":196},[13,1417,1418,1420,1421,1423],{},[194,1419,1393],{},"は権限を700にしましょう。そうで無いと権限エラーによってdevelopに対するsshを行うことができません。そしてクライアントから転送された公開側の名前を変更して",[194,1422,1393],{},"配下に置いておきます。",[187,1425,1428],{"className":1426,"code":1427,"language":192},[190],"$ cp ~\u002Fid_rsa.pub ~\u002F.ssh\u002Fauthorized_keys\n$ chmod 600 ~\u002F.ssh\u002Fauthorized_keys\n$ rm ~\u002Fid_rsa.pub\n",[194,1429,1427],{"__ignoreMap":196},[13,1431,1432,1433,1436],{},"ここでも",[194,1434,1435],{},"authorized_keys","は600権限を付けないと使用できません。",[1204,1438,1440,1443,1452],{"className":1439},[1207,1243],[13,1441,1442],{},"authorized_keysにリネームする理由",[13,1444,1445,1446,1451],{},"The authorized_keys file in SSH specifies the SSH keys that can be used for logging into the user account for which the file is configured.(",[787,1447,1450],{"target":1448,"href":1449},"_blank","https:\u002F\u002Fwww.ssh.com\u002Facademy\u002Fssh\u002Fauthorized-keys-file#:~:text=The%20authorized_keys%20file%20in%20SSH,keys%20and%20needs%20proper%20management.","参照",")",[13,1453,1454],{},"authorized_keysファイルはその公開鍵に紐づく秘密鍵を用いてログインできるユーザーを特定します。簡単な話、authorized_keysにしておけばsshが自動的に鍵を判別してくれるのでその名前にしておく。",[13,1456,1457],{},"これでdevelopは鍵認証を用いてログインできる様になりました。",[71,1459,1460],{"id":1460},"rootのリモートログインとパスワード認証を禁止にする",[13,1462,1463,1464,1467],{},"developで鍵認証で接続できることを確認したら次はrootのリモートログインとパスワード認証を禁止にします。",[194,1465,1466],{},"\u002Fetc\u002Fssh\u002Fsshd_config","を編集していきます。",[187,1469,1472],{"className":1470,"code":1471,"language":192},[190],"# vi \u002Fetc\u002Fssh\u002Fsshd_config\n\n---------- 以下行を追加 -----------\nPermitRootLogin no\n---------- 以上行を追加 -----------\n\n--------------以下を変更--------------\nPasswordAuthentication yes\n#RSAAuthentication yes\n#PubkeyAuthentication yes\n--------------↓--------------\nPasswordAuthentication no\nRSAAuthentication yes\nPubkeyAuthentication yes\n------------------------------------------\n",[194,1473,1471],{"__ignoreMap":196},[13,1475,1476,1479,1480,1483,1484,1487,1488,1491],{},[194,1477,1478],{},"PermitRootLogin no","という記述をつけます。名の通りルートのログインを禁止にさせました。そして",[194,1481,1482],{},"PasswordAuthentication no","としパスワード認証を禁止。",[194,1485,1486],{},"RSAAuthentication yes","と",[194,1489,1490],{},"PubkeyAuthentication yes","のコメントアウトを外して鍵認証のみでつなげる様に明示的に設定します。",[13,1493,1494],{},"これであとはsshdをリスタートさせれば反映させます。",[187,1496,1499],{"className":1497,"code":1498,"language":192},[190],"# systemctl restart sshd\n",[194,1500,1498],{"__ignoreMap":196},[13,1502,1503],{},"試しにチェックしましょう。",[187,1505,1508],{"className":1506,"code":1507,"language":192},[190],"ssh root@xxx.xxx.xxx\nroot@xxx.xxx.xxx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).\n\nssh develop@xxx.xxx.xxx\ndevelop@xxx.xxx.xxx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).\n",[194,1509,1507],{"__ignoreMap":196},[13,1511,1512],{},"OKです。逆にdevelopで鍵認証で接続したのに弾かれたら設定をミスっています。",[1204,1514,1517],{"className":1515},[1207,1516],"alert-danger","\n接続系を設定するときは2つのターミナルタブを開いていておき、片方はずっとroot化できる状態でサーバーにログインしておき、片方で接続テストをしましょう。もし失敗してどのユーザー・方法でも接続できなくなると二度とサーバーに接続できなくなります。\n",[71,1519,1520],{"id":1520},"sshの接続ポートを変更する",[13,1522,1523],{},"sshはデフォルトで22のポートで接続します。しかしこのポートはwell-knownポートとして知られており、攻撃者もデフォルトのポートを狙ってきます。そこでsshのポートを変更してさらに攻撃されにくくします。sshに接続するためにはユーザー名、鍵・パスワード、ポートが合わないといけないからです。",[13,1525,1526],{},"まずはsshdのデフォルトポートを変更します。変更するポート番号は49513～65535あたりから自由に設定しましょう。",[187,1528,1531],{"className":1529,"code":1530,"language":192},[190],"# vi \u002Fetc\u002Fssh\u002Fsshd_config\n--------------以下を変更--------------\n#Port 22    \n--------------↓--------------\nPort 49510\n------------------------------------------\n",[194,1532,1530],{"__ignoreMap":196},[13,1534,1535],{},"そしてfirewallが有効な場合、sshによる22は許可していてもカスタムしたポートは許可していないことがあります。これではカスタムポートへ接続する前にfirewallで弾かれるので設定します。",[13,1537,1538],{},"まずはsshdのfirewallの設定ファイルをコピーします。",[187,1540,1543],{"className":1541,"code":1542,"language":192},[190],"cp \u002Fusr\u002Flib\u002Ffirewalld\u002Fservices\u002Fssh.xml \u002Fetc\u002Ffirewalld\u002Fservices\u002F\n",[194,1544,1542],{"__ignoreMap":196},[13,1546,1547,1550,1551,1554],{},[194,1548,1549],{},"\u002Fetc\u002Ffirewalld\u002Fservices\u002F","にて追加の設定を行うことができます。コピーした",[194,1552,1553],{},"ssh.xml","を編集します。",[187,1556,1559],{"className":1557,"code":1558,"language":192},[190],"# vi \u002Fetc\u002Ffirewalld\u002Fservices\u002F\n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n  \u003Cservice>\n    \u003Cshort>SSH\u003C\u002Fshort>\n    \u003Cdescription>Secure Shell (SSH) is a protocol ...\u003C\u002Fdescription>\n    \u003Cport protocol=\"tcp\" port=\"22\"\u002F>\n    \u003Cport protocol=\"tcp\" port=\"49510\"\u002F> # 追加\n\u003C\u002Fservice>\n",[194,1560,1558],{"__ignoreMap":196},[13,1562,1563],{},"上記の設定でsshサービスによる49510ポートの接続が許可されました。\nそして設定が終わったらfirewallをリロードします。またsshdも設定を変えたのでリロードします。",[187,1565,1568],{"className":1566,"code":1567,"language":192},[190],"# firewall-cmd --reload\n# systemctl restart sshd\n",[194,1569,1567],{"__ignoreMap":196},[13,1571,1572],{},"これでOKです。ポートをカスタムのものに指定して接続して通れば問題ありません。そして22（デフォルト）で接続して弾かれるかも確認しましょう。",[26,1574,1576],{"id":1575},"以上","以上！",[13,1578,1579],{},"以上がsshの最低限必要な設定です。インフラ系では結構基礎的な内容だそうです。sshは狙われており、適切に設定することで安全に使用することができます。",{"title":196,"searchDepth":557,"depth":557,"links":1581},[1582,1583,1591],{"id":1223,"depth":560,"text":1224},{"id":1251,"depth":560,"text":1251,"children":1584},[1585,1588,1589,1590],{"id":1271,"depth":557,"text":1271,"children":1586},[1587],{"id":1335,"depth":570,"text":1335},{"id":1366,"depth":557,"text":1366},{"id":1460,"depth":557,"text":1460},{"id":1520,"depth":557,"text":1520},{"id":1575,"depth":560,"text":1576},[933],"2021-04-25",{},"\u002Farticles\u002Fvps-ssh-first",{"title":1177,"description":1177},"articles\u002Fvps-ssh-first",[1599,607,608],"security","_mix\u002Fcyber-security-3400657_640.jpg","0p7STSITYfCR0ETcCcYcMeNhmXEtc_cRA-W1MKHcN_8",{"id":1603,"title":1604,"body":1605,"category":1760,"createdAt":1761,"description":1604,"extension":599,"index":600,"meta":1762,"navigation":602,"path":1763,"publish":602,"seo":1764,"series":600,"seriesTitle":600,"stem":1765,"tag":1766,"thumbnail":600,"updatedAt":600,"__hash__":1767},"articles\u002Farticles\u002Fssh-on-xserver.md","XserverでSSH接続を行い、ターミナルで操作する",{"type":10,"value":1606,"toc":1753},[1607,1610,1613,1617,1624,1627,1630,1633,1636,1639,1642,1645,1649,1652,1655,1661,1668,1674,1678,1687,1693,1696,1702,1715,1725,1728,1731,1737,1740,1744,1747,1750],[13,1608,1609],{},"こんにちはJunです。vagrant、Docker、VPSなどを構築しているとわかりますが、レンタルサーバーは手軽に構築できて便利です。エンジニア的には自由に環境を構築できた方がいろんなアプリを作ることができますが、ブログ程度であればXserverで十分です。",[13,1611,1612],{},"DBや細かい設定もGUIで完結できる様になっているので初心者にはもってこいです。しかし私が別で構築しているブログを今管理しているXserverに移行する時、画像やDBが膨大すぎて手動・GUIでは移行に限界がありました。そのためSSHを使用してXserverに繋いてで操作することにしました。今回はその忘備録です。",[26,1614,1616],{"id":1615},"sshを有効にする","SSHを有効にする",[13,1618,1619,1620,1623],{},"「SSHとはなんぞや？」という人は",[787,1621,1622],{"href":603},"こちらの記事","でわかりやすく説明したものがあるのでご覧ください。",[13,1625,1626],{},"最初にXserverでSSH接続を有効にする必要があります。Xserverサーバーパネルにログインして、「SSH設定」という箇所のページを開きます。",[170,1628],{":src":1629,":width":173},"'_mix\u002Fsch-2021-01-11-14.59.00.png'",[13,1631,1632],{},"そこで「変更」をONにして「設定する」をクリック。しますとSSHが有効になります。",[26,1634,1635],{"id":1635},"秘密鍵を生成する",[13,1637,1638],{},"SSHは鍵交換という方法を用いてサーバーへのログインを管理しています。自身のPCからXserverのサーバーへアクセスするには鍵を発行します。「公開鍵認証用鍵ペアの生成」をクリックします。以下の画面が表示されるので、「パスフレーズ」（パスワードの様なもの）を入れて「確認画面」へ進みます。",[170,1640],{":src":1641,":width":173},"'_mix\u002Fsch-2021-01-11-17.43.09.png'",[13,1643,1644],{},"確認が終了すると~~~.keyという拡張子のファイルがダウンロードされます。このファイルは鍵ファイルといい、サーバーの中にアクセスする際に使用されます。",[26,1646,1648],{"id":1647},"sshの設定をする","SSHの設定をする",[13,1650,1651],{},"ここからはローカル（自分のPC）の話になります。SSHでアクセスするために、ローカルでのSSH設定を行います。またローカルにはsshdがあり、今回はMacOSターミナルでの操作を前提としています。",[13,1653,1654],{},"ターミナルを立ち上げ、ひとまずホームディレクトリに移動し、さらにDownloadsへ移動し、先ほどダウンロードしたkeyファイルを見つけます。",[187,1656,1659],{"className":1657,"code":1658,"language":192},[190],"jun@MacBook-Pro % cd ~\njun@MacBook-Pro ~ % cd downloads\njun@MacBook-Pro downloads % ls\n...\nserver.key\n...\n",[194,1660,1658],{"__ignoreMap":196},[13,1662,1663,1664,1667],{},"keyファイルをひとまずホームディレクトリ配下にある",[194,1665,1666],{},".ssh\u002F","へ移動させます。",[187,1669,1672],{"className":1670,"code":1671,"language":192},[190],"jun@MacBook-Pro downloads % mv server.key ~\u002F.ssh\u002F\n",[194,1673,1671],{"__ignoreMap":196},[1204,1675,1677],{"className":1676},[1207,1243],"\nTIPS:\nsshdがある環境ではユーザーごとに.sshというディレクトリが与えられ、そこで個人のssh設定を行います。しかし.sshは隠しファイルなので、ホームディレクトリでlsをしても普通には出てきません。ls -a とすることで隠しファイルを含めて表示させると、.sshというディレクトリを確認できます。\n",[13,1679,1680,1682,1683,1686],{},[194,1681,1393],{},"に移動してkeyを確認。そして権限を変更します。権限を変更しないと ",[194,1684,1685],{},"WARNING: UNPROTECTED PRIVATE KEY FILE!"," と怒られます。",[187,1688,1691],{"className":1689,"code":1690,"language":192},[190],"jun@MacBook-Pro .ssh % ls\nconfig      server.key\n\njun@MacBook-Pro .ssh % chmod 400 server.key\n",[194,1692,1690],{"__ignoreMap":196},[13,1694,1695],{},"これでOKです。lsをした時にconfigというファイルがあったと思います。そのファイルにsshの設定が記述されていますので、以下の様に編集をします。",[187,1697,1700],{"className":1698,"code":1699,"language":192},[190],"jun@MacBook-Pro .ssh % vi config\n\nHost my-site\n HostName svExample.xserver.jp\n Port 10022\n user idName\n IdentitiesOnly yes\n IdentityFile \u002FUsers\u002Fjunjiishii\u002F.ssh\u002Fserver.key\n",[194,1701,1699],{"__ignoreMap":196},[13,1703,1704,1707,1708,1711,1712,1714],{},[194,1705,1706],{},"HostName","はxserverのホスト名を入力し。",[194,1709,1710],{},"user","にはサーバーIDを入力します。",[194,1713,1706],{},"はxserverのサーバーパネルの「サーバー情報」、サーバーIDは「パスワード変更」で確認できます。",[13,1716,1717,1720,1721,1724],{},[194,1718,1719],{},"config","で設定しておくとsshコマンドを打つ時、Hostの名前でつまり、",[194,1722,1723],{},"ssh my-site"," とするだけで設定した値の接続先にsshしてくれます。",[26,1726,1727],{"id":1727},"xserverへsshをする",[13,1729,1730],{},"それではsshを行ってみます。",[187,1732,1735],{"className":1733,"code":1734,"language":192},[190],"ssh my-site\nEnter passphrase for key '\u002FUsers\u002Fjun\u002F.ssh\u002Fjunji1996.key': ＃設定したパースフレーズを入力\n\n#もし、以下の文章が表示されたら yesをおす\nECDSA key fingerprint is SHA256:V0GmZVuUlP6tQw5MYbGelfcq+IQwq\u002F6+HnH1OPAcaLo.\nAre you sure you want to continue connecting (yes\u002Fno\u002F[fingerprint])? yes\n\n[idName@svExample ~]$\n",[194,1736,1734],{"__ignoreMap":196},[13,1738,1739],{},"ターミナルの表記がとなればxserverへ入れて、その中を操作していることを示しており、ログイン成功です。以上がxserverへssh接続する方法です。",[26,1741,1743],{"id":1742},"sshは何がいいの","SSHは何がいいの？",[13,1745,1746],{},"以上がxserverでSSHを行う手順です。",[13,1748,1749],{},"基本的にレンタルサーバーでwordpressを使ってブログを書くぐらいならFTP程度で十分であり、SSHを使うこともないと思います。しかし膨大な量のデータを移行したり、phpmyadmin（データベースの操作ができる）で出力・挿入不可なほどのデータベース移行をする際にはコマンドで打てる環境があるとやりやすいです。",[13,1751,1752],{},"また鍵交換方式は鍵ファイルさえ流出しなければ不正にサーバーに侵入されるリスクがパスワード方式よりも低いです。",{"title":196,"searchDepth":557,"depth":557,"links":1754},[1755,1756,1757,1758,1759],{"id":1615,"depth":560,"text":1616},{"id":1635,"depth":560,"text":1635},{"id":1647,"depth":560,"text":1648},{"id":1727,"depth":560,"text":1727},{"id":1742,"depth":560,"text":1743},[933],"2021-01-11",{},"\u002Farticles\u002Fssh-on-xserver",{"title":1604,"description":1604},"articles\u002Fssh-on-xserver",[608,607],"rRtfurJyt2-gDA2kIQLYcHALvE4zCwVc87qoUW28CXY",{"id":1769,"title":1770,"body":1771,"category":1871,"createdAt":1872,"description":1770,"extension":599,"index":600,"meta":1873,"navigation":602,"path":1874,"publish":602,"seo":1875,"series":600,"seriesTitle":600,"stem":1876,"tag":1877,"thumbnail":600,"updatedAt":600,"__hash__":1878},"articles\u002Farticles\u002Fie-check-for-mac.md","IEチェックなどに！MacのlocalhostをWindowsで開く（アクセス）する方法。",{"type":10,"value":1772,"toc":1865},[1773,1776,1779,1782,1785,1792,1795,1798,1801,1804,1807,1811,1814,1817,1820,1828,1831,1838,1846,1849,1852,1856,1859,1862],[13,1774,1775],{},"こんにちはjunです。IE対策してますか？まあ私はIE大嫌いですけど要件に入っているならば、対策は必須です。最近はIE11まででいいよ。という空気が漂っているので昔よりは対策はしやすいですが、やっぱり思うようなレイアウトにならいことが多いです。",[13,1777,1778],{},"そしてIEの厄介な点としてwindows環境でしか動かないという点です。web系のデザイナーしかり、エンジニアは環境構築の手間や情報量、性能からみてMacを使う人が多いです。私もMacを使用して開発しています。そのため、MacだとIEチェックが非常に面倒になります。",[13,1780,1781],{},"GitとかでWindows機にローカルリポジトリを置いてもいいのですが、やっぱり面倒です。できたら開発しながらリアルタイムで確認したいので、MacのlocalhostをWindowsで見れるようにする方法で解決します。",[26,1783,1784],{"id":1784},"macの設定を変更",[13,1786,1787,1788,1791],{},"まずlocalhostを他のPCでも共有できるようにするためには、WindowsとMacが同じ ",[35,1789,1790],{},"LAN内にいるという条件"," があります。つまり同じWi-Fiを使用するということです。",[13,1793,1794],{},"互いに同じLANでつながっていることを確認したら、「システム環境設定」＞「共有」に進みます。",[13,1796,1797],{},"「共有」のなかに「インターネット共有」という欄がありますので、クリックします。",[170,1799],{":src":1800,":width":173},"'_mix\u002Flan-setting-on-mac.png'",[13,1802,1803],{},"そして「共有する接続経路」がWi-Fiであることを確認。違っていたらプルダウンから選びます。確認後、「インターネット共有」の左のチェックボックスをクリックして有効化します。",[13,1805,1806],{},"これでMac側の準備は完了です。",[26,1808,1810],{"id":1809},"windowsから早速接続","Windowsから早速接続",[13,1812,1813],{},"ではWindowsから接続するにはどうすればいいのか？上記の図のここに注目します。",[170,1815],{":src":1816,":width":173},"'_mix\u002Fscreen-2020-07-19-21.38.57-768x146.png'",[13,1818,1819],{},"そうです。「次のアドレスで〜〜」という所の「MacBook-Pro.local」をドメインのようにしてアクセスします。ここの名前は変えられるので複数人LAN内にいる場合などは変えるといいでしょう。",[13,1821,1822,1823],{},"実際に接続するときは「",[787,1824,1827],{"href":1825,"rel":1826},"http:\u002F\u002Fmacbook-pro.local%E3%80%8D%E3%81%A8%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%8B%E3%82%89%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82%EF%BC%88%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%83%A8%E5%88%86%E3%81%AE%E5%A4%A7%E6%96%87%E5%AD%97%E3%81%AF%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%B0%8F%E6%96%87%E5%AD%97%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%EF%BC%89",[791],"http:\u002F\u002Fmacbook-pro.local」とブラウザから接続しましょう。（ドメイン部分の大文字は自動的に小文字になります。）",[26,1829,1830],{"id":1830},"実際に確認してみる",[13,1832,1833,1834,1837],{},"MAMPに",[194,1835,1836],{},"connecttest","というディレクトリを作成しておき、その中にindex.htmlを作成しておきます。htmlを開くと「Connection succeed!」という文章が出てきます。",[13,1839,1840,1841,1845],{},"忌まわしきIEを開いて上記の自分のMacを指すドメイン名を入力しましょう。MAMP上にあるので",[787,1842,1843],{"href":1843,"rel":1844},"http:\u002F\u002Fmacbook-pro.local:8888",[791]," とコロン（：）とデフォルトのポート8888に接続します。",[170,1847],{":src":1848,":width":173},"'_mix\u002Fscreenshot-60-1-768x512.png'",[170,1850],{":src":1851,":width":173},"'_mix\u002Fsh-61-768x512.png'",[26,1853,1855],{"id":1854},"mac内にieを入れるのは面倒","Mac内にIEを入れるのは面倒",[13,1857,1858],{},"以上がwindowsにMacを接続する方法です。めちゃくちゃ簡単なので早速やってみましょう。",[13,1860,1861],{},"この方法の場合、MacとWindows両方持っている人専用になります。一応Mac内にIE（Windows環境）を構築することはVirtual boxを用いて行うことができます。しかし、MacでWindowsOSを稼働させるのでパフォーマンスが遅く、また構築も非常に面倒です。",[13,1863,1864],{},"IEのためにWindowsを買うのも馬鹿らしいですが、会社とかでIE確認用のWindowsを持っていてもいいかもしれませんね",{"title":196,"searchDepth":557,"depth":557,"links":1866},[1867,1868,1869,1870],{"id":1784,"depth":560,"text":1784},{"id":1809,"depth":560,"text":1810},{"id":1830,"depth":560,"text":1830},{"id":1854,"depth":560,"text":1855},[933],"2020-07-19",{},"\u002Farticles\u002Fie-check-for-mac",{"title":1770,"description":1770},"articles\u002Fie-check-for-mac",[608],"K4ZixH0MRLLn2UJckWs_1Z9fmXvYqfxU3inpOS3CMmk",1780987137017]